エクスプロイト&脆弱性
Apache Tomcatの脆弱性「Ghostcat」(「CVE-2020-1938」、「CNVD-2020-10487」)を検証
Apache Tomcatに確認された「Ghostcat(ゴーストキャット)」の脆弱性、「CVE-2020-1938」および「CNVD-2020-10487」が論議を引き起こしています。この脆弱性が及ぼす影響について、とりわけ、Ghostcatがリモートコード実行(Remote Code Execution、RCE)に使用される可能性についてのリサーチャーによる調査結果が注目されています。
Apache Tomcatに確認された「Ghostcat(ゴーストキャット)」の脆弱性、「CVE-2020-1938」および「CNVD-2020-10487」が論議を引き起こしています。この脆弱性が及ぼす影響について、とりわけ、Ghostcatがリモートコード実行(Remote Code Execution、RCE)に使用される可能性についてのリサーチャーによる調査結果が注目されています。
オープンソースの「Apache Tomcat」は、Java ServletやJavaServer Pages (JSP) を実行するためのサーブレットコンテナです。多くのユーザに利用されているため、確認されたGhostcatの脆弱性が深刻視されるのは当然のことと言えます。今回のブログ記事では、最も懸念されるGhostcat悪用のシナリオ、つまりこの脆弱性を利用することによってRCEが可能になり得るという、稀な状況を想定し、その深刻度について解説します。
図1:Apache JServ Protocol(AJP)
■Apache JServ Protocol (AJP)
上の図はApache JServ Protocol(AJP)の概念図ですが、2020年2月20日、「Chaitin Tech(长亭科技)」のリサーチャーによって発見されたGhostcatは、このAJPに存在する脆弱性であることが報告されています。AJPは、Apache Tomcat のWebサーバがTCP接続を使用して、Webサーバの背後で処理をするサーブレットコンテナと通信するために使用される、バイナリ転送プロトコルです。主に、Webサーバがアプリケーションサーバかサーブレットコンテナと通信するクラスタ、またはリバースプロキシを利用する場面で使用されます。
これはつまり、AJPがWebサーバ(Apache HTTPDなど)とApache Tomcatサーバ(図1)の間で内部的に使用される一方、HTTP Connectorがクライアント側に露出しているということを意味します。AJPはApache HTTP Serverのモジュールとして実装されており、mod_jkまたはmod_proxy_ajpとして表されます。重要な点としてAJPは本来、外部に露出させるものではありません。これは、次の項目で説明するRCEが可能になるシナリオの前提条件の1つであるため、重要なポイントです。
■Ghostcatの脆弱性
Ghostcat自体は、意図しないファイルを読み込む「ローカルファイルインクルード(Local File Inclusion、LFI)」の脆弱性であり、任意のファイルのアップロードや書き込みの脆弱性ではありません。Apache TomcatによるセキュリティアップデートのページではGhostcatについて、「AJP Request Injection and potential Remote Code Execution」、つまり潜在的にAJPリクエストインジェクションおよび潜在的にリモートコード実行を可能にする脆弱性であると説明しています。「potential(潜在的)」というキーワードが加えられていることで、GhostcatがもともとRCEの脆弱性ではないことが強調されています。
セキュリティアップデートには、RCEを可能にするために必要な状況がさらに詳しく記載されています。Webアプリケーションは、ファイルのアップロードと、アップロードされたファイルをWebアプリケーションへ保存することを許可する必要があります。もしくは、何らかの方法で攻撃者がWebアプリケーションのコンテンツを制御可能になることが必要になります。このシナリオに加えて脆弱性を突くことで可能になる、ファイルをJSPとして処理する機能を組み合わせることでRCEが実現可能になります。
要約すると、Ghostcatは、Tomcat AJP Connectorが外部に露出している場合に、企業組織に問題を引き起こす可能性がある、ということになります。そのような状況はそもそも推奨される設定ではありません。ただし、RCEを可能にするには、露出したAJPに加えて他にもいくつかの条件が満たされる必要があります。これらの必須条件が全部揃う状況は、実際の環境では発生しにくいと考えられます。
ブラジルのセキュリティリサーチャーであるJoão Matosは、GhostcatによってRCEを可能にするために必要な条件を列挙しました。
図2:RCEを可能にする必要条件についての投稿
APP機能を利用してファイルをアップロードすること:RCEを可能にするために、ファイルのアップロード機能を備えたアプリケーションが、システムにインストールされている必要があることを意味します。インストールされている場合、攻撃者がファイルアップロードの脆弱性を持つWebアプリケーションを利用し、悪意のあるWebシェルのファイルをアップロードできます。ファイルアップロードの脆弱性がJPGやTXTなどの特定のファイル拡張子を制限する場合にのみ、ファイルをJSPとして解釈する必要性が発生します。
ファイルはDocumentRoot内に保存されていること:攻撃者がアプリケーションを侵害し、悪意のあるファイルのアップロードに成功した場合、ファイルをアプリケーションのルートフォルダ内に保存する必要があります。この条件をクリアすることは、次の2つの理由によりほとんど不可能です。
- Javaアプリケーションにおいて、通常、アプリケーションルートフォルダにファイルを保存することはない
- アプリケーションルートフォルダは一時的なものであるため、新しいバージョンのアプリケーションがデプロイされると、フォルダは完全に上書きされる
さらに開発者の観点から見れば、ほとんどのApache Tomcatアプリケーションは、基本的にはzipファイルのWARファイルとしてデプロイされるため、ファイルアップロード機能によってルートフォルダ内にファイルがアップロードされるとは考えにくいと言えます。
AJPポートに直接到達すること:最後に、上述の2つの条件が満たされた後、攻撃者は、外部に露出したAJPであるリバースプロキシを介してインターネット経由で直接Tomcat AJP Connector(デフォルトポートは8009)に到達する必要があります。すでに述べたように、これは推奨される設定でも一般的な設定でもありません。AJP Connectorが露出していて、攻撃者が通信したとしても、AJPはバイナリ通信プロトコルであるため、Webサーバはクライアント側のエラーを伝える「400 Bad Request」ステータスを表示します。
■Ghostcatの深刻度
Ghostcatが有名となった理由をもう1つ付け加えるなら、13年以上前から存在している脆弱性であり、Apache Tomcatのほぼすべての主要バージョンに影響を与えるという事実でしょう。すでに挙げたすべての条件を考慮すると、GhostcatがRCEを可能にする脆弱性に変化する要件が揃う状況は、実際にはほとんどないと言えるでしょう。実際の環境においてこれらの要件が存在する理由は考えられないため、攻撃者はこれらの要件を自ら発生させる必要があります。
この脆弱性を説明しているほとんどの概念実証(Proof of Concept、PoC)では、Apache Tomcatの”webapps/ROOT”内にwebshell.txtファイルがすでに存在しているため、Ghostcatを利用する以前にRCEが可能となっています。実際の環境では、すでにネットワーク内にいる攻撃者であればAJP Connectorに直接到達できるため、この脆弱性を利用して探索活動を実行できる可能性があります。とはいえ、攻撃のこの段階まで達するには、Ghostcat のLFIの脆弱性を利用するためにwebapps やフォルダ内にwebshellなどの悪意のあるファイルをアップロードした上で、ファイルの拡張子に関わらず強制的にJSPとして解釈させる必要があります。実行することは難しいでしょう。
■Ghostcatの修正プログラム
Apache Tomcatのチームによって作成された修正プログラムにより、Ghostcatの限界がさらに明確になっています。この項では、バージョン9.0.31のコードの修正(Fix)について詳しく説明します。なお、このコードは他のほとんどのバージョンでも共有されています。
Ghostcatは、以下のようなAJP Connectorの設定ミスに依存します。AJP Connectorは、/conf/server.xmlファイルでデフォルトで有効になっています。
<Connector port=”8009″ protocol=”AJP/1.3″ redirectPort=”8443″ />
Apache Tomcatチームは、この行をファイルからコメントアウトし、図3に示すように、「Commit 4c933d8」にてAJP connector をデフォルトで無効にしました。
図3:デフォルトでAJP connectorを無効にするCommit 4c933d8
このコード修正によってAJPがデフォルトで無効となるため、Ghostcatを抑止するのに十分な対処です。これは、AJPを使用していない場合に実行可能です。
AJPを無効にするのではなく、デフォルトで「ループバックインターフェイス(loopback interface)」のみをリッスンするように制限する、もう一つの修正について説明します(図4)。 Apache Tomcatチームは、secretRequired属性をtrueに設定し、secretを定義するように強制するなど、AJP Protocolの全体的な使用法を改善するために他の変更を加えました(図5)。また、AJP Connectorへのリクエストに任意の認識されない属性が含まれる場合、「403(Forbidden)」エラーが表示されるようにしました(図6)。
図4: Commit 0e8a50f0。AJP Protocolがデフォルトで0.0.0.0ではなくループバックアドレスを待機するよう強制する
図5:Commit 9ac90532。パラメータsecretRequiredが”true”に設定され、定義された“secret”があるかを確認する
図6:Commit 64fa5b99。任意の、認識されない属性が含まれる場合、「403 Forbidden」レスポンスでAJP Connectorへのリクエストがブロックされる
■結論
上述のように、Ghostcatがそれ自体はRCEの脆弱性ではないとはいえ、リスクとなる脆弱性であることに変わりはありません。内部に侵入した攻撃者に利用される可能性もあります。この脆弱性のエクスプロイトコードはすでに多数公開されているため、脆弱性を悪用されるリスクを回避するために、迅速にTomcatを最新バージョンに更新してください。
Apache Tomcatは、次のバージョンのTomcatの修正プログラムをリリースしました。
直ちに更新することが不可能な場合、AJP Connector Serviceを使用していないユーザは、かわりに、Apache Tomcatによる修正方法にあるように、コメントアウトするか、$CATALINA_HOME/conf/server.xml から完全に削除するかしてTomcatを再起動することにより、AJP Connector Serviceを無効化してください。
Tomcatを最新のバージョンに更新する以外の方法では、AJP Connector serviceを使用している場合、以下のように”secret”属性をChaitinの推奨する定義されたAJP protocol 認証に設定することができます。
<Connector protocol=”AJP/1.3″
address=”::1″
port=”8009″
redirectPort=”8443″
secretRequired=”true”
secret=”YOUR_SECRET_HERE” />
また、セキュリティ企業「Snyk」によると、「Spring Boot」フレームワークを使ったアプリケーションも、デフォルトで組み込まれているTomcatを使用しているため、この脆弱性の影響を受けると述べています。これらのアプリケーションのユーザも、Ghostcatによる影響を回避するため注意してください。
■トレンドマイクロの対策
「Apache Tomcat」を使用している開発者、プログラマ、およびシステム管理者は、総合サーバセキュリティ「Trend Micro Deep Security™」や、 「Trend Micro Virtual Patch for Endpoint(旧 Trend Micro 脆弱性対策オプション) 」のような多層セキュリティ技術を導入することができます。
「Deep Discovery ™ Inspector」は、以下のルールによってこの脆弱性を利用する脅威をブロックします。
- Rule 4354 – CVE-2020-1938 – TOMCAT AJP LFI Exploit – TCP (Request)
「Trend Micro Deep Security™」は、CVE-2020-1938を利用する脅威からシステムを保護します。
- 1010184 – Identified Apache JServ Protocol (AJP) Traffic CVE-2020-1938
ネットワーク脅威防御ソリューション「TippingPoint」は、以下のMainlineDV filterによりこの脆弱性を利用する脅威をブロックします。
- 37236- AJP: Apache Tomcat AJP File Request
参考記事:
- 「Busting Ghostcat: An Analysis of the Apache Tomcat Vulnerability (CVE-2020-1938 and CNVD-2020-10487)」
By Magno Logan (Information Security Specialist)
翻訳: 室賀 美和(Core Technology Marketing, Trend Micro™ Research)