Struts1 の脆弱性対策について (CVE-2014-0094)(S2-020)
更新:Apache Struts2 の脆弱性対策について(CVE-2014-0094)(S2-020)
http://www.ipa.go.jp/security/ciadr/vul/20140417-struts.html
Apache Struts 2の脆弱性が、サポート終了のApache Struts 1にも影響
http://www.lac.co.jp/security/alert/2014/04/24_alert_01.html
この対策について。Struts1 について述べる。Struts2 でも有効かどうかは不明です。
まず1つ目の対策に、三井物産セキュアディレクションが公開しているフィルターがある。
Apache Struts2(2.3.16、S2-020の修正版)に対するゼロディを弊社エンジニアが発見いたしました。
http://www.mbsd.jp/news20140422.html
このフィルター以外に、もうひとつの対策として、リゾルバを差し替える方法がある。
リゾルバとは、ドット区切りの文字列を元に、対象となるオブジェクトを取得する時に呼ばれるものである。
このリゾルバ内で、 classLoader という危険な文字列が来たら、確実に存在しないプロパティ名を返せば良い。
package ...; import org.apache.commons.beanutils.expression.DefaultResolver; public class SafetyResolver extends DefaultResolver { @Override public String next(String expression) { String next = super.next(expression); if ("classLoader".equalsIgnoreCase(next)) { return ""; } return next; } }
空文字のプロパティは当然存在しないので、プロパティが操作されることは無い。空文字ではなく null を返すと NullPointerException が送出されるので、空文字を返すことを推奨する。
次に、このリゾルバを使うよう指定する。Web アプリケーションの初期化処理する箇所や、最初の方に呼び出されるクラスの static 初期化子内など、適切な箇所に記述する。
BeanUtilsBean.getInstance().getPropertyUtils().setResolver(new SafetyResolver());
以上で、クラスローダーを操作される事は無くなる。