CakePHPのセキュリティー診断への対応まとめ

CakePHP Advent Calendar 2017、第10日目です！
昨日は @sizuhiko さんの[CakePHP3 のアプリケーションを Behat でテストする](https://qiita.com/sizuhiko/items/3441f9c3532892d15307) でした。

当初CakePHPに管理が移ったmigrationツールの[Phinx](https://phinx.org/)について書こうかなと思っていたのですが、紹介したかったPRを出すに至らなかったので、2017/11/22 に公開された [Mozillaによるセキュリティ診断結果]
(https://bakery.cakephp.org/2017/11/22/mozilla_sos_audit_published.html) について書こうと思います。



基本的にはバージョンの更新で対応が可能かと思いますが、機能をオーバーライドしている拡張や、bakeで生成されるソースへの脆弱性などはユーザー側でも対応の検討が必要と思われますので、CakePHPコミュニティが公開している対応ログを紹介します。

[セキュリティ診断レポート](https://wiki.mozilla.org/images/4/40/Cakephp-report.pdf)
[対応ログ(原文)](https://docs.google.com/document/d/1oJg5XqEZasm6RE-Ql7D7OUSiUhXFKApCPMwZxFaq0W8/view)

# 認識された脆弱性

## 001: Bakeしたコードで Mass Assignment ができてしまう (High)

エンティティを生成するコードは、フィールドのホワイトリストを生成するように更新されています。[#359](https://github.com/cakephp/bake/pull/359)で修正され [cakephp/bake 1.3.2](https://github.com/cakephp/bake/releases/tag/1.3.2) で適用 （原文は（cakephp / bake 1.4.2でリリースとなっているがおそらく誤植） 
これにより、Mass Asssignment される属性がより可視化されることが期待されます。
互換性を大幅に損ねてしまうため、ホワイトリストにない追加の属性がPOSTデータに含まれていた場合でも例外のthrowは行いません。将来のリリースでは、大量割り当てを緩和するための追加の方法を検討します。


すでにアプリケーションを作成している場合は脆弱性のチェックを行ったほうが良いと思います。

## 003: 安全でないHTMLテンプレートを使用している (Medium)

デフォルトのテンプレートエンジンには、グローバルな方法で自動エスケープを有効にする方法がないため、修正は実施していません。
次のメジャーリリースでは、自動エスケープを提供するデフォルトのテンプレートエンジンとして [Twig](https://twig.symfony.com/) を採用する予定です。

## 004: `HtmlHelper`の複数のメソッドでURLエスケープが行われていない (Medium)

[#11092](https://github.com/cakephp/cakephp/pull/11092) で修正され [Release/3.5.1](https://github.com/cakephp/cakephp/releases/tag/3.5.1) で適用されました。

assetUrl()の中に、ある条件のときに[URLエンコードされない場合](https://github.com/cakephp/cakephp/blob/0c88f6365f85e0659ff6cf571a3b709077fc11e9/src/View/Helper/UrlHelper.php#L161-L163)が存在します。
=> 上記は [#11430](https://github.com/cakephp/cakephp/pull/11430) で修正され[Release/3.5.6](https://github.com/cakephp/cakephp/releases/tag/3.5.6) で適用されました。

## 005: `HtmlHelper`の属性値がエスケープされていない

[#11092](https://github.com/cakephp/cakephp/pull/11092) で修正され [Release/3.5.1](https://github.com/cakephp/cakephp/releases/tag/3.5.1) で適用されました。

==> 自分が開発時に気づいたことで別件となりますが、`FormHelper`では`escape`がデフォルトで`false`になっているメソッドが幾つか存在します。
- `FormHelper::button()`
- `FormHelper::postLink()`

## 015: 不正にX-Forwarded-Forヘッダー解析することでIPのなりすましができる (Medium)

[#11093](https://github.com/cakephp/cakephp/pull/11093) で修正され [Release/3.5.1](https://github.com/cakephp/cakephp/releases/tag/3.5.1) で適用されました。


## 018: XMLエンティティの拡張によるサービス停止 (Medium)

[#11094](https://github.com/cakephp/cakephp/pull/11094) で修正され [Release/3.5.1](https://github.com/cakephp/cakephp/releases/tag/3.5.1) で適用されました。

このあたり知らなかったので調べました。 PHPで日本語の資料だとだとphpcon2013の発表資料が一番詳しかったので載せておきます。
(参考）
[XML と PHP のイケナイ関係 (セキュリティ的な意味で)](https://www.slideshare.net/ebihara/phpcon-2013xmlphpvuln)

## 009: `randomBytes`は安全でない乱数を返します (Low)

[#11099](https://github.com/cakephp/cakephp/pull/11099) で必要な関数がなかった場合にはランタイムエラーの例外をthrowするように修正され [Release/3.6.0(https://github.com/cakephp/cakephp/releases/tag/3.6.0) で適用されました。（原文時点ではリリース前)

例外を追加している変更で、既存アプリケーションの予期しないエラーを引き起こす可能性があるため、マイナーリリースにでの適用になりました。

## 010: ユーザー列挙タイミング攻撃の緩和を伝える誤ったコメント (Low)

実際はすぐにreturnして応答差が発生するコードになっていたのにもかかわらず、ユーザー列挙攻撃緩和のための処理を入れているとのコメントが書かれたままになっていたようです。

[#11095](https://github.com/cakephp/cakephp/pull/11095) でユーザーが存在するときと同様の処理を入れる修正が行われ [Release/3.5.1](https://github.com/cakephp/cakephp/releases/tag/3.5.1) で適用されました。


## 012: ダイジェスト認証で非定時比較が使われている (Low)


[#11096](https://github.com/cakephp/cakephp/pull/11096) でタイミング攻撃緩和に有効な`hash_equals`での比較に修正が行われ [Release/3.5.1](https://github.com/cakephp/cakephp/releases/tag/3.5.1) で適用されました。


## 014: チュートリアルアプリケーションの`PageController`でPathトラバーサルが可能  (Low)

[cakephp/bookmarker-tutorial@b97283](https://github.com/cakephp/bookmarker-tutorial/commit/b972831eb344dd9fedacea87e7bfd0e11dd23f82) で修正が行われました。
このissueはすでにアプリケーションスケルトンで修正を行っていました。しかしブックマーカーチュートリアルのアプリケーションでは対応が遅れていました。

## 016: `TextHelper::autoLinkUrls()`で予測可能で衝突の起こりやすいハッシュが使われている (Low)

[#11102](https://github.com/cakephp/cakephp/pull/11102) で修正が行われ [Release/3.5.1](https://github.com/cakephp/cakephp/releases/tag/3.5.1) で適用されました。


## 019: 安全でないトランスポート暗号化プロトコルがサポートされている (Low)

[#11338](https://github.com/cakephp/cakephp/pull/11338) で新たなバージョンの追加と該当プロトコルの非推奨化をする修正が行われ [Release/3.5.5](https://github.com/cakephp/cakephp/releases/tag/3.5.5) で適用されました。

また、非推奨となったものは`4.0.0`で削除される予定です


## 020: フォームバリデーショントークンがユーザーと関連付いていない (Low)

[#11101](https://github.com/cakephp/cakephp/pull/11101) で新たなバージョンの追加と該当プロトコルの非推奨化をする修正が行われ [Release/3.6.0](https://github.com/cakephp/cakephp/releases/tag/3.6.0) で適用されました。

トークン形式を変更すると、古いバージョンのアプリケーションで生成されたフォームのすべてのトークン検証が失敗するため、マイナーリリースに移行されました。アプリケーションコードを破損させるこのリスクはパッチリリースに属さないと感じたためです。


## 021: フォーム検証トークンは潜在的なハッシュ衝突に対して脆弱です (Low)

[#11101](https://github.com/cakephp/cakephp/pull/11101) で新たなバージョンの追加と該当プロトコルの非推奨化をする修正が行われ [Release/3.6.0](https://github.com/cakephp/cakephp/releases/tag/3.6.0) で適用されました。

詳しくは`020`を参照ください

## 022: `AssetMiddleware` がドットファイル（隠しファイル）を提供できてしまう (Low)

[#11100](https://github.com/cakephp/cakephp/pull/11100) で修正が行われ [Release/3.5.1](https://github.com/cakephp/cakephp/releases/tag/3.5.1) で適用されました。



# その他の問題


## 002: エンティティ属性のSetterが常に呼び出されるわけではない (Informational)

[#11117](https://github.com/cakephp/cakephp/pull/11117)にてドキュメントが更新されました


## 006: 安全でないデフォルトハッシュアルゴリズム (Informational)

まだ修正の対応は行っていません。 
デフォルトのハッシュタイプを変更することは、既存のアプリケーションを破壊する可能性のある危険な変更です。 4.0.0ではデフォルトをsha256に変更します。

## 007: 証明機関のバンドルには信頼できないCAが含まれています (Informational)

[#11104](https://github.com/cakephp/cakephp/pull/11104) で修正が行われ [Release/3.5.1](https://github.com/cakephp/cakephp/releases/tag/3.5.1) で適用されました。
今後の各マイナーリリースでCAバンドルを更新する予定です。


## 008: `Text::uuid()`が安全ではありません (Informational)


[#11142](https://github.com/cakephp/cakephp/pull/11142) で修正が行われ [Release/3.5.2](https://github.com/cakephp/cakephp/releases/tag/3.5.2) で適用されました。

この修正は、安全なランダム整数ソース`random_int()`が使える環境での条件付き適用となります。


## 011: ダイジェスト認証はノンスを構築するMD5アルゴリズムを使用しています (Informational)

[#11103](https://github.com/cakephp/cakephp/pull/11103) で修正が行われ [Release/3.5.1](https://github.com/cakephp/cakephp/releases/tag/3.5.1) で適用されました。


# 最後に

一つ一つレポートを読んでいくと、セキュリティーレポートを書く側がソースレベルまで調べて詳細にレポートしてくれていることに驚きましました。
そして、しっかりと対応をしてくださるコミュニティーの皆様には感謝感謝です


今回のレポートリーディングは今まで意識が薄れていた観点などに改めて気づく良いきっかけにもなりました。 @mosaxiv さんが [7日目の記事](https://qiita.com/mosaxiv/items/2ec84d2b2ec352e08e50#%E5%8E%9F%E5%9B%A0) で書いていただいたように、AppControllerのスケルトンコードでも脆弱性の話が最近出ましたので、こちらもご一読ください

明日は @Khigashiguchi さんです！