Skip to content

Commit 85b79c4

Browse files
committed
Rework TLS pretty address handling
Avoid accidental TLS verification passed in ssl_verify_certificate_validity() due to a sockaddr_pretty() failure. Store the prettified string instead of the raw address struct.
1 parent cd3f965 commit 85b79c4

File tree

6 files changed

+21
-18
lines changed

6 files changed

+21
-18
lines changed

src/netlog/netlog-dtls.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ static int dtls_write(DTLSManager *m, const char *buf, size_t count) {
2121

2222
assert(m);
2323
assert(m->ssl);
24+
assert(m->pretty_address);
2425
assert(buf);
2526
assert(count > 0);
2627
assert(count < INT_MAX);
@@ -30,9 +31,9 @@ static int dtls_write(DTLSManager *m, const char *buf, size_t count) {
3031
if (r <= 0) {
3132
int error = SSL_get_error(m->ssl, r);
3233
if (IN_SET(error, SSL_ERROR_WANT_READ, SSL_ERROR_WANT_WRITE))
33-
return log_info_errno(SYNTHETIC_ERRNO(EAGAIN), "DTLS: Failed to invoke SSL_write: %s", TLS_ERROR_STRING(error));
34+
return log_info_errno(SYNTHETIC_ERRNO(EAGAIN), "DTLS: Failed to invoke SSL_write to %s: %s", m->pretty_address, TLS_ERROR_STRING(error));
3435
else
35-
return log_error_errno(SYNTHETIC_ERRNO(EPIPE), "DTLS: Failed to invoke SSL_write: %s", TLS_ERROR_STRING(error));
36+
return log_error_errno(SYNTHETIC_ERRNO(EPIPE), "DTLS: Failed to invoke SSL_write to %s: %s", m->pretty_address, TLS_ERROR_STRING(error));
3637
}
3738

3839
return log_debug("DTLS: Successful SSL_write: %d bytes", r);
@@ -120,8 +121,8 @@ int dtls_connect(DTLSManager *m, SocketAddress *address) {
120121
if (m->auth_mode != OPEN_SSL_CERTIFICATE_AUTH_MODE_NONE && m->auth_mode != OPEN_SSL_CERTIFICATE_AUTH_MODE_INVALID) {
121122
log_debug("DTLS: enable certificate verification");
122123

123-
SSL_set_ex_data(ssl, 0, m);
124-
SSL_set_ex_data(ssl, 1, address);
124+
SSL_set_ex_data(ssl, EX_DATA_TLSMANAGER, m);
125+
SSL_set_ex_data(ssl, EX_DATA_PRETTYADDRESS, pretty);
125126
SSL_set_verify(ssl, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, ssl_verify_certificate_validity);
126127
} else {
127128
log_debug("DTLS: disable certificate verification");
@@ -158,6 +159,7 @@ int dtls_connect(DTLSManager *m, SocketAddress *address) {
158159

159160
m->ssl = TAKE_PTR(ssl);
160161
m->fd = TAKE_FD(fd);
162+
m->pretty_address = TAKE_PTR(pretty);
161163

162164
m->connected = true;
163165
return 0;
@@ -175,6 +177,7 @@ void dtls_disconnect(DTLSManager *m) {
175177
m->ssl = NULL;
176178
}
177179

180+
m->pretty_address = mfree(m->pretty_address);
178181
m->fd = safe_close(m->fd);
179182
m->connected = false;
180183
}

src/netlog/netlog-dtls.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ struct DTLSManager {
1414
SSL_CTX *ctx;
1515
SSL *ssl;
1616

17+
char *pretty_address;
1718
int fd;
1819
bool connected;
1920

src/netlog/netlog-ssl.c

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,17 @@
1010

1111
int ssl_verify_certificate_validity(int s, X509_STORE_CTX *store) {
1212
SSL* ssl = X509_STORE_CTX_get_ex_data(store, SSL_get_ex_data_X509_STORE_CTX_idx());
13-
SocketAddress *address = (SocketAddress *) SSL_get_ex_data(ssl, 1);
13+
const char *pretty = (const char *) SSL_get_ex_data(ssl, EX_DATA_PRETTYADDRESS);
1414
_cleanup_(OPENSSL_freep) void *subject = NULL, *issuer = NULL;
15-
TLSManager *m = (TLSManager *) SSL_get_ex_data(ssl, 0);
15+
TLSManager *m = (TLSManager *) SSL_get_ex_data(ssl, EX_DATA_TLSMANAGER);
1616
X509 *cert = X509_STORE_CTX_get_current_cert(store);
1717
int depth = X509_STORE_CTX_get_error_depth(store);
1818
int error = X509_STORE_CTX_get_error(store);
1919
int verify_mode = SSL_get_verify_mode(ssl);
20-
_cleanup_free_ char *pretty = NULL;
21-
union sockaddr_union sa;
22-
int r;
2320
long rc;
2421

2522
assert(store);
2623

27-
r = sockaddr_pretty(&address->sockaddr.sa, address->sockaddr.sa.sa_family == AF_INET ?
28-
sizeof(sa.in) : sizeof(sa.in6), true, true, &pretty);
29-
if (r < 0)
30-
return r;
31-
3224
log_debug("TLS: Verifying SSL certificates of server: %s", pretty);
3325

3426
if (cert) {

src/netlog/netlog-ssl.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55

66
#include "macro.h"
77

8+
#define EX_DATA_TLSMANAGER 0
9+
#define EX_DATA_PRETTYADDRESS 1
10+
811
int ssl_verify_certificate_validity(int status, X509_STORE_CTX *store);
912

1013
DEFINE_TRIVIAL_CLEANUP_FUNC(SSL_CTX*, SSL_CTX_free);

src/netlog/netlog-tls.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ static int tls_write(TLSManager *m, const char *buf, size_t count) {
3131

3232
assert(m);
3333
assert(m->ssl);
34+
assert(m->pretty_address);
3435
assert(buf);
3536
assert(count > 0);
3637
assert(count < INT_MAX);
@@ -40,9 +41,9 @@ static int tls_write(TLSManager *m, const char *buf, size_t count) {
4041
if (r <= 0) {
4142
int error = SSL_get_error(m->ssl, r);
4243
if (IN_SET(error, SSL_ERROR_WANT_READ, SSL_ERROR_WANT_WRITE))
43-
return log_info_errno(SYNTHETIC_ERRNO(EAGAIN), "TLS: Failed to invoke SSL_write: %s", TLS_ERROR_STRING(error));
44+
return log_info_errno(SYNTHETIC_ERRNO(EAGAIN), "TLS: Failed to invoke SSL_write to %s: %s", m->pretty_address, TLS_ERROR_STRING(error));
4445
else
45-
return log_error_errno(SYNTHETIC_ERRNO(EPIPE), "TLS: Failed to invoke SSL_write: %s", TLS_ERROR_STRING(error));
46+
return log_error_errno(SYNTHETIC_ERRNO(EPIPE), "TLS: Failed to invoke SSL_write to %s: %s", m->pretty_address, TLS_ERROR_STRING(error));
4647
}
4748

4849
return log_debug("TLS: Successful TLS SSL_write: %d bytes", r);
@@ -119,8 +120,8 @@ int tls_connect(TLSManager *m, SocketAddress *address) {
119120
if (m->auth_mode != OPEN_SSL_CERTIFICATE_AUTH_MODE_NONE && m->auth_mode != OPEN_SSL_CERTIFICATE_AUTH_MODE_INVALID) {
120121
log_debug("TLS: enable certificate verification");
121122

122-
SSL_set_ex_data(ssl, 0, m);
123-
SSL_set_ex_data(ssl, 1, address);
123+
SSL_set_ex_data(ssl, EX_DATA_TLSMANAGER, m);
124+
SSL_set_ex_data(ssl, EX_DATA_PRETTYADDRESS, pretty);
124125

125126
SSL_set_verify(ssl, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, ssl_verify_certificate_validity);
126127
} else {
@@ -158,6 +159,7 @@ int tls_connect(TLSManager *m, SocketAddress *address) {
158159

159160
m->ssl = TAKE_PTR(ssl);
160161
m->fd = TAKE_FD(fd);
162+
m->pretty_address = TAKE_PTR(pretty);
161163

162164
m->connected = true;
163165
return 0;
@@ -175,6 +177,7 @@ void tls_disconnect(TLSManager *m) {
175177
m->ssl = NULL;
176178
}
177179

180+
m->pretty_address = mfree(m->pretty_address);
178181
m->fd = safe_close(m->fd);
179182
m->connected = false;
180183
}

src/netlog/netlog-tls.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ struct TLSManager {
2222
SSL_CTX *ctx;
2323
SSL *ssl;
2424

25+
char *pretty_address;
2526
int fd;
2627

2728
bool connected;

0 commit comments

Comments
 (0)