元記事はこちら。
CakePHPコアチームは CakePHP2.3.6[1]が入手可能になったことをお知らせいたします。2.3.6は2.3系のバグフィックスリリースになります。2.3.5のリリース以降、64のコミットが行われ、17のチケットが解決されました。
変更点の概要は以下のとおりです:
- CakeTime内のDatetime比較がより正確になった
- FormHelperは複数レコードの保存を行う場合でもフォームのエラークラスを適切にマークするようになった
FormHelper now correctly marks fields with error classes on forms that save multiple records. - Controller::$modelClassはコンポーネントが初期化される前にセットされるようになった
- CakeEmailのファイル読み込み機能がクラスの外でも利用可能になった
- 日本語のメッセージでのEmailコンポーネントの改行処理が改善された
- $tagがfalseの場合にHtmlHelper::tag()が内容を返すようになった
- ControllerTestCase::testAction()を使用している場合に、モックのコンポーネントが利用可能になった
- HtmlHelper::script() と HtmlHelper::scriptBlock() を使用している場合に、type属性がセットできるようになった
- SmtpTransportの設定で、空の配列を渡してリセットすることができなくなった
- SimpleXmlElementで、XMLパースエラーの場合にXmlExceptionをスローするようになった
- FormHelperは複数選択の要素でoptionsを使用不可にできるようになった
- TranslateBehaviorは行の更新/追加時には常にエイリアスではなく$nameを使用するようになった
- Cookieの有効期限が遠い将来の場合に、32ビットシステムでも正しく動作するようになった
- FileEngineは異なるプリフィクスを使用している場合でもグループを正しくクリアできるようになった
セキュリティ面で発覚したこと
最近3つのセキュリティリリースを実施しました。オープンで、透過的でありたい、先の誓約を守りたいという点から、各問題に関して詳細を示すことにします。
認証フォーム
認証フォームはPOSTデータを追加することで、クエリ操作によって攻撃されやすい箇所です。SecurityComponentによって保護されていないフォームは攻撃されやすい箇所です。ログインフォームが以下のようであるとします:
Submitする前に、攻撃者はフォームに以下のHTMLを追加します:
フォームが送信されると、ユーザログインの$conditions(条件)は以下のようになります:
"OR" => array( "id like" => 1, "username like" => "%admin%" )
blowfish認証を追加した際、不意に導入されてしまいました。ユーザ認証ではスカラーでない条件を失敗とみなすことで解決しています。この問題はこのコミットで解消されています。Magnus Anderssonの報告とパッチの作成に感謝します。
ページネーションを使ったSQLインジェクション
ページネーションURLにモデルのエイリアスを使用している場合、任意のSQLにが実行できてしまいます。この問題は1.2、1.3、2.xのリリースに影響があります。5年ほど前に不意に導入されてしまいました。PaginatorComponentはフィールド名だけを検証し、モデルのエイリアスまでは検証していませんでした。エイリアスにSQLを含む場合、実行されてしまうということです。
例として、以下のようなURLです:
http://yourtest.com/users/index/sort:id%20LIMIT%2010;delete%20FROM%20%60contacts%60;.id
上記の例では、ページネーションリクエストにDELETEクエリを注入しており、ソートキーとして指定しているためサニタイズされずに実行されます。この問題はユーザデータを無視し、既知のモデルエイリアスを使用するようにこのコミットで修正されています。’Ahmad’のlighthouseでの報告とCakePHPチームへの修正のヘルプに感謝します。
Cross site scripting through webroot
URL操作により、攻撃者は任意のJavascriptを実行できるエラーページを生成できてしまいます。リクエストオブジェクトのwebrootプロパティが、ユーザの入力があるにもかかわらず誤って安全とされてしまっていました。
以下は一例です:
http://example.com/index.php/%3E%22%3E%3Cscript%3Ealert%28%27hehe%27%29;%3C/script%3E%3Clink%20href=%22HTTP/1.0%22%3C
この問題の解決策は、リクエストオブジェクトが生成されたら、ユーザが提供したwebrootプロパティをurlencodeするというものです。生成されたURLはすべて通常のコンテキストとして保持されるということです。この修正はこのコミットで適用されました。
セキュリティの問題を報告し、修正に協力してくれた皆さんすべてに感謝します。CakePHPを作り続ける支援をしてくださるすべての皆さんに感謝します。あなたがいなければCakePHPは存在しません。