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());

以上で、クラスローダーを操作される事は無くなる。