phpMyAdminのsetup.phpの脆弱性を突くサイバー攻撃を確認


ちょっとセキュリティ関連が続きますが、これはちょっとヤバイので公開メモ。


MySQLの管理インタフェースとしてphpMyAdminを利用されている方は多いと思いますが、
ここ数日、Apacheaccess_log に以下のような怪しげな痕跡があったので気になって調べてみました。

パターン1

GET //phpmyadmin/config/config.inc.php?p=phpinfo();
GET //pma/config/config.inc.php?p=phpinfo();
GET //admin/config/config.inc.php?p=phpinfo();
GET //dbadmin/config/config.inc.php?p=phpinfo();
GET //mysql/config/config.inc.php?p=phpinfo();
GET //php-my-admin/config/config.inc.php?p=phpinfo();
GET //myadmin/config/config.inc.php?p=phpinfo();
GET //phpMyAdmin/config/config.inc.php?p=phpinfo();
GET //phppgadmin/config.inc.php?p=phpinfo();
GET //phpmyadmin2/config.inc.php?p=phpinfo();
GET //phpMyAdmin2/config.inc.php?p=phpinfo();
GET //mail/config.inc.php?p=phpinfo();
GET //webmail/config.inc.php?p=phpinfo();

パターン2

GET ///scripts/setup.php
GET //pma//scripts/setup.php
GET //phpmyadmin//scripts/setup.php
GET //phpMyAdmin//scripts/setup.php
GET //phpmyadmin//scripts/setup.php ←①
POST //phpmyadmin//scripts/setup.php ←②
GET //phpmyadmin//config/config.inc.php ←③
GET //phpMyAdmin//scripts/setup.php ←①
POST //phpMyAdmin//scripts/setup.php ←②
GET //phpMyAdmin//config/config.inc.php ←③


上記ログから攻撃の内容を推察すると、


パターン1のように、config.inc.php の存在確認と同時に引数を渡して phpinfo()関数を実行できるかを試行したり、
パターン2のように、setup.php の存在を確認したりしています。
パターン1は、すでに攻撃の下準備が済んでいる状態かどうかを確認しているものと思われます。
先ず問題となるのは、パターン2による一連のアクセスで、①setup.php へのアクセスが成功した後に、②なにやらPOSTして、③config.inc.phpが書き出されたか確認しています。


(当環境では以下に示すセキュリティホールの条件を満たしていないため難を逃れましたが、こんないかにもセキュリティホールになりそうな設定プログラムがインストールされていること自体知りませんでした。phpMyAdminのインストールについて紹介するホームページのなかには最後のセキュリテュ対策まで記述していないものも散見しますのでそれらを参考にしてインストールした方々は確認が必要と思われます。)


ググッたら昨年からいくつか記事がポストされていましたが、ここ最近増加傾向にあるようです。


まとめ。


【攻撃対象】
phpMyAdmin 2.11.x 系列 の 2.11.9.5以前と、phpMyAdmin 3.x 系列 の 3.1.3.1以前。


【条件】
1.phpMyAdmin 配下に「scripts/setup.php」が存在し不特定IPからアクセス可能。
2.phpMyAdmin 配下に「configディレクトリ」が存在し不特定IPからアクセス可能。
(「scripts/setup.php」経由で設定ファイルを作成するディレクトリ。phpMyAdmin セットアップ時に「setup.php」経由で設定を行った後に「configディレクトリ」を削除していない場合など。)
3.phpMyAdmin 配下の「config/config.inc.php」に不特定IPからアクセス可能。


【攻撃方法】
「setup.php」を探して見つかればアクセスして、任意のコマンドを実行できるようにするインジェクションコードを埋め込んだ設定ファイル(「config.inc.php」)を作成し、それを介して攻撃するようです。


【原因(セキュリティホール)】
対象バージョンの「setup.php」経由での「config.inc.php」作成時に、サニタイズが行われていないために任意のコードを実行できるインジェクションコードの埋め込みを許してしまう部分があります。


【対策】
最低限下記のいずれかを行う。
1.phpMyAdmin を最新バージョンへアップデートする。(phpMyAdmin download | SourceForge.net
2.phpMyAdmin へアクセスできるIPを制限する。(「/etc/httpd/conf.d/phpmyadmin.conf」また「.htaccess」など)
3.phpMyAdmin へのアクセスに認証を設ける。(「/etc/httpd/conf.d/phpmyadmin.conf」または「.htaccess」など)
4.phpMyAdmin 配下の 「setup.php」を削除またはパーミッション変更などによりアクセス不可とする。
5.phpMyAdmin 配下の「configディレクトリ」を削除またはパーミッション変更などによりアクセス不可とする。



この脆弱性自体は最近のものではなく、phpMyAdmin - Security - PMASA-2009-3で報告されていました。


少し追ってみると、攻撃可能な状態かどうかを確認するshスクリプトや、具体的に埋め込まれるインジェクションコードの例も公開されていましたが、攻撃手法そのものですので転記は止めておきます。



[スペシャルサンクス:phpMyAdminをハッキングしている記録と対策方法 | colori さんがサイバー攻撃であることの確信を与えてくださいました。]