Edited at
CakePHPDay 10

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

More than 1 year has passed since last update.

CakePHP Advent Calendar 2017、第10日目です!

昨日は @sizuhiko さんのCakePHP3 のアプリケーションを Behat でテストする でした。

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

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

セキュリティ診断レポート

対応ログ(原文)


認識された脆弱性


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

エンティティを生成するコードは、フィールドのホワイトリストを生成するように更新されています。#359で修正され cakephp/bake 1.3.2 で適用 (原文は(cakephp / bake 1.4.2でリリースとなっているがおそらく誤植)

これにより、Mass Asssignment される属性がより可視化されることが期待されます。

互換性を大幅に損ねてしまうため、ホワイトリストにない追加の属性がPOSTデータに含まれていた場合でも例外のthrowは行いません。将来のリリースでは、大量割り当てを緩和するための追加の方法を検討します。

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


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

デフォルトのテンプレートエンジンには、グローバルな方法で自動エスケープを有効にする方法がないため、修正は実施していません。

次のメジャーリリースでは、自動エスケープを提供するデフォルトのテンプレートエンジンとして Twig を採用する予定です。


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

#11092 で修正され Release/3.5.1 で適用されました。

assetUrl()の中に、ある条件のときにURLエンコードされない場合が存在します。

=> 上記は #11430 で修正されRelease/3.5.6 で適用されました。


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

#11092 で修正され Release/3.5.1 で適用されました。

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

- FormHelper::button()

- FormHelper::postLink()


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

#11093 で修正され Release/3.5.1 で適用されました。


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

#11094 で修正され Release/3.5.1 で適用されました。

このあたり知らなかったので調べました。 PHPで日本語の資料だとだとphpcon2013の発表資料が一番詳しかったので載せておきます。

(参考)

XML と PHP のイケナイ関係 (セキュリティ的な意味で)


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

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

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


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

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

#11095 でユーザーが存在するときと同様の処理を入れる修正が行われ Release/3.5.1 で適用されました。


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

#11096 でタイミング攻撃緩和に有効なhash_equalsでの比較に修正が行われ Release/3.5.1 で適用されました。


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

cakephp/bookmarker-tutorial@b97283 で修正が行われました。

このissueはすでにアプリケーションスケルトンで修正を行っていました。しかしブックマーカーチュートリアルのアプリケーションでは対応が遅れていました。


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

#11102 で修正が行われ Release/3.5.1 で適用されました。


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

#11338 で新たなバージョンの追加と該当プロトコルの非推奨化をする修正が行われ Release/3.5.5 で適用されました。

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


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

#11101 で新たなバージョンの追加と該当プロトコルの非推奨化をする修正が行われ Release/3.6.0 で適用されました。

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


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

#11101 で新たなバージョンの追加と該当プロトコルの非推奨化をする修正が行われ Release/3.6.0 で適用されました。

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


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

#11100 で修正が行われ Release/3.5.1 で適用されました。


その他の問題


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

#11117にてドキュメントが更新されました


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

まだ修正の対応は行っていません。

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


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

#11104 で修正が行われ Release/3.5.1 で適用されました。

今後の各マイナーリリースでCAバンドルを更新する予定です。


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

#11142 で修正が行われ Release/3.5.2 で適用されました。

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


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

#11103 で修正が行われ Release/3.5.1 で適用されました。


最後に

一つ一つレポートを読んでいくと、セキュリティーレポートを書く側がソースレベルまで調べて詳細にレポートしてくれていることに驚きましました。

そして、しっかりと対応をしてくださるコミュニティーの皆様には感謝感謝です

今回のレポートリーディングは今まで意識が薄れていた観点などに改めて気づく良いきっかけにもなりました。 @mosaxiv さんが 7日目の記事 で書いていただいたように、AppControllerのスケルトンコードでも脆弱性の話が最近出ましたので、こちらもご一読ください

明日は @Khigashiguchi さんです!