いわゆるガンブラーと呼ばれる攻撃はFTPアカウントなどを乗っ取って不正なファイルを配置する攻撃です。PHPのセキュリティ対策とは関係ありませんが、様々なベンダーからガンブラー対策としてサービスや製品が提供され、被害も多く報告されている状態です。
ガンブラーとは?
Wikipediaでは
Gumblar(ガンブラー)とは、「Webサイト改ざん」と「Web感染型ウイルス(Webサイトを閲覧するだけで感染するウイルス)」を組み合わせて、多数のパソコンをウイルスに感染させようとする攻撃手法(手口)のことである[1][2]。
同攻撃に関連するマルウェアを指す意味でも多用されるが、どの範囲のマルウェアを指すのかはメディアによって様々である。
http://ja.wikipedia.org/wiki/Gumblar
と定義されています。
ウイルスの名称というより、IDとパスワードを盗み不正なファイルをWebサイトに配置する攻撃の総称になってきています。
直接攻撃用のファイルを配置されない場合でも、攻撃用のファイルをホストしているサーバへアクセスさせるJavaScriptを配置されるなどの手法で攻撃に利用されます。ドライブバイダウンロードなどと呼ばれる攻撃の一種で、最終的にはWebブラウザにインストールされた脆弱なPDFリーダやFlashプレイヤーなど、ブラウザのプラグインやブラウザ本体の脆弱性を利用してPCを乗っ取りボット化することが主な目的です。
Wikipediaの対策にも「改ざん検知システム等の導入」が挙げられています。どう検知すればよいのか? UNIX系OS向けに簡単で効果的な方法を紹介します。
サイトの更新頻度が低く、個人向けカスタマイズやコメントがないサイトであれば簡単なガンブラー対策でも十分な効果があります。
ガンブラー対策
ガンブラーによる攻撃はアンチウイルスソフトでWebサーバを内部、外部からスキャンしても完全には検出できません。簡単に攻撃用のコードの亜種が作れ、アンチウイルスソフトが効果的に攻撃用のコードを検出できないからです。
ガンブラー対策は通常の不正改ざんチェックの手法がほとんどそのまま利用できます。以下の条件に一致するサイトであれば比較的簡単にガンブラー対策を行えます。
- 更新頻度低い
- 個人向けのカスタマイズを行っていない
この条件に一致するサイトはかなり多いと思います。ほとんどの会社のホームページはこの条件に一致するサイトでしょう。
2つのコンテンツ改ざん
コンテンツを改ざんする手法は大き分けて2つあります。
- ファイルを直接改ざんまたは配置
- データベースのデータを改ざんまたは挿入
ファイルを直接改ざんする手法は乗っ取ったFTPアカウントなどを通じて行われます。データベースのデータを改ざんする手法は、ガンブラーでなくてもSQLインジェクションによって不正な改ざんが行われる場合もあります。
ファイル改ざんの検出
UNIX系のOSであればサーバ側ファイルの改ざんの検出は簡単なツールの組み合わせで行えます。Web開発者であれば誰でも使ったことがある(?) wget、diff、grep、ssh、rsyncを使うだけです。
ファイルを直接配置するタイプの攻撃であれば、Webサーバのドキュメントディレクトリをdiffコマンド使用して比較するだけです。Webサーバ上でドキュメントディレクトリとバックアップしたファイルをdiffコマンドで差分で確認するだけで検出できます。
バックアップファイルをWebサーバに配置している場合、Webサーバ全体が乗取られた場合は意味がありません。できるだけバックアップファイルと検証用のファイルは別のPCに保存してチェックするほうが望ましいです。
まず、安全な状態のWebのファイルをすべてコピーします。この時、ドキュメントルートのファイルのみでなく、ドキュメントルート以外にあるスクリプトファイルなどもすべてコピーしてください。
sshとrsyncが利用可能な環境であれば、以下のようなコマンドでコピーできます。
同じ手順で定期的にWebサーバのバックアップファイルを取得し、diffコマンドで比較するだけです。
mod.txtファイルが空でなければ何らかの改変が行われたことになります。
シェルスクリプトにしてcronなどで定期的にチェックすれば確実にファイルの改ざんを検出できるようになります。
rsyncの代わりにsshfsやnfsなどを利用し、リモートのファイルシステムを利用したほうがよいのでは? と考えられる方も居るかも知れませんが、rsyncであれば差分だけ転送されるのでシステムへの負荷はより少ないでしょう。sshを利用することによるCPU負荷が気になる場合、firewallで制限したrsyncサービスを使用するとよいでしょう。
データベースの改ざんの検出
最近のWebサイトはSQLデータベースを利用した動的なサイトが主流でしょう。SQLデータベースのデータ改ざんをチェックする方法が一番確実です。データベースをアクセスログの記録やセッション管理に利用していないなら、SQL文のログ機能を有効に設定しDML(UPDATE, INSERT, DELETE文)を監視すれば改ざんを検出できます。
PostgreSQLの場合、postgresql.confの設定に
を追加します。変更関連クエリが記録されるようになります。‘mod’を‘all’にするとすべてのクエリを記録します。
MySQLの場合、クエリすべてを記録するオプション --logまたは -lが用意されています。サーバ起動時に指定することが可能です。
SQL文のログファイルをgrepコマンド使ってチェックすれば改ざんを検出できます。
mod.txtファイルが空でなければ何らかの更新が行われたことが分かります。
予め知っておくべきことは、この正規表現ではSQL文のテキスト(SQL文でなくパラーメタ)として送信されたINSERT, UPDATE, DELETEまで検出してしまう問題があることです。しかし、元々の前提が「更新頻度が低いサイト」ですから、UNIONクエリーやサブクエリーなどを利用した攻撃も検出できる利点を考えれば、これでも構わないでしょう。
コンテンツの改ざん検出
データベースの改ざん検出を利用できないサイトも多いかと思います。CMSを利用したサイトではアクセスログやエラーログ、セッション管理にデータベースを利用している場合が少なくありません。
このような場合にSQL文のINSERT、UPDATE、DELETE文の発行を監視する方法はあまり実用的ではありません。特定のSQL文を排除すればかなり実用的にはなりますが、データベースでクエリをログすることが難しい場合、コンテンツの改ざんをチェックしたほうが手っ取り早い場合もあります。
このような場合はwgetコマンドを利用してコンテンツ改ざんをチェックするとよいでしょう。手順はファイルベースの比較とほとんど変わりません。
まず現在のコンテンツの状態のバックアップを取得します。
ログインが必要なサイトではCoookieヘッダで既にブラウザなどで取得したセッションIDを設定します。必要なければ省略して構いません。
ローカルのファイルシステムにコピーが出来上がるので、ファイルの時と同様にdiffコマンドを使ってチェックします。
コンテンツを比較する方法は手軽ですが、コンテンツレベルで改ざんチェックした場合、ルートページからリンクが全くないページをチェックできない問題もあります。最近の攻撃では入り口となるWebサイトから直接攻撃用のサイトに誘導せず、複数のサイトをリダイレクトしてから本当の攻撃を行うことが一般的に行われています。コンテンツレベルでのチェックではこの種の攻撃の踏み台に利用される改ざんは検出できないことを理解しておく必要があります。
まとめ
しっかしとしたサイトではサイトの改ざんチェックのみでなく、システムのファイルの改ざんチェックも行っていると思います。多くの場合はファイルのハッシュ値を比較しチェックしていると思いますが、コンテンツ改ざんの検出チェックではハッシュ値が異なることが分かるだけではあまり意味がありません。
コンテンツ改ざんのチェックには、変更内容が確認できる必要があります。更新頻度が低いWebサイトの改ざんチェックはいつも使っているようなツールで簡単にチェックできます。頻繁に更新されるサイト、ユーザごとにカスタマイズされているサイトで実用的にチェックするにはもう少し工夫が必要です。
広く使われているサイトでは簡単なシェルスクリプトでチェックできるので、ガンブラーやSQLインジェクション対策に利用してください。