Add ALPN validation in the client
The ALPN protocol selected by the server must be one that we originally advertised. We should verify that it is. Follow on from CVE-2024-5535 Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Neil Horman <nhorman@openssl.org> (Merged from https://github.com/openssl/openssl/pull/24716)
This commit is contained in:
parent
e10a3a84bf
commit
238fa464d6
1 changed files with 24 additions and 0 deletions
|
@ -1628,6 +1628,8 @@ int tls_parse_stoc_alpn(SSL_CONNECTION *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) {
|
||||
|
@ -1646,6 +1648,28 @@ int tls_parse_stoc_alpn(SSL_CONNECTION *s, PACKET *pkt, unsigned int context,
|
|||
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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue