#38322 [Opn->Csd]: reading past array in sscanf leads to arbitary code execution
ID: 38322
Updated by: tony2001@php.net
Reported By: heintz at hotmail dot com
-Status: Open
+Status: Closed
Bug Type: Strings related
Operating System: all
PHP Version: 5.1.4
New Comment:
This bug has been fixed in CVS.
Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
Thank you for the report, and for helping us make PHP better.
Previous Comments:
------------------------------------------------------------------------
[2006-08-04 11:36:16] heintz at hotmail dot com
the checkformat function checks the invalid numbers
by subtracting one but the scanning function doesnt
so seems to me the only problem here is that someone has forgotten to
subract 1
code from scanf.c line 737
} else if ( isdigit(UCHAR(*ch))) {
value = strtoul(format-1, &end, 10);
if (*end == '$') {
format = end+1;
ch = format++;
objIndex = varStart + value;
}
}
i think just by putting making a objIndex = varStart + value -1;
it would be secure and keep the functionality. though the if-s wont
hurt if you subract one so they can stay for insurance if performance
is not that big of a issue.
------------------------------------------------------------------------
[2006-08-04 09:28:06] tony2001@php.net
Please check out this patch:
http://tony2001.phpclub.net/dev/tmp/bug38322.diff
------------------------------------------------------------------------
[2006-08-04 00:36:21] heintz at hotmail dot com
Description:
------------
ext/standard/scanf.c line ~887
---
if (numVars) {
current = args[objIndex++];
---
objIndex points past the end of array in other format cases too
Reproduce code:
---------------
sscanf('foo ','$1s',$str);
http://www.plain-text.info/sscanf_bug.txt -
full description
Actual result:
--------------
will try to dereference a pointer to pointer which usually causes
segmentation fault
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=38322&edit=1
Thread (4 messages)