app-layer-ssl: fix use-after-free (CID 14336229)

Nullify JA3 buffer on free to avoid use-after-free vulnerability.
pull/3321/head
Mats Klepsland 8 years ago committed by Victor Julien
parent 3b474ac599
commit fc0e339467

@ -650,7 +650,7 @@ static inline int TLSDecodeHSHelloCipherSuites(SSLState *ssl_state,
while (processed_len < cipher_suites_length) while (processed_len < cipher_suites_length)
{ {
if (!(HAS_SPACE(2))) { if (!(HAS_SPACE(2))) {
Ja3BufferFree(ja3_cipher_suites); Ja3BufferFree(&ja3_cipher_suites);
goto invalid_length; goto invalid_length;
} }
@ -660,7 +660,7 @@ static inline int TLSDecodeHSHelloCipherSuites(SSLState *ssl_state,
if (TLSDecodeValueIsGREASE(cipher_suite) != 1) { if (TLSDecodeValueIsGREASE(cipher_suite) != 1) {
rc = Ja3BufferAddValue(ja3_cipher_suites, cipher_suite); rc = Ja3BufferAddValue(ja3_cipher_suites, cipher_suite);
if (rc != 0) { if (rc != 0) {
Ja3BufferFree(ja3_cipher_suites); Ja3BufferFree(&ja3_cipher_suites);
return -1; return -1;
} }
} }
@ -1034,11 +1034,11 @@ invalid_length:
error: error:
if (ja3_extensions != NULL) if (ja3_extensions != NULL)
Ja3BufferFree(ja3_extensions); Ja3BufferFree(&ja3_extensions);
if (ja3_elliptic_curves != NULL) if (ja3_elliptic_curves != NULL)
Ja3BufferFree(ja3_elliptic_curves); Ja3BufferFree(&ja3_elliptic_curves);
if (ja3_elliptic_curves_pf != NULL) if (ja3_elliptic_curves_pf != NULL)
Ja3BufferFree(ja3_elliptic_curves_pf); Ja3BufferFree(&ja3_elliptic_curves_pf);
return -1; return -1;
} }
@ -2299,7 +2299,7 @@ static void SSLStateFree(void *p)
SCFree(ssl_state->server_connp.sni); SCFree(ssl_state->server_connp.sni);
if (ssl_state->ja3_str) if (ssl_state->ja3_str)
Ja3BufferFree(ssl_state->ja3_str); Ja3BufferFree(&ssl_state->ja3_str);
if (ssl_state->ja3_hash) if (ssl_state->ja3_hash)
SCFree(ssl_state->ja3_hash); SCFree(ssl_state->ja3_hash);

@ -50,15 +50,17 @@ JA3Buffer *Ja3BufferInit(void)
* *
* \param buffer The buffer to free. * \param buffer The buffer to free.
*/ */
void Ja3BufferFree(JA3Buffer *buffer) void Ja3BufferFree(JA3Buffer **buffer)
{ {
DEBUG_VALIDATE_BUG_ON(buffer == NULL); DEBUG_VALIDATE_BUG_ON(*buffer == NULL);
if (buffer->data != NULL) { if ((*buffer)->data != NULL) {
SCFree(buffer->data); SCFree((*buffer)->data);
(*buffer)->data = NULL;
} }
SCFree(buffer); SCFree(*buffer);
*buffer = NULL;
} }
/** /**
@ -123,8 +125,8 @@ int Ja3BufferAppendBuffer(JA3Buffer *buffer1, JA3Buffer *buffer2)
int rc = Ja3BufferResizeIfFull(buffer1, buffer2->used); int rc = Ja3BufferResizeIfFull(buffer1, buffer2->used);
if (rc != 0) { if (rc != 0) {
Ja3BufferFree(buffer1); Ja3BufferFree(&buffer1);
Ja3BufferFree(buffer2); Ja3BufferFree(&buffer2);
return -1; return -1;
} }
@ -136,7 +138,7 @@ int Ja3BufferAppendBuffer(JA3Buffer *buffer1, JA3Buffer *buffer2)
buffer1->used, ",%s", buffer2->data); buffer1->used, ",%s", buffer2->data);
} }
Ja3BufferFree(buffer2); Ja3BufferFree(&buffer2);
return 0; return 0;
} }
@ -179,7 +181,7 @@ int Ja3BufferAddValue(JA3Buffer *buffer, uint32_t value)
if (buffer->data == NULL) { if (buffer->data == NULL) {
SCLogError(SC_ERR_MEM_ALLOC, SCLogError(SC_ERR_MEM_ALLOC,
"Error allocating memory for JA3 data"); "Error allocating memory for JA3 data");
Ja3BufferFree(buffer); Ja3BufferFree(&buffer);
return -1; return -1;
} }
buffer->size = JA3_BUFFER_INITIAL_SIZE; buffer->size = JA3_BUFFER_INITIAL_SIZE;
@ -189,7 +191,7 @@ int Ja3BufferAddValue(JA3Buffer *buffer, uint32_t value)
int rc = Ja3BufferResizeIfFull(buffer, value_len); int rc = Ja3BufferResizeIfFull(buffer, value_len);
if (rc != 0) { if (rc != 0) {
Ja3BufferFree(buffer); Ja3BufferFree(&buffer);
return -1; return -1;
} }

@ -33,7 +33,7 @@ typedef struct JA3Buffer_ {
} JA3Buffer; } JA3Buffer;
JA3Buffer *Ja3BufferInit(void); JA3Buffer *Ja3BufferInit(void);
void Ja3BufferFree(JA3Buffer *); void Ja3BufferFree(JA3Buffer **);
int Ja3BufferAppendBuffer(JA3Buffer *, JA3Buffer *); int Ja3BufferAppendBuffer(JA3Buffer *, JA3Buffer *);
int Ja3BufferAddValue(JA3Buffer *, uint32_t); int Ja3BufferAddValue(JA3Buffer *, uint32_t);
char *Ja3GenerateHash(JA3Buffer *); char *Ja3GenerateHash(JA3Buffer *);

Loading…
Cancel
Save