ウィリアムのいたずらの、まちあるき、たべあるきーPART2

gooブログ「ウィリアムのいたずらの、まちあるき、たべあるき」がお引越ししてきました

Struts1.X系に脆弱性の続きー対応策、こうしろと言ってる?(中間報告:その2)

「Struts1.X系に脆弱性」の話のつづき。

Struts1.Xでの対策法が、はっきり書かれていないので、
よくわからない人が多いんじゃないか?
と思うので、対策法について、たぶん、こうしろといっている
コトについて書いておきます

(まだ、試していません。自己責任で、しんちょうに対応してください)

■まず、1.X系の対策は、どこにかいてあるのか?

ここ

Apache Struts 2の脆弱性が、サポート終了のApache Struts 1にも影響
~国内でいまだ大量稼働するStruts 1利用企業に、直ちに緩和策を~
http://www.lac.co.jp/security/alert/2014/04/24_alert_01.html

の(以下太字は上記サイトより引用)


《Struts 1の場合》
サポートが終了しているため、公式アップデートは提供されないと思われます。しかし、提供ベンダーが個別のサポートを実施していることもありますので、その場合は当該ベンダーの指示に従ってください。そうでない場合は、次のような影響緩和策が有効です。

・(2014/04/25修正)不正な文字列がパラメータに含まれる場合(正規表現:「(^|\W)[cC]lass\W」に合致するパラメータ名が含まれる場合等)にリクエストを拒否するフィルタ機能を実装する。
なお、Apache Strutsプロジェクトより公開された情報はStruts2向けの回避策ですが、こちらに掲載されている正規表現も参考になります。
・WAF、IPSなどネットワーク側で当該攻撃を遮断する。





■なにがわからないのか?
2点
(1)「WAF、IPSなどネットワーク側で当該攻撃を遮断する」は、具体的にどうすることなのか
(2)リクエストを拒否するフィルタ機能を実装する。
というのは、どういうプログラムを書いて、どう設定するのか?

以下、具体的に説明する。



■「WAF、IPSなどネットワーク側で当該攻撃を遮断する」とは

具体的には、その上に書いてある
「(正規表現:「(^|\W)[cC]lass\W」に合致するパラメータ名が含まれる場合等)にリクエストを拒否」しろといっている。つまり、URL中に、classというパラメータを含んでいたら、そのアクセスを拒否するように設定しろという意味(この設定、問題があります。最後に詳しく)




■WAFなどない場合、「リクエストを拒否するフィルタ機能を実装する」とは

struts1は、サーブレットコンテナ上で動きます。
そこで、URL中に、classというパラメータを含んでいたら、サーブレットでエラー画面に遷移するようなフィルターを作って設定せよと言う意味です。

具体的には、

2014/4/22
Apache Struts2(2.3.16、S2-020の修正版)に対するゼロディを弊社エンジニアが発見いたしました。
http://www.mbsd.jp/news20140422.html

に、「暫定対応版のソースコード」というところがある。そこをクリックして、testFilter.javaをダウンロードして、コンパイル。
 このとき、プログラムを修正しなければ、jp.mbsd.struts2というパッケージのところにできることになる。パッケージ名をみると、struts2用にみえるが、実際にはサーブレットのフィルタプログラム。
(なので、サーブレットはリンクしてコンパイルすること)

このできたプログラム(classファイル)を
WEB-INF/classes/jp/mbsd/struts2
の下におき、
WEB-INFのweb.xmlを(struts-configではない!フィルタなのでweb.xml)


Struts1.3.5でログイン処理を作る
http://daipresents.com/2008/struts135_7/


を参考に修正する。具体的には、
filterとfilter-mappingを修正する。



■問題点

このやりかたは、引数にclassというものがあった場合、
エラーになってしまう。




※ほかに、こんなやりかたを提案している人もいる

にょきにょきブログ
Struts1 の脆弱性対策について (CVE-2014-0094)(S2-020)
http://aoking.hatenablog.jp/entry/2014/04/25/103105