オープンソースの脆弱性対策に学ぶ ~DrupalのSQLインジェクション対策(SA-CORE-2015-003、CVE-2015-6659)~ 1/4
ここ数年、個人情報の漏えいや不正アクセスといったセキュリティ事故のニュースが毎日のように流れ、全く衰える気配を見せません。
今や、システムを開発する技術者にとってもセキュリティは欠かせない技術との認識が広まり、セキュリティ事故の原因となる脆弱性(ぜいじゃくせい)を作りこまないために、セキュアコーディングを学んでらっしゃる方も多いことでしょう。
セキュアコーディングの学び方については、社内研修を受ける、インターネットや書籍を講読するなどいろいろあるかと思いますが、ここでは「オープンソースの脆弱性対策に学ぶ」と題して、具体的な事例を紹介し、学びにつなげていこうと思います。
今回はDrupalのSQLインジェクション対策に学びます。
Drupalとは?
Drupal(ドルーパル)は、PHPで記述されたオープンソースのコンテンツ管理システム(CMS)です。
公式サイトはこちら(https://www.drupal.org/)になります。
2015年8月19日にリリースされましたDrupal ver.7.39(https://www.drupal.org/drupal-7.39)では、複数の脆弱性(https://www.drupal.org/SA-CORE-2015-003)の対策を行っています。
その中に大変危険なことで有名なSQLインジェクションの脆弱性が含まれていました。
早速、どのような対策を行ったのか確認してみましょう。
こちらでver.7.39のソースコードのcommitの差分(http://cgit.drupalcode.org/drupal/commit/?id=be00a1ced4104d84df2f34b149b35fb0adf91093)を確認することができます。
以下に要点だけ抜粋します。
/includes/database/database.inc 変更前
protected function filterComment($comment = '') {
return preg_replace('/(\/\*\s*)|(\s*\*\/)/', '', $comment);
}
/includes/database/database.inc 変更後
protected function filterComment($comment = '') {
return strtr($comment, array('*' => ' * '));
}
どうやらSQLコメントの位置に埋め込む値に対する無害化処理の実装を変更しているようです。
変更前は正規表現を使用して、「/* 」や「 */」といった部分文字列を見つけて除去(空文字に置換)するように記述されています。
いろいろ勉強になりそうな予感がします。