安全でないとされている Docker アプリケーションの実際の安全性をテストする

JFrog Advanced Security シリーズ: 安全でないではないとされる Docker アプリケーション WebGoat について、サード パーティの脆弱性の悪用可能性を分析する

DockerHub のトップ イメージにおける CVE 悪用可能性について調査したところ、報告された CVE の 78% が実は悪用不可能であることが判明しました。今回、JFrog セキュリティ調査チームは、報告された CVE の適用可能性を自動的に分析する JFrog Xray  のコンテキスト分析機能を使い、意図的に安全でないアプリケーションである OWASP WebGoat をスキャンしました。

その結果、Critical CVSS スコアで報告された 60 の CVE のうち、実際には 10 の CVEが該当することが判明しました。

WebGoat critical CVEs byコンテキスト分析のスキャン結果

このブログ記事では、コンテキスト分析による報告で、注目すべき重要な CVE の詳細な適用可能性分析を行い、CVE の誤検出を減らすための洞察を提供します。

WebGoat は、主に Java で書かれた安全でない Web アプリケーションで、アプリケーション セキュリティのトレーニングやツールのベンチマークに一般に使用されています。WebGoat の Docker イメージは、研究によく選ばれるケースであり、実際に悪用可能な脆弱性を発見し、悪用不可能な脆弱性をフィルタリングする際に、コンテキスト分析がいかに強力であるかを示すものです。人気のあるサード パーティ コンポーネントと合成されたファースト パーティの安全でない欠陥の組み合わせは、テストに最適なターゲットとなります。この画像は合成された安全でないアプリケーションであるため、仕込まれた脆弱性の公式ドキュメントも使用することができ、それと比較することでグランド トゥルースとして、意図的に仕込まれたものではなく、ドキュメント化されていない、より悪用可能な脆弱性を見つけることも可能です。

調査方法

この調査では、WebGoat のような脆弱性の高いアプリケーションにおいて、どの CVE が実際に悪用可能かを調べることを目的としました。当チームは、常に幅広いエクスプロイト可能性テストに関心を持っていますが、このブログ記事の目的では、重要な CVSS スコアを持つ脆弱性にのみ焦点を当てています。

ターゲットとなるアプリケーション 「WebGoat」 を選択した後、次のステップとして JFrog Xray のコンテキスト分析機能を有効にしてスキャンし、報告された CVE のうち、本当に悪用可能なものはどれかを判断しました。

調査の最終段階は、Xray のコンテキスト分析機能によって提供される結果をさらに調査することでした。コンテキスト分析のスキャン結果は、コードの前提条件、設定の前提条件、実行環境などの悪用可能な要素を考慮し、CVE が悪用可能かどうかを判断します。

その結果、報告された CVE のほとんどは悪用不可能であると予想されました。なぜなら、「パッケージ X がインストールされている」という理由で脆弱性が報告されたとしても、その脆弱性が悪用可能であるためには、悪用に不可欠ないくつかの要因や前提条件 (コード、設定、環境) が、実は「脆弱な」アプリケーションには存在しない場合がほとんどであるからです。

JFrog Xray スキャン結果

JFrog Xray のコンテキスト分析で WebGoat の Docker イメージをスキャンした結果、Critical CVSS スコアで報告されている 60 の CVE のうち、実際に該当するのは 10 だけであることがわかりました。

これらのスキャン結果は、悪用される可能性が最も高い CVE に焦点を絞って調査するのに役立ち、コンテキスト分析が、セキュリティチームが該当する CVE の修正を優先し、実際には該当しない CVE の処理を非優先するのに役立つことを証明しています。

コンテキスト分析の結果を用いて、CVE の適用条件を検証してみよう。

該当する報告された CVE を解析する

まず、コンテキスト分析の結果、該当すると報告された 10 個の重要な CVE を分析することから始めました。この 10 個の CVE の悪用可能条件は、この Docker イメージでコンテキスト分析によって確認されています。つまり、当チームがこの調査で行っているホワイト ハット ハッカーと同じように、ブラック ハット ハッカーに狙われて悪用される可能性が高いということです。以下は、これらの該当する CVE の分析結果です。

