Spring MVC に 2 件の脆弱性

Spring MVC に 2 件の脆弱性が存在するよという TSS の記事。でも、正しくプログラミングしていれば問題ないはず。

以下、内容を簡単に紹介…とは言っても私自身は Spring MVC を使ったことがないので、出来ればちゃんと上記のページを読んでほしい。

Data Submission to Non-Editable Fields

Spring の WebDataBinder の実装がデフォルトで安全側に振られていないことに端を発する問題。WebDataBinder はクライアントから送られてきたリクエストパラメータをコマンドオブジェクト*1に格納するためのコンポーネント

WebDataBinder はフォーム(やクエリストリング)経由で送出されたリクエストパラメータをコマンドにマッピングするために使われるが、デフォルトでは全てのリクエストパラメータをコマンドのプロパティにマッピングしようとする。攻撃者はマッピング対象となるコマンドのプロパティ名さえ知っていれば、そのパラメータ名と同一の名前を持つリクエストパラメータを追加で送出することによって、開発者側が意図していなかったプロパティに勝手に値を潜り込ませることが可能になる。

この問題を防ぐには、checkAllowedFields() によってマッピングを許可するプロパティ名を事前に定義しておけばよい。これによって、意図しないリクエストパラメータがコマンドのプロパティにマッピングされてしまうことはなくなる。

ModelView Injection

Spring MVC では MVC の View として View というオブジェクトを利用するが、これは名前によってアプリケーションから指定される。もしこの名前として、ユーザがリクエスト経由で送出した文字列をそのまま使っている場合、ユーザが任意の View を選択できるようになってしまう、というもの。

これはただ単に、View の選択にユーザが送ってきた文字列を使わないというだけで防止できる。

*1:Spring MVC で、リクエストパラメータを格納するために使われる Bean のこと。