入力値チェックが回避される脆弱性対策
影響を受けるアプリケーション
IPAの解説にあるように、入力値チェックが回避されてしまうこの問題は、Validatorを実装したすべてのアプリケーションに影響する。Cancel機能による入力値チェックの回避で例を挙げたように、Cancelタグを使用していないから関係ない、という問題ではなく、Action#isCancelledメソッドによるCancel状態のチェックを行っていないアプリケーションであれば影響が及ぶ。
バージョンアップができる場合の対策
バージョンアップが可能な環境なら、Struts 1.2.9、Struts 1.3.0へバージョンアップすることにより、問題が解決できる。
バージョンアップができない場合の対策
対策が必須とはいえ、バージョンアップが難しい環境もあるだろう。以下に対策例をいくつか挙げるので、実現可能な手法を選択し、何らかの対策を取ることを検討していただきたい。
- すべてのActionクラスでisCanceledメソッドを呼び出し、チェックする
すべてのActionクラスでisCanceledメソッドを呼び出し、チェックするように実装すれば、問題を解決することが可能である。Cancel機能を使用しないアプリケーションにおいてtrueが返されたら、特定のページに遷移させるように実装すればよい。
- ベースActionクラスを作成し、Cancel時のデフォルト動作を宣言しておく
あらかじめ基底Actionクラスを使用しているような環境ならば、基底Actionクラス内で、protectedメソッドとして、Cancel時のデフォルト動作を宣言しておけばよいだろう。1.と同じくCancel機能を使用しないアプリケーションにおいてtrueが返されたら、特定のページに遷移させるように実装すればよい。
- RequestProceserを書き換えてCancel機能を無効にする
Cancel機能はDispatchActionの仕組みで代替実装が可能なため、Cancel機能自体を使用していない環境も多いだろう。その場合は、RequestProceserをカスタマイズしてCancel機能を無効にしてしまうことでも、対策することが可能だ。
Cancel機能を無効にするための実装例を以下に記述する。
(1)struts-config.xmlのcontroller要素で設定されているRequestProcessorのサブクラスを作成し、processValidateメソッドをオーバーライドする。
public class CustomRequestProcessor extends TilesRequestProcessor {
protected boolean processValidate(HttpServletRequest request,
HttpServletResponse response,
ActionForm form,
ActionMapping mapping)
throws IOException, ServletException {
//cancel機能を無効化
request.setAttribute(Globals.CANCEL_KEY, null);
return super.processValidate(request, response, form, mapping);
}
}
(2)作成したクラスを使用するように、struts-config.xmlを修正する。
processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>
↓
processorClass="jp.mbsd.action.CustomRequestProcessor"/>
以上、Struts 1.2.8以前のバージョンに存在する脆弱性を中心にValidatorプラグインを使用する際の注意点について解説した。繰り返しになるが、大きな危険を持つ脆弱性であるため必ず対策を取るようにしていただきたい。
Profile
安西 真人(あんざい まさと)
三井物産セキュアディレクション株式会社
テクニカルサービス事業部 技術グループ Webセキュリティチーム
エンジニア
Webアプリケーションのシステム開発経験を生かし、セキュリティコンサルタントとして主にWebアプリケーションのセキュリティガイドライン策定業務などに従事している。大手保険会社、出版社などへの導入実績を持つ。
Copyright © ITmedia, Inc. All Rights Reserved.