CVE-2013-7285

最初に報告された注目すべき CVEは、XStream for Java におけるコマンド インジェクションで、細工された XML または JSON データをデシリアライズする際に、リモートでコードを実行される可能性があります。この脆弱性を利用するためには、攻撃者が `xstream.fromXML()` 関数に任意の入力を供給することができる必要があります。

上記のように、本脆弱性の悪用を成功させるためには、脆弱なバージョンの XStream をインストールするだけでは不十分です。WebGoat イメージのコンテキスト分析のスキャン結果は、この脆弱性が文脈的に適用可能かどうかを理解するのに役立ちます。コンテキスト分析のスキャン結果が該当する場合、アプリケーション内で XStream が脆弱に使用されていること、言い換えれば、脆弱な関数 `fromXML()` が外部入力で呼び出されていることを意味します。この結果が示すように、この脆弱性は適用可能であるため、攻撃者に悪用される可能性のある重大な問題として扱う必要があります。

CVE-2013-7285 の JFrog Xray 情報

コンテキスト分析の内訳は以下の通りです。

JFrog Xray CVE-2013-7285 のコンテキスト解析

Contextual Analys の結果、第一引数に外部入力を持つ脆弱な `fromXML()` の呼び出しが発見されたことがわかります。以下は、WebGoat のソース コードに見られる、脆弱な `xstream.fromXML()` の使用例です。

WebGoat の `fromXML()` の脆弱な使い方、Github

当チームは、この関数のパラメータとして悪意のあるデシリアライズされたオブジェクトを渡し、リモートでコード実行を行うことでこの脆弱性を悪用できてしまうことを発見しました。

この脆弱性は、訓練目的で WebGoat アプリケーションに仕込まれたものであり、脆弱なコンポーネントの一部であることに注意することが重要となります。実際のアプリケーションでは、脆弱性のあるユース ケースは全く同じですが、典型的な違いは、ユーザー入力が脆弱な呼び出しに伝搬する方法です。

WebGoat トレーニングの一環として Xstream を利用する

さらに、Xray の結果、同じ Xstream のバージョンに関連する Xstream の CVE がいくつか追加されていることが判明しました。これらの CVE は、WebGoat プロジェクトでは文書化されていませんでした。また、コンテキスト分析を使用することで、以下の重要な脆弱性の検出とこれらを悪用できてしまうことが分かりました。

  • CVE-2021-21344
  • CVE-2013-7285
  • CVE-2021-21347
  • CVE-2021-21351
  • CVE-2021-21350
  • CVE-2021-21346
  • CVE-2021-21345
  • CVE-2021-21342

CVE-2022-22965 (SpringShell)

最後に報告された注目すべき CVE は、有名な SpringShell です。Spring Web のクラスローダーの脆弱性で、リモートでのコード実行につながります。この脆弱性を利用するためには、攻撃者はリクエスト パラメータを POJO (Plain Old Java Objects) にバインドする公開されたウェブ エンドポイントを見つける必要があります。

この脆弱性は、Spring Framework の「データ バインディング」メカニズムにあります。このメカニズムは、リクエスト URL やリクエスト ボディからパラメータを受け取り、関数の引数や、場合によっては Java オブジェクトに代入します。

Java  オブジェクトにリクエスト パラメータを割り当てる場合、構築されたオブジェクトのいくつかの「内部」パラメータは決して外部から制御されてはならないため、セキュリティ リスクがあります (`Class`、`ClassLoader` や `ProtectionDomain` など)。Spring には、攻撃者がこれらの内部属性に割り当てることを拒否する特定のコードが含まれています。

残念ながら、Java 9からは新しいAPI (`class.getModule`) の導入により、Spring の保護をバイパスして `ClassLoader` 属性のプロパティに任意の値を割り当てることが可能になっています。

