Skip to content

Commit 2111249

Browse files
authored
Merge pull request #9759 from gasbytes/test_wolfSSL_d2i_SSL_SESSION
add test for session deserialization input validation
2 parents 10ca06c + 86212fd commit 2111249

1 file changed

Lines changed: 85 additions & 0 deletions

File tree

tests/api.c

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16500,6 +16500,90 @@ static int test_wolfSSL_sigalg_info(void)
1650016500
return EXPECT_RESULT();
1650116501
}
1650216502

16503+
static int test_wolfSSL_d2i_SSL_SESSION_bounds_check(void)
16504+
{
16505+
EXPECT_DECLS;
16506+
#if defined(OPENSSL_EXTRA) && defined(HAVE_EXT_CACHE) && \
16507+
defined(SESSION_CERTS)
16508+
WOLFSSL_SESSION* sess = NULL;
16509+
WOLFSSL_SESSION* restored = NULL;
16510+
unsigned char* sessDer = NULL;
16511+
unsigned char* modData = NULL;
16512+
const unsigned char* ptr = NULL;
16513+
unsigned char* pp = NULL;
16514+
int sz = 0;
16515+
int idx = 0;
16516+
int sessionIDSz = 0;
16517+
int altIDLen = 0;
16518+
int chainOffset = 0;
16519+
int newLen = 0;
16520+
word16 oversized = 0;
16521+
16522+
/* Create and serialize a valid empty session to learn the format */
16523+
ExpectNotNull(sess = wolfSSL_SESSION_new());
16524+
ExpectIntGT((sz = wolfSSL_i2d_SSL_SESSION(sess, NULL)), 0);
16525+
ExpectNotNull(sessDer = (unsigned char*)XMALLOC(sz, NULL,
16526+
DYNAMIC_TYPE_OPENSSL));
16527+
pp = sessDer;
16528+
ExpectIntGT(wolfSSL_i2d_SSL_SESSION(sess, &pp), 0);
16529+
wolfSSL_SESSION_free(sess);
16530+
sess = NULL;
16531+
16532+
/* Calculate offset to chain.count field:
16533+
* side(1) + bornOn(4) + timeout(4) + sessionIDSz(1) + sessionID(var)
16534+
* + masterSecret(SECRET_LEN=48) + haveEMS(1) + altIDLen(1) + altID(var)
16535+
*/
16536+
idx = 1 + 4 + 4;
16537+
if (EXPECT_SUCCESS()) {
16538+
sessionIDSz = sessDer[idx++];
16539+
idx += sessionIDSz + SECRET_LEN + 1;
16540+
altIDLen = sessDer[idx++];
16541+
if (altIDLen == ID_LEN)
16542+
idx += ID_LEN;
16543+
chainOffset = idx;
16544+
}
16545+
16546+
/*
16547+
* The deserialization must reject this with a BUFFER_ERROR (return NULL).
16548+
*/
16549+
newLen = chainOffset + 1 + 50;
16550+
ExpectNotNull(modData = (unsigned char*)XMALLOC(newLen, NULL,
16551+
DYNAMIC_TYPE_TMP_BUFFER));
16552+
if (EXPECT_SUCCESS()) {
16553+
XMEMCPY(modData, sessDer, chainOffset);
16554+
modData[chainOffset] = MAX_CHAIN_DEPTH + 1;
16555+
XMEMSET(modData + chainOffset + 1, 0, newLen - chainOffset - 1);
16556+
}
16557+
ptr = modData;
16558+
ExpectNull(restored = wolfSSL_d2i_SSL_SESSION(NULL, &ptr, (long)newLen));
16559+
XFREE(modData, NULL, DYNAMIC_TYPE_TMP_BUFFER);
16560+
modData = NULL;
16561+
16562+
/*
16563+
* chain.count is valid (1), but the cert length field is too large.
16564+
*/
16565+
newLen = chainOffset + 1 + 2 + 100;
16566+
ExpectNotNull(modData = (unsigned char*)XMALLOC(newLen, NULL,
16567+
DYNAMIC_TYPE_TMP_BUFFER));
16568+
if (EXPECT_SUCCESS()) {
16569+
XMEMCPY(modData, sessDer, chainOffset);
16570+
idx = chainOffset;
16571+
modData[idx++] = 1; /* chain.count = 1 */
16572+
oversized = MAX_X509_SIZE + 1;
16573+
modData[idx++] = (byte)(oversized >> 8);
16574+
modData[idx++] = (byte)(oversized & 0xFF);
16575+
XMEMSET(modData + idx, 0xCC, newLen - idx);
16576+
}
16577+
ptr = modData;
16578+
ExpectNull(restored = wolfSSL_d2i_SSL_SESSION(NULL, &ptr, (long)newLen));
16579+
XFREE(modData, NULL, DYNAMIC_TYPE_TMP_BUFFER);
16580+
modData = NULL;
16581+
16582+
XFREE(sessDer, NULL, DYNAMIC_TYPE_OPENSSL);
16583+
#endif
16584+
return EXPECT_RESULT();
16585+
}
16586+
1650316587
static int test_wolfSSL_SESSION(void)
1650416588
{
1650516589
EXPECT_DECLS;
@@ -32374,6 +32458,7 @@ TEST_CASE testCases[] = {
3237432458
TEST_DECL(test_wolfSSL_ciphersuite_auth),
3237532459
TEST_DECL(test_wolfSSL_sigalg_info),
3237632460
/* Can't memory test as tcp_connect aborts. */
32461+
TEST_DECL(test_wolfSSL_d2i_SSL_SESSION_bounds_check),
3237732462
TEST_DECL(test_wolfSSL_SESSION),
3237832463
TEST_DECL(test_wolfSSL_SESSION_expire_downgrade),
3237932464
TEST_DECL(test_wolfSSL_CTX_sess_set_remove_cb),

0 commit comments

Comments
 (0)