|
|
Message-ID: <5559A053.6090004@truel.it>
Date: Mon, 18 May 2015 10:18:27 +0200
From: Andrea Palazzo <andrea.palazzo@...el.it>
To: cve-assign@...re.org
CC: oss-security@...ts.openwall.com, security@....net
Subject: CVE Request + Advisory: PHP str_repeat() sign mismatch based memory
corruption
Hi everyone,
this is intended as CVE Request and advisory for
https://bugs.php.net/bug.php?id=69403.
## Info
#
# Title: PHP str_repeat() sign mismatch based memory corruption
# Author: Andrea Palazzo
# <andrea [dot] palazzo [at] truel [dot] it>
# http://www.truel.it
# Product: PHP
# <= 5.4.40 / 5.5.24 / 5.6.8
# http://www.php.net
# Patch:
http://git.php.net/?p=php-src.git;a=commit;h=c591f022f8abb4c0c2e60a037a0c0c5c5a125957
#
http://git.php.net/?p=php-src.git;a=commit;h=0a96aa600d1028eda505270366df28e4085a1941
# CVE: Not assigned yet
#
## Summary
str_repeat() suffers from a sign mismatch based integer overflow that
results in creation of corrupted ZVALs; this condition, depending on the
context, can be abused to bypass PHP-level checks or trigger any kind of
memory error: a successful exploitation of this issue is likely to
produce both local and remote code execution vectors.
## Details
str_repeat() takes mult as second argument, which represents the number
of desired repetitions for the string passed as first argument. Once
retrieved, this value is multiplied by input_len and stored into result_len
/* Initialize the result string */
4907 result_len = input_len * mult;
which then, on line 4930 is passed as argument for RETURN_STRINGL() macro.
It should be noticed that while RETURN_STRINGL() ends up calling
ZVAL_STRINGL(), which expects the length argument to be a signed int,
result_len is defined as size_t, producing an implicit cast of the
actual value.
In situations in which huge memory allocations are possible (most likely
64-bit systems), it is possible to take advantage of this situation
overflowing ZVAL_STRINGL's length into a negative value, in order to get
a corrupted string-typed ZVAL.
(gdb) r -r 'var_dump(str_repeat("a", 4294967294+1));'
Breakpoint 1, php_var_dump (struc=0x7ffff7f8a188, level=level@...ry=1)
at /build/buildd/php5-5.6.7+dfsg/ext/standard/var.c:88
88 /build/buildd/php5-5.6.7+dfsg/ext/standard/var.c: No such file or
directory.
(gdb) p **struc
$7 = {value = {lval = 140732723359792, dval = 6,9531203857753119e-310,
str = {
val = 0x7ffee3fbf030 'a' <repeats 200 times>..., len = -1},
ht = 0x7ffee3fbf030, obj = {handle = 3824939056,
handlers = 0x7fffffffffff}, ast = 0x7ffee3fbf030}, refcount__gc = 1,
type = 6 '\006', is_ref__gc = 0 '\000'}
## Solution
Update to PHP 5.4.41 / 5.5.25 / 5.6.9
http://php.net/downloads.php
## Timeline
2015-04-09 - Privately submitted through PHP Bug tracking system
2015-05-10 - Assigned
2015-05-12 - Patch issued
Powered by blists - more mailing lists
Please check out the Open Source Software Security Wiki, which is counterpart to this mailing list.
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.