SDE最新状況のご紹介 - NEC(Japan)

Struts1.xの脆弱性(CVE-2014-0114)
に対するSDEの対処:推奨タイプ
(サンプルソースコードの公開)
日本電気株式会社
2014年6月17日
対処内容の概要
▐ BeanUtilsを利用した変数コピー処理に対して、拡張機能(override)
を利用して操作しているメソッド(populate)内でチェック処理を追加
し、問題のあるパラメータを排除します。
web.xml
※監視のために排除時に双方式ともエラーログを出力します。
ServletContextListener
ServletContextListener
ブラウザ
StrutsV1.x
リクエスト
リクエスト
abc=123
class.ClassLoader.xxx=yyy
通常のリクエスト「abc=123」
以外に
「class.ClassLoader.xxx=yyy」
を付加して送信
abc=123
class.ClassLoader.xxx=yyy
setAbc(“123”)
getClass().getClassLoader().setXxx(“yyy”)
populate()
エラーログを出力
BeanUtilsBean.populate
setAbc(“123”)
Formクラス
© NEC Corporation 2014
パラメータ排除
setAbc(“123”)
getClass().getClassLoader().setXxx(“yyy”)
BeanUtils呼び出し処理
Public void setAbc(String abc){
this.abc = abc;
}
Page 2
Inner Class
SampleBeanUtilsBean
適用要件および注意事項(1/2)
▐ 本対処を適用した場合、リクエストパラメータの属性名(一部を含
む)に対して「class」あるいは「Class」という単語を含むことが
できなくなります。該当の属性名を使用している場合は、属性名の
見直しをお願いします。
Grepツールの仕様
チェック用正規表現
\W(英数字および”_”以外)をサポート
(^|\W)[cC]lass\W
\Wを未サポート
(.*\.|^|.*|\[('|"))(c|C)lass(\.|('|")]|\[).*
▐ チェック対象となる文字列例を下記に記載いたします。
 チェック対象外の文字列
• classic
• FirstClass
 チェック対象の文字列
• .Class.
Page 3
© NEC Corporation 2014
適用要件および注意事項(2/2)
▐ 以下のメソッドの動作が変更されるために、該当メソッドに依存す
る機能がある場合は影響調査する必要があります。
org.apache.commons.beanutils.BeanUtils#populate(Object bean, Map
properties)
具体的には、引数properties中に“class”または“Class”が含まれる
キー属性のエントリーは引数beanに対して移送処理が行われなくな
ります。本条件に該当しない場合、本回避策による影響はございま
せん。
Page 4
© NEC Corporation 2014
適用手順
① 本対処を実現したソースコードを実装する
※実装サンプルは下記にて公開しています。
★http://jpn.nec.com/SystemDirectorEnterprise/dl/notice/SampleServletContextListener.java
② web.xml の web-app.listener 要素に Servletコンテキストリスナの設定を
追記する
③ ビルド・デプロイを実施する
Page 5
© NEC Corporation 2014
テスト実施手順
GETメソッドの場合
▐ 正常動作する画面のURLに「?class.ClassLoader.xxx=yyy」を付加して実行
例:正常に動作するURL「http://localhost/Sample/TestAction.do」の場合
「http://localhost/Sample/TestAction.do?class.ClassLoader.xxx=yyy」をブラウ
ザで表示
▐ 上記URLを実行した場合に正常に画面が表示され、ログファイルに以下の文
字列が出力されるかを確認
「malicious access detected, key = class.ClassLoader.xxx value = yyy」
POSTメソッドの場合
▐ 正常動作する画面に以下のhidden項目を追加
<input type=“hidden” name=“class.ClassLoader.xxx” value=“yyy”>
▐ 上記画面を実行した場合に正常に画面が表示され、ログファイルに以下の文
字列が出力されるかを確認
「malicious access detected, key = class.ClassLoader.xxx value = yyy」
Page 6
© NEC Corporation 2014