Skip to content

Commit

Permalink
!208 Fixes CVE-2024-5535 on master
Browse files Browse the repository at this point in the history
Merge pull request !208 from hhhFun/master
  • Loading branch information
openharmony_ci authored and gitee-org committed Jul 4, 2024
2 parents b103109 + 12cd9bd commit 30dd000
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 25 deletions.
63 changes: 40 additions & 23 deletions ssl/ssl_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -2937,37 +2937,54 @@ int SSL_select_next_proto(unsigned char **out, unsigned char *outlen,
unsigned int server_len,
const unsigned char *client, unsigned int client_len)
{
unsigned int i, j;
const unsigned char *result;
int status = OPENSSL_NPN_UNSUPPORTED;
PACKET cpkt, csubpkt, spkt, ssubpkt;

if (!PACKET_buf_init(&cpkt, client, client_len)
|| !PACKET_get_length_prefixed_1(&cpkt, &csubpkt)
|| PACKET_remaining(&csubpkt) == 0) {
*out = NULL;
*outlen = 0;
return OPENSSL_NPN_NO_OVERLAP;
}

/*
* Set the default opportunistic protocol. Will be overwritten if we find
* a match.
*/
*out = (unsigned char *)PACKET_data(&csubpkt);
*outlen = (unsigned char)PACKET_remaining(&csubpkt);

/*
* For each protocol in server preference order, see if we support it.
*/
for (i = 0; i < server_len;) {
for (j = 0; j < client_len;) {
if (server[i] == client[j] &&
memcmp(&server[i + 1], &client[j + 1], server[i]) == 0) {
/* We found a match */
result = &server[i];
status = OPENSSL_NPN_NEGOTIATED;
goto found;
if (PACKET_buf_init(&spkt, server, server_len)) {
while (PACKET_get_length_prefixed_1(&spkt, &ssubpkt)) {
if (PACKET_remaining(&ssubpkt) == 0)
continue; /* Invalid - ignore it */
if (PACKET_buf_init(&cpkt, client, client_len)) {
while (PACKET_get_length_prefixed_1(&cpkt, &csubpkt)) {
if (PACKET_equal(&csubpkt, PACKET_data(&ssubpkt),
PACKET_remaining(&ssubpkt))) {
/* We found a match */
*out = (unsigned char *)PACKET_data(&ssubpkt);
*outlen = (unsigned char)PACKET_remaining(&ssubpkt);
return OPENSSL_NPN_NEGOTIATED;
}
}
/* Ignore spurious trailing bytes in the client list */
} else {
/* This should never happen */
return OPENSSL_NPN_NO_OVERLAP;
}
j += client[j];
j++;
}
i += server[i];
i++;
/* Ignore spurious trailing bytes in the server list */
}

/* There's no overlap between our protocols and the server's list. */
result = client;
status = OPENSSL_NPN_NO_OVERLAP;

found:
*out = (unsigned char *)result + 1;
*outlen = result[0];
return status;
/*
* There's no overlap between our protocols and the server's list. We use
* the default opportunistic protocol selected earlier
*/
return OPENSSL_NPN_NO_OVERLAP;
}

#ifndef OPENSSL_NO_NEXTPROTONEG
Expand Down
27 changes: 26 additions & 1 deletion ssl/statem/extensions_clnt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1536,7 +1536,8 @@ int tls_parse_stoc_npn(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
PACKET_data(pkt),
PACKET_remaining(pkt),
s->ctx->ext.npn_select_cb_arg) !=
SSL_TLSEXT_ERR_OK) {
SSL_TLSEXT_ERR_OK
|| selected_len == 0) {
SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_R_BAD_EXTENSION);
return 0;
}
Expand Down Expand Up @@ -1565,6 +1566,8 @@ int tls_parse_stoc_alpn(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
size_t chainidx)
{
size_t len;
PACKET confpkt, protpkt;
int valid = 0;

/* We must have requested it. */
if (!s->s3.alpn_sent) {
Expand All @@ -1583,6 +1586,28 @@ int tls_parse_stoc_alpn(SSL *s, PACKET *pkt, unsigned int context, X509 *x,
SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
return 0;
}

/* It must be a protocol that we sent */
if (!PACKET_buf_init(&confpkt, s->ext.alpn, s->ext.alpn_len)) {
SSLfatal(s, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);
return 0;
}
while (PACKET_get_length_prefixed_1(&confpkt, &protpkt)) {
if (PACKET_remaining(&protpkt) != len)
continue;
if (memcmp(PACKET_data(pkt), PACKET_data(&protpkt), len) == 0) {
/* Valid protocol found */
valid = 1;
break;
}
}

if (!valid) {
/* The protocol sent from the server does not match one we advertised */
SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_R_BAD_EXTENSION);
return 0;
}

OPENSSL_free(s->s3.alpn_selected);
s->s3.alpn_selected = OPENSSL_malloc(len);
if (s->s3.alpn_selected == NULL) {
Expand Down
3 changes: 2 additions & 1 deletion ssl/statem/extensions_srvr.c
Original file line number Diff line number Diff line change
Expand Up @@ -1471,9 +1471,10 @@ EXT_RETURN tls_construct_stoc_next_proto_neg(SSL *s, WPACKET *pkt,
return EXT_RETURN_FAIL;
}
s->s3.npn_seen = 1;
return EXT_RETURN_SENT;
}

return EXT_RETURN_SENT;
return EXT_RETURN_NOT_SENT;
}
#endif

Expand Down

0 comments on commit 30dd000

Please sign in to comment.