CakePHPの脆弱性を見つけた話(あるいはCakePHP Advent Calendar 2017 n日目)
年末にCakePHP 2.x系のSQL injectionを見つけたので報告してました。
詳細
内容としてはこちらの記事で書かれているようなCakePHPでよくあるSQL injectionです。
postCondition
を使うとリクエストのbodyの形からCakePHPのfindでconditionsに使う形変換されるのですが、その際にキーの値がエスケープされるかというとそうでもない状態であったということです。
これだけでしたらCakePHPの仕様であって使い方の問題ともとれるのですが、ドキュメントを見ると脆弱性が発生する形で記載されておりそれは不味いだろうということで報告しました。
public function index() { $conditions = $this->postConditions($this->request->data); $orders = $this->Order->find('all', compact('conditions')); $this->set('orders', $orders);
CakePHPの脆弱性のハンドリングは GitHub - cakephp/cakephp: CakePHP: The Rapid Development Framework for PHP - Official Repositoryで示されていたので、それに沿ってメーリングリストにメールを送って修正の方針などでやり取りしました。12/9に最初のメールを送って、修正がリリースされたのは18日です。*1
Securityコンポーネントが設定されている場合の挙動を確認していなかったのでここ数日確認しているのですが、設定している限りは多分大丈夫そうです。*2 とはいえ修正自体はシンプルなので基本的にはバージョンを上げたほうが早いでしょう。
CakePHP Advent Calendar 2017
この脆弱性は[CakePHP3] データ漏洩していませんか?RequestHandlerの危険性 - Qiitaの記事の脆弱性を確認のためCakePHPのコードを確認していたときに見つけものでした。なぜかこのアドベントカレンダーでは脆弱性の話が多かったような気がします。
- 7日目 [CakePHP3] データ漏洩していませんか?RequestHandlerの危険性 - Qiita
- 10日目 CakePHPのセキュリティー診断への対応まとめ - Qiita
- 12日目 CakePHPではDBカラムのSQLインジェクションに注意! - Code Day's Night
*1:その間にid:ichikaway さんのピンポイントな記事が公開されたのでドキッとしました
*2:少し怪しいところは見つけたのですが、存在しないテーブルがwhere文に入ってエラーになるのを回避する方法が思い浮かばない……