Drupalの脆弱性情報と対応方法

Drupal7の脆弱性が発見されたため、今回は発見された脆弱性の話をしたいと思います。
インターネットに公開しているサイトは、Drupalに限らずセキュリティ対応は必須です。面倒なことかもしれませんが、ぜひ対応していきましょう。

今回のDrupalの脆弱性情報は、10/21にJCERTに公開されています。Drupal7では、脆弱性に対応したバージョン7.32がリリースされています。
Drupalの本家の情報から「きわめて危険度の高い脆弱性」のため、早急にバージョンアップすることをお勧めします。
本ブログの最後にアップデート方法を記載していますので、参考になればと思います。

今回の脆弱性の内容

今回の脆弱性は、SQL文作成時の障害で任意のSQLやPHPコードが実行される問題があります。
Webソフトウェアの代表的な脆弱性の一つにSQLインジェクションがあります。当然、Drupalではこの対応をしていたのですが、その対応箇所にバグがありました。
Drupalでは、SQLインジェクション対応でよく使われるプレースホルダを使ってSQL文を組み立てています。しかし、この対応で同じ名前の項目名が指定された時の対処が十分ではなく、予期しないSQLが実行できます。
この内容は、とても重大なセキュリティホールと言えます。

なぜ重大な問題なのか

Drupalに限らず各種のコンテンツ・マネジメント・システム(CMS)では、ログインや各ページを表示する時には動的にSQLを実行して処理をしています。何か処理する毎にSQLを実行(データベースに問い合わせ)していることになります。(なお、ページ表示する場合は、すでに存在する静的なHTMLを表示するCMSもあります。)
このSQLを実行する処理は、ページのURLの内容から問い合わせする形(SQL文を作成)となり、URL自体はユーザに見えています。このため、悪意がある人がURLを書き換えることが容易な仕組みです。Webのシステムでは、URLは書き換えられることを前提に進められています。
CMSのURLは同じソフトウェアであれば、同じ形式で実行されますので事前に予測がしやすいため、悪意がある人はソフトウェアを特定し、攻撃する行為を行います。
もちろん、誰でもがすぐに真似できる単純なURLの書き換えではないですが、インターネット上では悪用する方法など掲載されているケースもあります。
リンクはしませんが、今回のDrupalの脆弱性を突いたURLのログ情報を掲載しているサイトがありました。(掲載しているサイトは悪意があるのではなく、セキュリティの内容を解説しているブログサイトです。)

表面上は特に問題ないと思われていても、早急なバージョンアップをしましょう。

JCERTにも掲載されていますが、Drupalのバージョンアップがすぐにできない場合はパッチ情報が公開されています。一行分を変更するだけですので、この対応だけでも早急に対応されてはいかがでしょうか。

Drupalのセキュリティ情報について

Drupalのセキュリティ情報は、Drupal.orgの公式サイトの中からSecurity advisoriesで公開されています。
また、Twitterのアカウントもあります。@drupalsecurity
JCERTでは、10/21に公開されましたが、Drupalのサイトでは10/15に公開されています。いち早く情報を取得するには、今回紹介したサイトがよいと思います。

Drupal7のバージョンアップ方法

最後となりますが、Drupal7のバージョンアップ方法について紹介します。

Drupalのサイトをメンテナンスモードにします

バージョンアップ作業中にサイトにアクセスされても「メンテナンス中」と表示されますので、サイトを訪問してきた人に状況がわかって親切です。

Drupalにログインして「環境設定」を選択して、「メンテナンスモード」を選択します。

「サイトをメンテナンスモードにする」をチェックして、「設定を保存」します。
メンテナンスモード時に表示される文章についても変更が可能です。

設定を保存するとDrupalにログインしていない人がアクセスすると以下の画面が表示されます。

なお、Drupalにログインしている管理者であればページの内容が表示されますので、確認は可能です。

次にバージョンアップ作業になります。

サーバにログインして作業を進める形になります。サーバにログインしてください。
なお、以前のインストールでは、/var/www/html/drupal以下にインスト-ルしました。今回はこのディレクトリにすべてのdrupalのファイルがある前提で進めます。
なお、Drupalで利用しているデータベースのバックアップは取るようにしてください。
MySQLであれば、以下のコマンドでバックアップができます。drupalはMySQLのログイン名、drupal_dbがデータベース名です。パスワードはコマンド実行後に入力します。

mysqldump -u drupal -p drupal_db > drupal_db.dmp

まず、サーバにrootユーザでログインします。ログイン後は、以下のコマンドを実行します。

cd /var/www/html
wget http://ftp.drupal.org/files/projects/drupal-7.32.zip
unzip drupal-7.32.zip
cd drupal-7.32
/bin/cp -rp ../drupal/sites .
cd ..
chown -R apache:apache drupal-7.32
mv drupal drupal-old
mv drupal-7.32 drupal
service httpd restart

バージョンアップ後の後処理の実行

Drupalにログインしている状態で、以下のURLを実行します。いきなり英語のメッセージになりますが、そのまま「Continue」で進めてください。

http://自身のサーバ/drupal/update.php

Continue後は、バージョンアップ前のDrupalのバージョンによってメッセージがかわりますが、数秒〜数十秒後には以下ようなメッセージになります。

以上でバージョンアップが終了しました。

バージョンアップ後に確認しましょう

Drupalにログインした状態で、各種ページが正しく表示されるかやコンテンツが登録されるのを確認してください。
確認して問題なければ、「メンテナンスモード」を解除してアップデートが完了となります。

最後に

サーバにログインしての作業がありますが、DrupalではCoreと呼ばれている機能とユーザ個別の部分が完全に分離されているため(sites 以下のディレクトリが個別の情報)アップデートが簡単にできるのが特徴です。

ぜひサイトのアップデートを実施してください。