2010/11/13 に出たらしい http://bakery.cakephp.org/articles/markstory/2010/11/13/cakephp_1_3_6_and_1_2_9_released を読んでびっくりしたんですが、 Twitter を軽く検索した限りだと CakePHP ユーザでない僕が気づいているのに (日本の) CakePHP ユーザさんたちがどうも気づいていないっぽいのでわかりやすくまとめてみることにしました! CakePHP には任意の PHP コードが実行できる致命的な脆弱性があります! 影響のあるサイト結構ありそうですが悪用厳禁です!
※通常リリースの告知のなかにこんな致命的な脆弱性に関する情報を思いっきりわかりにくく書いちゃうのはひどいなあと思うので、ユーザの方は CakePHP に文句を言うといいと思います。僕は CakePHP ユーザじゃないのでやめておきます。
脆弱性の概要
僕は Secunia のアドバイザリを見て脆弱性の存在を知りました。
http://secunia.com/advisories/42211/
オリジナルのアドバイザリは http://malloc.im/CakePHP-unserialize.txt と書いてありますね。とてもわかりやすかったです。
僕は CakePHP を使わないんでよくわからないんですが、要約するとこういうことらしいです。
- Security コンポーネントを使うと CSRF 攻撃の防御機構が _validatePost() という関数 (もしくはなんかのメソッド?) でおこなわれる
- CSRF 対策用のトークンは data[_Token][fields] に入っていて、値の形式は $token:$locked という形式らしい
- この $locked という値は serialize() でシリアライズした配列に str_rot13() による rot13 変換をおこなったものらしい
- CakePHP のデフォルトの設定のまま、キャッシュにファイルストレージを使用するようにしている場合、 Configure のデストラクタでキャッシュファイルが書き込まれるらしい。この書き込むキャッシュの内容に 3. の $locked の値が含まれてしまうっぽい (なんで????)
- 次回のリクエスト時に、 4. で書き込んだキャッシュファイルを PHP コードとして実行する。ということは、 3. の $locked に実行可能な PHP コードが入っていたらそれを実行してしまうのでは? という話らしい
※なんども言いますが僕は CakePHP ユーザじゃないので正直なところよくわかっていません><
影響するシステム
未対策バージョンの CakePHP で、ファイルストレージに設定のキャッシュを作るようになっていて、 Security コンポーネントを使った CSRF 攻撃対策を利用している場合にこの脆弱性の影響を受けるらしい。
再現
とりあえず再現のために、ローカルに CakePHP のプロジェクトを作ってみることにしました。 CakePHP はちょっとしか使ったことがないので、チュートリアルを見ながらちょちょいと作ってみたコードが以下です。ベースとなる CakePHP には 1.3.5 を選びました。
https://github.com/ebihara/burn-cake
(素の CakePHP に対して、再現に必要なファイル群を app 以下に追加していった時の差分は https://github.com/ebihara/burn-cake/compare/89bb952eca...a79f3ce2b8 から見れます)
オリジナルのアドバイザリには PoC として http://malloc.im/burnedcake.py がついていました。これは、外から config/database.php の設定値を表示させてしまうスクリプトです。 ところがこれを実行して再現できるかと思ったら、どうもうまくいきませんでした。
しょうがないのでこのスクリプトを参考に PHP で書きなおしたのが以下です(いま思うと、 Cookie を送信していなかったのがいけなかったっぽい)。ついでにサーバに実行させる PHP コードを変更できるようにもしておきました。
https://gist.github.com/702208
このスクリプト中の以下の部分を、環境に合わせて書き換えて……
実行するだけ!
はい、 config/database.php の中身が閲覧できてしまいました><
まとめ
- CakePHP には任意の PHP コード実行の脆弱性があった
- 修正されたけれども、告知がどうもわかりにくく、対策していないサイトが多いと思われる
- Twitter 等を見てもあまり騒がれていないようだ
- 攻撃用のコードも存在する
という状況なので、 CakePHP でサイトを運営している方々は早急な対応をオススメします。
※ところで、なんでこれが騒がれていなかったのか理解に苦しむのですが、もしかしてみなさん本家のブログ記事とか読んでいらっしゃらないわけですか? まさかね。僕が騒いでいる様子を探せていなかっただけですよね。