Drupalに脆弱性発見
Drupalに重大な脆弱性がある件は2018/3/21に報告されていたわけですが、実際にパッチが出ました。
修正内容がかなりヤバそうなものでしたのでまとめます。
そもそもDrupalって何なのか
Drupalとは、CMS(コンテンツマネジメントシステム)と呼ばれるソフトウェアで、ITの知識がない人でもWEBサイトを構築できるソフトウェアのことを指します。日本ではCMSと言えばWordPressのシェアが高いと思います。オープンソースです。
日本でもDrupalのコミュニティーはきちんとあって、結構Drupalでできているサイトも存在しそうだと思いました。
結構法人での実績もありそうなので、裏の人は対策で大忙し‥なのかもしれません。Googleで「drupal導入実績」と検索すると、有名どころのWEBサイトがかなりDrupalなんだなあと思いました。
何がヤバいのか
この脆弱性の名前は「CVE-2018-7600」という名前がついています。IPAからも通達が出ています。
Drupal は、オープンソースの CMS(コンテンツマネジメントシステム)です。
Drupal にはリモートから任意のコードが実行可能となる脆弱性が存在します。この脆弱性を悪用された場合、遠隔の第三者によって、サーバ上で任意のコードを実行される可能性があります。
開発者はリリース後の数時間から数日以内に攻撃手法が開発される可能性があるとも予想しているため、対策を至急実施してください。
で、パッチを当てるかバージョンアップすればいいのはわかりますし、リモートコード実行という外部からコードを実行される脆弱性というのもわかります。ただ、条件がよくわからないと思います。
この当たりの説明はどのサイトを見てもボカしてあります。攻撃方法を詳細に書くわけにはいきませんから当然です。
でも、残念なことにオープンソースということもあり、パッチファイルの中身もオープンソースであり、PHPなので読むのも簡単。何が修正されたのか一目瞭然なのです。
攻撃者にとってみれば、パッチを見れば逆に何がマズイのかわかってしまうわけですね。
この記事の内容が全てですが英語なので解説しておきます。
新しいリリースバージョン7.58には、GET、POST、またはクッキーを通じて提供されるユーザー入力を消去する関数を含む新しいファイル 'request-sanitizer.inc'があります。
関数 'sanitize'は、GET、POST、およびCookieを介して送信されたパラメータを受け入れ、 'stripDangerousValues'関数から取得したサニタイズされた文字列で要求を置き換えます。
クリーンアップを行う主な機能は、84行目の 'stripDangerousValues'です。この関数は、入力が配列かどうかをチェックし、次に、各パラメータのキー名が#で始まるかどうかを調べます。基本的に、戻り値は#を取り除き、入力配列を呼び出し関数に返します。
ですので、パッチがやっていることって、GETとPOSTとクッキーの入力値のキー名が#で始まっていたら、#を削除しているだけなんです。
Looking at the patch, an exploit would look something like:
index.php?page['#payload']=home.php
あえて英語で書きますが、どうでしょう。ヤバさがわかりますでしょうか。
#をキーにしたあとどうすればコマンド実行まで行けるかまでは書いてありませんが、予想はだいたいつきます(書きませんが)。
動的なページに入力値をGETで与えればいいのでしたら、改ざんもDoSもなんでもできてしまいます。
Drupalのサイト管理者は早く対応してください
これだけ攻撃方法が簡単だと、おそらくここ数日以内に攻撃が始まると思います。本件の問題に対するDrupal公式サイトのFAQを見る限り、Drupalのサイトは世界に100万サイトは存在するそうです。保守切れで放置されているサイトなど危ないと思います。
もし余裕がなければ、サイトを停止するか静的ページを表示してメンテナンス中にしておくなど、早急に暫定対応をしてほしいと思います。
追記
攻撃用のコードも公開されてしまいました。