Skip to content

Commit

Permalink
Merge commit from fork
Browse files Browse the repository at this point in the history
Icinga 2.11.12
  • Loading branch information
julianbrost authored Nov 12, 2024
2 parents f6e21d2 + 5cde51c commit 72632dc
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 29 deletions.
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,15 @@ documentation before upgrading to a new release.

Released closed milestones can be found on [GitHub](https://github.com/Icinga/icinga2/milestones?state=closed).

## 2.11.12 (2024-11-12)

This security release fixes a TLS certificate validation bypass.
Given the severity of that issue, users are advised to upgrade all nodes immediately.

* Security: fix TLS certificate validation bypass. CVE-2024-49369
* Security: update OpenSSL shipped on Windows to v3.0.15.
* Windows: sign MSI packages with a certificate the OS trusts by default.

## 2.11.11 (2021-08-19)

The main focus of these versions is a security vulnerability in the TLS certificate verification of our metrics writers ElasticsearchWriter, GelfWriter and InfluxdbWriter.
Expand Down
14 changes: 7 additions & 7 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -517,16 +517,16 @@ if(WIN32)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/NSCP.msi DESTINATION ${CMAKE_INSTALL_SBINDIR})

if (OPENSSL_VERSION_MINOR GREATER_EQUAL 1)
if (CMAKE_VS_PLATFORM_NAME STREQUAL "x64")
list (APPEND ICINGA2_OPENSSL_DLLS ${OPENSSL_INCLUDE_DIR}/../bin/libcrypto-1_1-x64.dll ${OPENSSL_INCLUDE_DIR}/../bin/libssl-1_1-x64.dll)
else()
list (APPEND ICINGA2_OPENSSL_DLLS ${OPENSSL_INCLUDE_DIR}/../bin/libcrypto-1_1.dll ${OPENSSL_INCLUDE_DIR}/../bin/libssl-1_1.dll)
endif()
if (CMAKE_VS_PLATFORM_NAME STREQUAL "x64")
set(ICINGA2_OPENSSL_DLL_ARCH "-x64")
else()
list (APPEND ICINGA2_OPENSSL_DLLS ${OPENSSL_INCLUDE_DIR}/../bin/libeay32.dll ${OPENSSL_INCLUDE_DIR}/../bin/ssleay32.dll)
set(ICINGA2_OPENSSL_DLL_ARCH "")
endif()

foreach(ICINGA2_OPENSSL_LIB crypto ssl)
list(APPEND ICINGA2_OPENSSL_DLLS ${OPENSSL_INCLUDE_DIR}/../bin/lib${ICINGA2_OPENSSL_LIB}-3${ICINGA2_OPENSSL_DLL_ARCH}.dll)
endforeach()

install(
PROGRAMS ${ICINGA2_OPENSSL_DLLS}
DESTINATION ${CMAKE_INSTALL_SBINDIR}
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
Version: 2.11.11
Version: 2.11.12
Revision: 1
2 changes: 1 addition & 1 deletion doc/win-dev.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ function ThrowOnNativeFailure {
$VsVersion = 2019
$MsvcVersion = '14.2'
$BoostVersion = @(1, 71, 0)
$OpensslVersion = '1_1_1k'
$OpensslVersion = '3_0_15'

switch ($Env:BITS) {
32 { }
Expand Down
62 changes: 48 additions & 14 deletions lib/base/tlsstream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,48 @@

using namespace icinga;

bool UnbufferedAsioTlsStream::IsVerifyOK() const
/**
* Checks whether the TLS handshake was completed with a valid peer certificate.
*
* @return true if the peer presented a valid certificate, false otherwise
*/
bool UnbufferedAsioTlsStream::IsVerifyOK()
{
return m_VerifyOK;
if (!SSL_is_init_finished(native_handle())) {
// handshake was not completed
return false;
}

if (GetPeerCertificate() == nullptr) {
// no peer certificate was sent
return false;
}

return SSL_get_verify_result(native_handle()) == X509_V_OK;
}

String UnbufferedAsioTlsStream::GetVerifyError() const
/**
* Returns a human-readable error string for situations where IsVerifyOK() returns false.
*
* If the handshake was completed and a peer certificate was provided,
* the string additionally contains the OpenSSL verification error code.
*
* @return string containing the error message
*/
String UnbufferedAsioTlsStream::GetVerifyError()
{
return m_VerifyError;
if (!SSL_is_init_finished(native_handle())) {
return "handshake not completed";
}

if (GetPeerCertificate() == nullptr) {
return "no peer certificate provided";
}

std::ostringstream buf;
long err = SSL_get_verify_result(native_handle());
buf << "code " << err << ": " << X509_verify_cert_error_string(err);
return buf.str();
}

std::shared_ptr<X509> UnbufferedAsioTlsStream::GetPeerCertificate()
Expand All @@ -43,17 +77,17 @@ void UnbufferedAsioTlsStream::BeforeHandshake(handshake_type type)

set_verify_mode(ssl::verify_peer | ssl::verify_client_once);

set_verify_callback([this](bool preverified, ssl::verify_context& ctx) {
if (!preverified) {
m_VerifyOK = false;

std::ostringstream msgbuf;
int err = X509_STORE_CTX_get_error(ctx.native_handle());

msgbuf << "code " << err << ": " << X509_verify_cert_error_string(err);
m_VerifyError = msgbuf.str();
}
set_verify_callback([](bool preverified, ssl::verify_context& ctx) {
(void) preverified;
(void) ctx;

/* Continue the handshake even if an invalid peer certificate was presented. The verification result has to be
* checked using the IsVerifyOK() method.
*
* Such connections are used for the initial enrollment of nodes where they use a self-signed certificate to
* send a certificate request and receive their valid certificate after approval (manually by the administrator
* or using a certificate ticket).
*/
return true;
});

Expand Down
8 changes: 3 additions & 5 deletions lib/base/tlsstream.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,12 +69,12 @@ class UnbufferedAsioTlsStream : public AsioTcpTlsStream
public:
inline
UnbufferedAsioTlsStream(UnbufferedAsioTlsStreamParams& init)
: AsioTcpTlsStream(init.IoContext, init.SslContext), m_VerifyOK(true), m_Hostname(init.Hostname)
: AsioTcpTlsStream(init.IoContext, init.SslContext), m_Hostname(init.Hostname)
{
}

bool IsVerifyOK() const;
String GetVerifyError() const;
bool IsVerifyOK();
String GetVerifyError();
std::shared_ptr<X509> GetPeerCertificate();

template<class... Args>
Expand All @@ -96,8 +96,6 @@ class UnbufferedAsioTlsStream : public AsioTcpTlsStream
}

private:
bool m_VerifyOK;
String m_VerifyError;
String m_Hostname;

void BeforeHandshake(handshake_type type);
Expand Down
2 changes: 1 addition & 1 deletion tools/win32/configure.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ if (-not (Test-Path env:CMAKE_GENERATOR_PLATFORM)) {
}
}
if (-not (Test-Path env:OPENSSL_ROOT_DIR)) {
$env:OPENSSL_ROOT_DIR = "c:\local\OpenSSL_1_1_1k-Win${env:BITS}"
$env:OPENSSL_ROOT_DIR = "c:\local\OpenSSL_3_0_15-Win${env:BITS}"
}
if (-not (Test-Path env:BOOST_ROOT)) {
$env:BOOST_ROOT = "c:\local\boost_1_71_0-Win${env:BITS}"
Expand Down

0 comments on commit 72632dc

Please sign in to comment.