データベース「MongoDB」の管理ツール「phpMoAdmin」に存在するゼロデイ脆弱性の解析

「PHP MongoDB administration tool(phpMoAdmin)」は、オープンソースのドキュメント指向データベース「MongoDB」をグラフィカルユーザインタフェース(GUI)で操作できる無料の管理ツールです。phpMoAdmin は 、NoSQL のデータベース「MongoDB」を管理する人気のツールで、PHP言語で記述されています。

2015年3月上旬、リモートでコードが実行されるゼロデイ脆弱性が、「phpMoAdmin」で確認されました。この脆弱性を利用することにより、攻撃者は、認証なしに任意のコードを実行することができます。これは、コマンドインジェクションの脆弱性で、通常は、Webアプリケーションがユーザの入力に基づいて特定のオペレーティングシステム(OS)のコマンドを実行する際に発生するものです。

■脆弱性の解析
この脆弱性は、「moadmin.php」という PHPファイルに存在します。ファイル「moadmin.php」のコード内での関数「eval」の使用方法が適切でないため、攻撃者は「system」や「eval」、「exec」などの PHP の関数を用いて、シェルコマンド(OSコマンド)を実行することができます。

この脆弱性を利用するためには、以下の 2つの攻撃経路があります。以下はファイル「moadmin.php」の脆弱性を抱えたコードです。

  1. パラメータ「find」内の脆弱性を抱えたコード
  2. 図1:moadmin.php 内の脆弱性を抱えたコード(パラメータ「find」)
    図1:moadmin.php 内の脆弱性を抱えたコード(パラメータ「find」)

  3. パラメータ「object」内の脆弱性を抱えたコード

図2:moadmin.php 内の脆弱性を抱えたコード(パラメータ「object」)
図2:moadmin.php 内の脆弱性を抱えたコード(パラメータ「object」)

上述の 2つのパラメータにより、脆弱性を抱えたサーバ上で、適切なパラメータ値と共に任意コードの実行が可能になります。

パラメータ「find」を利用するために、「POST」や「GET」、「CONNECT」、「PUT」など、さまざまなHTTPのの要求を利用することができることを確認しました。しかしパラメータ「object」は、POST要求のみで利用することが可能でした。

この脆弱性を利用した攻撃は、容易に実行することができます。サーバ側は、修正プログラムを速やかに適用するか、この脆弱性に対応したセキュリティ対策製品を導入することを推奨致します。以下は、この脆弱性を利用した攻撃を検証したものです。

  1. パラメータ「find」を利用した場合

POST /xyz/moadmin.php?action=listrows&collection=nnn&find=array();system('ls'); HTTP/1.1
GET /xyz/moadmin.php?action=listrows&collection=nnn&find=array();system('ls'); HTTP/1.1
CONNECT /xyz/moadmin.php?action=listrows&collection=nnn&find=array();system('ls'); HTTP/1.1
PUT /xyz/moadmin.php?action=listrows&collection=nnn&find=array();system('ls'); HTTP/1.1

上記のコマンドにより、サーバはコマンド「ls」を実行します。図3 は、ネットワーク上でのこの脆弱性を利用した攻撃を示したものです。

図3:パラメータ「find」を利用した場合の HTTPヘッダ
図3:パラメータ「find」を利用した場合のリクエスト・レスポンス

コマンド「ls」の結果は、HTTPヘッダの後に確認することができます。HTTP のさまざまな要求を利用して、遠隔からコードを実行をすることが可能です。パラメータ「find」を利用するためには、「action=listrows」、「collection=ランダムな値」、「find=array()」で初期化する必要があります。コマンド「Is」は、最後の「system()」コール内で確認できます。

  1. パラメータ「object」を利用した場合

curl "http://xyz /moadmin.php" -d "object=1;system('id');exit"

以下はネットワーク上でのこの脆弱性を利用した攻撃を示したものです。

図4:パラメータ「object」を利用した場合のHTTPヘッダ
図4:パラメータ「object」を利用した場合のリクエスト・レスポンス

弊社は調査により、パラメータ「object」を利用した攻撃では、POST要求のみが利用可能であることを確認しました。パラメータ「object」を利用するために、「object」をランダムな値で初期化する必要があります。「find」の場合と同様、コマンド「ls」の結果は、HTTPヘッダの後に確認することができます。

攻撃者がこの脆弱性を利用してその他のコマンドを実行するのは、難しくないでしょう。その結果、不正なファイルがダウンロードされたり、実行されるなど、サーバにより深刻な被害を与える可能性があります。攻撃が成功すると、攻撃者がサーバを制御することが可能になります。

弊社のサーバ向け総合セキュリティ製品「Trend Micro Deep Security(トレンドマイクロ ディープセキュリティ)」ご利用のお客様は、以下のフィルタを適用することにより、問題の脆弱性を利用した攻撃から保護されます。

  • 1006559 – PHPMoAdmin Unauthorized Remote Code Execution Vulnerability

参考記事:

翻訳:臼本 将貴(Core Technology Marketing, TrendLabs)