tls: JA3 buffer pointers on allocation failure

Improper pointer handling would leave dangling pointers after allocation
failure that could get freed again (double free).

Ticket: #8857.
pull/16192/head
Victor Julien 1 month ago
parent 8e4d49df0d
commit 201ecd5618

@ -1044,9 +1044,8 @@ invalid_length:
} }
static inline int TLSDecodeHSHelloExtensionEllipticCurves(SSLState *ssl_state, static inline int TLSDecodeHSHelloExtensionEllipticCurves(SSLState *ssl_state,
const uint8_t * const initial_input, const uint8_t *const initial_input, const uint32_t input_len,
const uint32_t input_len, JA3Buffer **ja3_elliptic_curves)
JA3Buffer *ja3_elliptic_curves)
{ {
const uint8_t *input = initial_input; const uint8_t *input = initial_input;
@ -1063,7 +1062,8 @@ static inline int TLSDecodeHSHelloExtensionEllipticCurves(SSLState *ssl_state,
if (!(HAS_SPACE(elliptic_curves_len))) if (!(HAS_SPACE(elliptic_curves_len)))
goto invalid_length; goto invalid_length;
if ((ssl_state->current_flags & SSL_AL_FLAG_STATE_CLIENT_HELLO) && ja3_elliptic_curves) { if ((ssl_state->current_flags & SSL_AL_FLAG_STATE_CLIENT_HELLO) &&
*ja3_elliptic_curves != NULL) {
uint16_t ec_processed_len = 0; uint16_t ec_processed_len = 0;
/* coverity[tainted_data] */ /* coverity[tainted_data] */
while (ec_processed_len < elliptic_curves_len) while (ec_processed_len < elliptic_curves_len)
@ -1075,8 +1075,7 @@ static inline int TLSDecodeHSHelloExtensionEllipticCurves(SSLState *ssl_state,
input += 2; input += 2;
if (TLSDecodeValueIsGREASE(elliptic_curve) != 1) { if (TLSDecodeValueIsGREASE(elliptic_curve) != 1) {
int rc = Ja3BufferAddValue(&ja3_elliptic_curves, int rc = Ja3BufferAddValue(ja3_elliptic_curves, elliptic_curve);
elliptic_curve);
if (rc != 0) if (rc != 0)
return -1; return -1;
} }
@ -1100,9 +1099,8 @@ invalid_length:
} }
static inline int TLSDecodeHSHelloExtensionEllipticCurvePF(SSLState *ssl_state, static inline int TLSDecodeHSHelloExtensionEllipticCurvePF(SSLState *ssl_state,
const uint8_t * const initial_input, const uint8_t *const initial_input, const uint32_t input_len,
const uint32_t input_len, JA3Buffer **ja3_elliptic_curves_pf)
JA3Buffer *ja3_elliptic_curves_pf)
{ {
const uint8_t *input = initial_input; const uint8_t *input = initial_input;
@ -1119,7 +1117,8 @@ static inline int TLSDecodeHSHelloExtensionEllipticCurvePF(SSLState *ssl_state,
if (!(HAS_SPACE(ec_pf_len))) if (!(HAS_SPACE(ec_pf_len)))
goto invalid_length; goto invalid_length;
if ((ssl_state->current_flags & SSL_AL_FLAG_STATE_CLIENT_HELLO) && ja3_elliptic_curves_pf) { if ((ssl_state->current_flags & SSL_AL_FLAG_STATE_CLIENT_HELLO) &&
*ja3_elliptic_curves_pf != NULL) {
uint8_t ec_pf_processed_len = 0; uint8_t ec_pf_processed_len = 0;
/* coverity[tainted_data] */ /* coverity[tainted_data] */
while (ec_pf_processed_len < ec_pf_len) while (ec_pf_processed_len < ec_pf_len)
@ -1128,8 +1127,7 @@ static inline int TLSDecodeHSHelloExtensionEllipticCurvePF(SSLState *ssl_state,
input += 1; input += 1;
if (TLSDecodeValueIsGREASE(elliptic_curve_pf) != 1) { if (TLSDecodeValueIsGREASE(elliptic_curve_pf) != 1) {
int rc = Ja3BufferAddValue(&ja3_elliptic_curves_pf, int rc = Ja3BufferAddValue(ja3_elliptic_curves_pf, elliptic_curve_pf);
elliptic_curve_pf);
if (rc != 0) if (rc != 0)
return -1; return -1;
} }
@ -1328,11 +1326,10 @@ static inline int TLSDecodeHSHelloExtensions(SSLState *ssl_state,
case SSL_EXTENSION_ELLIPTIC_CURVES: case SSL_EXTENSION_ELLIPTIC_CURVES:
{ {
/* coverity[tainted_data] */ /* coverity[tainted_data] */
ret = TLSDecodeHSHelloExtensionEllipticCurves(ssl_state, input, ret = TLSDecodeHSHelloExtensionEllipticCurves(
ext_len, ssl_state, input, ext_len, &ja3_elliptic_curves);
ja3_elliptic_curves);
if (ret < 0) if (ret < 0)
goto end; goto error;
input += ext_len; input += ext_len;
@ -1342,11 +1339,10 @@ static inline int TLSDecodeHSHelloExtensions(SSLState *ssl_state,
case SSL_EXTENSION_EC_POINT_FORMATS: case SSL_EXTENSION_EC_POINT_FORMATS:
{ {
/* coverity[tainted_data] */ /* coverity[tainted_data] */
ret = TLSDecodeHSHelloExtensionEllipticCurvePF(ssl_state, input, ret = TLSDecodeHSHelloExtensionEllipticCurvePF(
ext_len, ssl_state, input, ext_len, &ja3_elliptic_curves_pf);
ja3_elliptic_curves_pf);
if (ret < 0) if (ret < 0)
goto end; goto error;
input += ext_len; input += ext_len;

Loading…
Cancel
Save