この脆弱性を WebGoat の Docker イメージをスキャンしたときのコンテキスト分析の結果を見てみましょう。

CVE-2022-22965 の JFrog Xray 情報

コンテキスト分析の結果が該当するということは、アプリケーション内で Spring Framework の「データバインディング」メカニズムが脆弱に使用されている、言い換えれば、単純な Java クラスの引数を受け入れる脆弱なアノテーション(@GetMapping` など)を持つ関数が定義されていることを意味します。

コンテキスト分析の内訳を見てみましょう。

CVE-2022-22965 に対する JFrog Xray のコンテキスト解析

見ての通り、コンテキスト分析は WebGoat.jar 内で Spring Framework の「データ バインディング」機構を脆弱な方法で使用している場所をすべて提供しています。

CVE-2022-22965 に関する JFrog Xray Scanner の説明

UserForm` オブジェクトへの POJO データ バインディング機能に脆弱性あり (WebGoat の Github より)

UserForm` オブジェクトへの POJO データ バインディング機能に脆弱性あり (WebGoat の Github より)

この脆弱性を悪用する方法として、最初に公開されたのは Apache Tomcat を狙ったもので、他にも Payara や Glassfish など、より多くのWebアプリケーションを狙った悪用方法が公開されています。当チームがスキャンした WebGoat イメージでは、脆弱な Web サーバーは実際には Undertow です。現在までに Undertow に対するエクスプロイトは公開されていませんが、上記で示したように適用条件が文脈的に当てはまるため、攻撃者はこのケースに対して動作するエクスプロイトを開発できると考えることができそうです。したがって、この脆弱性は悪用可能であり、それに応じて深刻な問題として扱われるべきだと考えています。

該当なしと報告された CVE を分析する

上記で記載した通り、JFrog のコンテキスト解析は、アプリケーションのコンテキストにおいて脆弱性が悪用可能かどうかを判断する機能を提供します。コンテクスチュアル スキャナは最も保守的な設定で実行されるため、適用不可能とタグ付けされた脆弱性に対して、極めて高い信頼性で適用可能性を検出することが可能です。

検査に必要な脆弱性の数を自動的に減らすことができる機能は、これまでの概念を覆すことができるものです。この機能により、セキュリティエンジニアは、脆弱性の重要度だけでなく、悪用可能性に基づいて優先順位を付け、無視することさえできるようになります。

これをさらに検証してみよう。

合計で 35 の CVE が、コンテキスト分析によって該当なしと報告されました。

CVE IDコンポーネントCVE が該当しない理由
(コンテキスト分析による結果)
CVE-2016-1000027spring-web脆弱なクラス (Simple)HttpInvokerServiceExporter がインスタンス化されることはありません
CVE-2017-11462krb5脆弱性のある関数 gssapi への言及は見つかりませんでした
CVE-2017-12652libpng脆弱性のある関数に関する言及は見つかりませんでした
CVE-2017-14062libpng脆弱性のある関数に関する言及は見つかりませんでした
CVE-2017-15088krb5脆弱性のある関数に関する言及は見つかりませんでした
CVE-2017-15670libc6脆弱性のある関数 glob/glob64 が一度も呼び出されませんでした
CVE-2017-15804libc6脆弱性のある関数 glob/glob64 が一度も呼び出されませんでした
CVE-2017-18269libc6脆弱性のある関数 glob/glob64 が一度も呼び出されませんでした
CVE-2018-11236libc6脆弱性のある関数 realpath が一度も呼び出されませんでした
CVE-2018-6485libc6脆弱性のある関数に関する言及は見つかりませんでした
CVE-2018-6551libc6脆弱性のある関数に関する言及は見つかりませんでした
CVE-2019-12900libbzip2脆弱性のある関数 BZ2_bzDecompress が呼ばれることはない
CVE-2019-20367libbsd脆弱性のある関数 nlist が一度も呼び出されませんでした
CVE-2019-8457sqlite3脆弱性のあるモジュール rtree が有効化されませんでした
CVE-2019-9169libc6脆弱性のある関数に関する言及は見つかりませんでした
CVE-2020-10683dom4j脆弱性のある関数に関する言及は見つかりませんでした
CVE-2020-11656sqlite3脆弱なモジュール SQLITE_DEBUG が有効化されませんでした
CVE-2020-1745undertow-coreUndertow のコンフィギュレーションで AJP コネクタが有効化されませんでした
CVE-2021-33574glibc脆弱性のある関数 mq_notify が一度も呼び出されませんでした
CVE-2021-3520liblz4脆弱性のある関数 LZ4_decompress_safe_partial が一度も呼び出されませんでした
CVE-2021-35942glibc脆弱性のある関数 wordexp が一度も呼び出されませんでした
CVE-2022-1471snakeyaml脆弱性のある関数 Yaml.load が一度も呼び出されませんでした
CVE-2022-21724postgresql脆弱性のある関数 DriverManager.getConnection が外部入力で呼び出されませんでした
CVE-2022-22822libexpat脆弱性のある関数に関する言及は見つかりませんでした
CVE-2022-22823libexpat脆弱性のある関数に関する言及は見つかりませんでした
CVE-2022-22824libexpat脆弱性のある関数に関する言及は見つかりませんでした
CVE-2022-22978spring-security脆弱性のある関数に関する言及は見つかりませんでした
CVE-2022-23218glibc脆弱性のある関数 svcunix_create が一度も呼び出されませんでした
CVE-2022-23219glibc脆弱性のある関数 clnt_create が一度も呼び出されませんでした
CVE-2022-23852libexpat脆弱性のある関数に関する言及は見つかりませんでした
CVE-2022-25235libexpat脆弱性のある関数に関する言及は見つかりませんでした
CVE-2022-25236libexpat脆弱性のある関数に関する言及は見つかりませんでした
CVE-2022-25315libexpat脆弱性のある関数に関する言及は見つかりませんでした
CVE-2022-26520postgresql脆弱性のある関数 setLoggerFile、setUrl、setURL、setProperty、 connect、getConnection が外部入力で呼び出されませんでした
CVE-2022-27404libfreetype脆弱性のある関数に関する言及は見つかりませんでした

上記のリストの中から、2 つの例を見てみましょう。

CVE-2022-21724

最初の CVE は、PostgreSQL における入力検証の不十分さです。この脆弱性により、リモートの攻撃者は安全でないデシリアライズを引き起こすことができます。この脆弱性を利用するためには、攻撃者は脆弱性のある関数 `DriverManager.getConnection()` に悪意のあるクラスを供給する必要があります。言い換えれば、アプリケーションは脆弱な方法で PgJDBC を使用し、脆弱性のある関数 `DriverManager.getConnection()` に制御不能な入力を渡す必要があります。

CVE-2022-21724 の JFrog Xray 情報

この脆弱性のためのコンテキスト スキャナは、制御されていない入力を持つ `getConnection()` 呼び出しをチェックします。PgJDBC の脆弱な使用がないことは、この脆弱性が悪用されないことを意味します。

CVE-2022-21724 に対する JFrog Xray のコンテキスト解析

CVE-2022-23852

2 つ目の CVE は、libexpat の xmlparse.c における整数オーバーフローです。この脆弱性により、リモートの攻撃者は、おそらく不特定多数の影響を引き起こすことができます。この脆弱性を悪用するためには、ライブラリを脆弱な方法で使用する (libexpat の脆弱性のある API と相互作用する) コードがシステム内に存在する必要があります。

CVE-2022-23852、Xrayに対する JFrog Xray の情報

本脆弱性のコンテキスト スキャナは、libexpat の脆弱性のある API (XML_GetBuffer、XML_Parse) を使用するファーストパーティーのバイナリをチェックします。したがって、これらの脆弱性のある API が使用されていない場合、この脆弱性は悪用されないことを意味します。

CVE-2022-23852 に対する JFrog Xray のコンテキスト解析

結論

多くの CVE は該当しないことが判明しました。この「意図的に安全でないアプリケーション」は、結局安全であるということなのでしょうか。

上記のスキャン結果は、文脈的に分析された重要な CVEs のうち、実際に該当するのは 10/60 だけであることを示しています。これは、WebGoat が意図的に安全でないように作られたアプリケーションであることを考えると、非常に驚くべきことです。合成された脆弱性のあるアプリケーションには、極めて多くの悪用可能な CVE が存在するのかもしれません。実際、これらの結果は、CVE についてこれまでわかっていることと一致しています。2023年現在、一般的なケースでは、CVE を悪用するための適用条件は満たされていないのです。

これほど多くの悪用できない重要な CVE を発見した第一の理由は、WebGoat はアプリケーションのファースト パーティ コードにある安全でない論理的欠陥を含むように設計されており、サード パーティの脆弱性のあるコンポーネントに起因するセキュリティ問題ではないためである。したがって、悪用可能な CVE の数、および悪用される可能性のある CVE の数は、WebGoat が脆弱性のあるアプリケーションであるという事実によって影響を受けることはありません。

さらに、他のアプリケーションと同様に、WebGoat に脆弱性のあるコンポーネントが存在するだけでは、脆弱性が悪用されることはありません。設定、実行環境、アプリケーションが脆弱性のあるコンポーネントをどのように使用するかといった追加パラメータが、脆弱性のあるコンポーネントの悪用可能性に最も影響する要因です。したがって、CVE や脆弱性コンポーネントは数多く存在しますが、実際に悪用可能なものはごくわずかです。WebGoat の作者は、脆弱性のあるサード パーティ機能の使用など、脆弱な条件を仕込んでいなかっただけで、脆弱性のあるコンポーネントを実行するようにシステムを構成していなかったのです。

なぜ、文書化されていない悪用可能な CVE が見つかったのでしょうか。

上記のコンテキスト解析の結果、WebGoat プロジェクトのトレーニングセクションで既知のセキュリティ問題として文書化されていない CVE が報告されました (上記の Xstream の CVE のリストを参照)。意図的に安全でないアプリケーションに、未知の悪用可能な脆弱性が存在することは、皮肉なことかもしれませんが、実際には完全に理にかなっています。このことは、開発プロセスや CI/CD プロセスの一部としてセキュリティを統合し、自動化されたツールで、報告された CVEs の最終製品への適用性を自動的に分析することの重要性を強調しています。

JFrog Advanced Security によるコンテキスト分析

この調査は、JFrog Xray の機能セット「JFrog Advanced Security」に含まれる新機能「コンテキスト分析」によって実現されました。このリリースにより、 JFrog Xray は、慣れ親しんだソフトウェア構成分析の領域から、高度なソフトウェア サプライチェーン セキュリティの領域へと移行しました。

コンテキスト分析では、アーティファクトのコンテキストを使用して、脆弱性が適用可能かどうかを特定します。このプロセスでは、コンテナ イメージ上で自動化されたコンテキスト スキャナを実行し、解析された脆弱性に対する到達可能なパスと構成設定を決定します。Xray は、悪用の前提条件があるような影響度の高い脆弱性や非常に高い脆弱性を自動的に検証し、文脈分析情報を提供して、該当するかどうかの判断を支援します。これにより、開発者は多くの無駄な時間と労力を省くことができます。

  • 該当する脆弱性のみを修正することで、開発者の時間を節約できる
  • 完成したコード(バイナリ)を攻撃者と同じ方法で解析する。
  • どの CVE が悪用可能か、その潜在的な影響力を知る
  • 完全な成果物、ビルド、リリース バンドルのコンテキストで脆弱性をテストする。
  • アーティファクト、ビルド、リリース バンドルのコンテキストでアクションと修復を可能にします。


記事参照:

Testing the actual security of the most insecure Docker application
タイトルとURLをコピーしました