R42日記スマートフォン用の表示で見るR42日記この日記は私的なものであり所属会社の見解とは無関係です。takahashikznITmediaに寄稿しました。Webサービス好評頂いています→[クラウド帳票エンジンDocurain]2011-09-10Struts-2.2.3.1リリース(緊急度高!!)Struts2久しぶりにStruts-2.2系がアップデートされていました。緊急性の高いセキュリティFIXを行ったようです。入力フォームにエラーの値を再表示してあげるわけですが、その方式に問題がありました。入力エラー値を保持するときに、副作用として『一切のサニタイズなしで値をOGNLの式として再評価してしまう』という脆弱性が存在します。問題の箇所はcom.opensymphony.xwork2.interceptor.ConversionErrorInterceptorとcom.opensymphony.xwork2.validator.validators.RepopulateConversionErrorFieldValidatorSupportです。以下、ConversionErrorInterceptorに限定して説明しますが、RepopulateConversionErrorFieldValidatorSupportでも問題の本質は同じ。'>なんて値を入力すると、数値型への変換が失敗するのでアクションフォームへの値セットは行われないわけですが、その後、副作用的にOGNLの式として再評価されてしまうというのが、今回の脆弱性です。'>なんて入力できてしまうわけです。その結果はトンデモナイことに。ひええ!!テラヤバス本家のスレッドはコレ。it.おいオマイら、ちょっと調べてみたんだけどさ、これって思ったよりヤバイぞ!!!Jettyでも再現するし、セッションに任意の値をセットできてしまう!フォームの入力値をサニタイズしないと絶対ダメだ。一刻も早くセキュリティパッチをリリースしないと。いま、俺は他にもヤバい箇所がないか調査を継続中だ。緊迫した事態だ、という空気が伝わってきます。元のソース(注釈付き)ConversionErrorInterceptorの、問題の箇所にコメントを入れました。}}この後、どうなるのか自分なりに追っかけてみました。invocation.getStack().setExprOverrides(fakie);OgnlValueStack調査結果は以下の通り。...}修正内容パッチはコレ。@Override上記ソースのコメント『復元用の値をセーブ→後で式の再評価が走る!!』でOGNLの危険な式のままセーブしなければ良いので、このパッチでは『入力値を"Javaの文字列"化する』ように修正(escapeJava)が行われています。instrument"になる件lambda-factoryをOpenJ9で動かすおまじない月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。