Integer Overflow in /src/htntlm.c (version<=2.4.24)
Brought to you by:
ia97lies
An Integer Overflow was found in /src/htntlm.c (version<=2.4.24), which will lead to a buffer-over-write.
./htntlm -w -t 2 -T `python -c "print 'a'*0x8000"` -D `python -c "print 'a'*0x4000"`
Output:
Segmentation Fault
The program crash at function write_type2_msg:
len16 = handle_unicode(hook, &tmp, hook->target); *((uint16_t *)&msg[12]) = ntlm_hton16(len16); *((uint16_t *)&msg[14]) = ntlm_hton16(len16); *((uint32_t *)&msg[16]) = ntlm_hton32(48 + offset); memcpy(&msg[48 + offset], tmp, len16);
msg is apr_pcalloc at:
if (tlen16) { /* target info termination */ tlen16 += 4; } len += tlen16; /* allocate message initialize with zeros*/ msg = apr_pcalloc(hook->pool, len);
and uint16_t tlen16 is calc by:
if (hook->target) { tlen16 += handle_unicode(hook, NULL, hook->target); } if (hook->domain) { tlen16 += 4 + to_unicode(hook->pool, NULL, hook->domain); } if (hook->server) { tlen16 += 4 + to_unicode(hook->pool, NULL, hook->server); } if (hook->dns_domain) { tlen16 += 4 + to_unicode(hook->pool, NULL, hook->dns_domain); } if (hook->dns_server) { tlen16 += 4 + strlen(hook->dns_server); tlen16 += 4 + to_unicode(hook->pool, NULL, hook->dns_server); } if (tlen16) { /* target info termination */ tlen16 += 4; }
There is no code to check the length of these strings.
And it will lead to An Integer Overflow in tlen16, which finally lead to an buffer-over-write at memcpy.
check the length of strings or use safer 'size_t' at tlen16.