systemadmin.es > LAMP y web > Bug de PHP CVE-2012-1823

Bug de PHP CVE-2012-1823

Por error se hizo público un bug de PHP (61910) que permite que se muestre el código fuente de las páginas PHP que se sirven con PHP-CGI, arrastrado desde un commit de 2004:

Mostrar código fuente de PHP - CVE-2012-1823

Mostrar código fuente de PHP - CVE-2012-1823

Simplemente añadiendo la opción -s obtenemos el código fuente, además coloreado según hace php-cgi con dicha opción:

$ /usr/local/bin/php-cgi -h
Usage: php-cgi [-q] [-h] [-s] [-v] [-i] [-f <file>]
       php-cgi <file> [args...]
  -a               Run interactively
  -C               Do not chdir to the script's directory
  -c <path>|<file> Look for php.ini file in this directory
  -n               No php.ini file will be used
  -d foo[=bar]     Define INI entry foo with value 'bar'
  -e               Generate extended information for debugger/profiler
  -f <file>        Parse <file>.  Implies `-q'
  -h               This help
  -i               PHP information
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -q               Quiet-mode.  Suppress HTTP Header output.
  -s               Display colour syntax highlighted source.
  -v               Version number
  -w               Display source with stripped comments and whitespace.
  -z <file>        Load Zend extension <file>.

Esto se debe a que las opciones no se escapan los guiones, por lo que acaban transformados en opciones.

En el caso de PHP 5.4.0, además podemos causar un Denial of Service al existir la opción -T que ejecuta varias veces el script:

$ /usr/local/bin/php-cgi -h
Usage: php-cgi [-q] [-h] [-s] [-v] [-i] [-f <file>]
       php-cgi <file> [args...]
(...)
  -T <count>       Measure execution time of script repeated <count> times.

Para mitigar el problema, en el caso de Apache podemos usar la directiva FilesMatch para evitar que se muestre el contenido de ficheros PHP sensibles (con contraseñas) que normalmente saldrían en blanco:

<Directory /var/www>
  Action php52-cgi /php52-cgi/php-cgi
  AddHandler php52-cgi .php
  <FilesMatch "\.php$">
    SetHandler php52-cgi
  </FilesMatch>
  <Filesmatch  ^config.php$>
    Deny from all
  </FilesMatch>
</Directory>

Dicha opción ya la comenté para el caso del wp-config.php de WordPress para una configuración segura.

En el blog de uno de los descubridores (dónde también podemos encontrar los parches) de la vulnerabilidad se comenta también:

There is one slight complication: php5-cgi behaves differently depending on which environment variables have been set, disabling the flag -r for direct code execution among others.

Mirando el código fuente de php-5.2.17 y php-5.4.0 no he visto la opción -r deshabilitada, sino que no existe por lo que si la añadimos veremos que nos da un error 500:

$ curl -I 'http://systemadmin.es/?-r'
HTTP/1.1 500 Internal Server Error
Date: Thu, 03 May 2012 14:05:16 GMT
Server: Apache
Connection: close
Content-Type: text/html; charset=iso-8859-1

Pero se debe a que dicha opción no existe. Con strace vemos como nos devuelve el usage:

[pid 12142] write(1, "Usage: php-cgi [-q] [-h] [-s] [-v] [-i] [-f <file>]\n       php-cgi <file> [args...]\n  -a               Run interactively\n  -C   "..., 889 <unfinished ...>

Por lo que no entiendo cómo pueden ejecutar código con esta vulnerabilidad si no es usando el binario de php en lugar de php-cgi

One comment to “Bug de PHP CVE-2012-1823”

  1. He visto que se hace con el parámetro -d
    .php?-d allow_url_include=1 -d auto_prepend_file=php://input
    Ya que php://input es un flujo de sólo lectura que permite leer datos del cuerpo solicitado, para este caso enviamos el código a ejecutar en el data de una petición POST.
    No he analizado mucho al respecto pero creo que no estoy alejado 😉

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>