[CakePHP3] アプリケーションスケルトンに情報漏洩の潜在性

Potential for Information Disclosure in Application Skeleton の非公式日本語訳です。

既定のアプリケーションスケルトンは beforeRender() メソッドを含んでおり、これはアプリケーションにおいて意図しない情報漏洩につながる可能性があります。この安全でない既定のコードは 3.1.0 から 3.5.0 のアプリケーションスケルトンとして提供されていました。

危険性

既定の beforeRender フックは、 _serialize ビュー変数がコントローラー中のアクションで定義されてない場合、 JSON/XML にすべてのビュー変数を自動的にシリアライズしてしまいます。なお _serialize 変数を定義するコントローラーのメソッドについては正しく動作し、指定された変数のみを公開します。

このふるまいは AppController および ErrorController が、クライアントの Accept ヘッダーに基づいた View クラスを使用するように設定する、 RequestHandlerComponent を読み込むことによって引き起こされます。そして AppController::beforeRender() 中のコードは、明示的な変数の指定がない場合には、すべてのビュー変数をシリアライズしてしまいます。

また bake によって生成された既定のコントローラーは _serialize ビュー変数を設定するようになっています。これは影響を制限はするものの、エンティティークラスが正しく設定されていない場合には、依然として意図しない情報漏洩につながるおそれがあります。

修正方法

この情報漏洩の潜在性はアプリケーションのコードを変更することで修正可能です。残念ながら、この問題は CakePHP あるいはアプリケーションスケルトンのパッチリリースを通して解決することができません。

src/Controller ディレクトリーに ErrorController が存在しない場合

CakePHP 3.3.0 またはそれ以降をご利用で、かつ、アプリケーションが ErrorController を持っていない場合、 ErrorController をダウンロードして、 src/Controller ディレクトリーに置いてください *1

クライアントの要求に基づく JSON/XML での応答を使用しない場合

  • AppController と ErrorController の initialize() メソッドから $this->loadComponent(‘RequestHandler’) を削除してください。
  • AppController の beforeRender() から $this->set(‘_serialize’, true); を削除してください。

クライアントの要求に基づく JSON/XML での応答を使用する場合

  • AppController の beforeRender() から $this->set(‘_serialize’, true); を削除してください。
  • JSON/XML を返すべきではないすべてのコントローラーのアクションから $this->set(‘_serialize’, [ (変数名) ]) を削除してください。
  • JSON/XML を返したいコントローラーのアクションには、明示的に $this->set(‘_serialize’, [ (変数名) ]) を追加してください。

この情報漏洩については外部から報告を受けたものではなく Kurita Takashi によって発見され *2、これを開示することは重要であると認識したものです。

脚注

  1. ^ 補足すると、この手順は既定の例外ハンドラーが HttpException が投げられた場合にエラーメッセージをシリアライズしてしまうために必要になります。これは、内部用のエラーメッセージを秘匿する目的で「ページが見つかりませんでした」のような固定のメッセージを表示する 404 ページを設けていた場合に、 意図しない情報漏洩に繫がる可能性があります。
  2. ^ 正確性のために補足すると、第一報告はコアチームメンバーの Rachman Chavik 氏によって行われ 2017 年 5 月にはすでにチームとしてはこの問題を仕様として認識していましたが、私個人については、当時、開発者チャットで行われた議論を完全に見逃しており、先日、関連する PR #569 が送られるまで、まるで問題を認識していませんでした。また、 RequestHandlerComponent の仕様に対する不見識から、当初はもう少し限定的な問題と考えていましたが、 CakePHP 公式 Slack 日本語チャンネルにおいてこの問題に対する注意喚起を行った際、同チャンネル内の @icchi 氏により、さらに広範に影響を及ぼす問題であるとの指摘を受け、事態の重大性を再認識し危険性と修正方法の開示を求めたものです。
Share

コメントを残す

メールアドレスが公開されることはありません。