Apache Struts2の任意コード実行可能な脆弱性S2-016(CVE-2013-2251)

このブログではウェブサイトやその上で動作しているウェブアプリケーションの脆弱性について紹介すると共に注意喚起をする目的でまとめられています。

今回は2013年に公表されたApache Strus2の脆弱性(S2-016)の概要、影響、対策について解説をしています。

概要

Apache Struts2(2.0.0-2.3.15)には、外部から指定した任意のプログラムを許してしまう脆弱性S2-016(CVE-2013-2251)があります。これはすなわち、インターネット経由で、攻撃者がサーバー上で勝手にプログラムを実行できるという意味です。その結果、情報漏洩、データやページの改ざん、他のサーバーへの攻撃、サービスの停止などさまざまな影響を受ける可能性があります。

Struts2には、OGNL(Object-Graph Navigation Language)というJavaに似た言語がサポートされ、Web開発をサポートしています。OGNLはStruts2の様々な場所で使えますが、外部からOGNLが指定できてしまうとセキュリティ上問題なので、外部から指定できないように制限されています。

しかし、一部に制限漏れがあり、細工したURLを閲覧することで、外部からOGNL式を指定できる箇所が見つかりまた。式には「プログラム実行」を指定することもできるため、この脆弱性は、前述のような大きな影響があります。

攻撃のイメージと影響

Struts2のサンプルアプリblankに対して、サーバー上で3 * 4の計算をするには下記のURLを実行します。

http://example.jp/struts2-blank/example/X.action?action:%25{3*4}

3 * 4のかけ算をサーバー上で計算しても実害はありませんが、同様の手順によりサーバー側で「任意のプログラム」を実行することができます。

脆弱性による影響

この脆弱性による影響の例として下記がありますが、これらに限りません。

  • Webコンテンツの改ざん
  • 情報漏えい
  • コンテンツ削除等によるサービスの停止
  • 他サーバーへの攻撃(踏み台)

脆弱性の有無の確認方法

S2-016は外部からの診断で見つけることは難しいとされており、Struts2が設置されているサーバー上で下記のコマンドを実行する方法が確実です。

# find / -name ‘struts2-core*.jar’
/var/lib/tomcat7/webapps/struts2-blank/WEB-INF/lib/struts2-core-2.3.15.jar

上記の赤字の部分がStruts2のバージョンです。上記の実行例では、2.3.15となります。2.3.15以下の数字であれば当該脆弱性があります。2.3.15.1以降であれば対策されたバージョンです。

対策

Struts2をバージョンアップすることで対策となります。前述のように2.3.15.1以降で対策されていますが、特別な事情がなければ最新版のStruts2(本稿執筆時点では2.3.16)の導入を推奨します。

Struts2のバージョンアップ自体はjarファイルの入れ替えのみであり短時間で終わりますが、バージョンアップによるアプリケーションの影響の検証が必要であり、検証には時間を要する場合があります。すぐに検証が終わらない場合や、検証の結果アプリケーションに不具合が生じてアプリケーションの改修が必要な場合は、回避策を導入する必要があります。回避策の1つとして、WAF(Web Application Firewall)の導入があります。S2-016による攻撃は特徴的であるため、WAFによる防御は有効です。

なお、デジサートの「クラウド型WAF」では、S2-016の脆弱性からウェブサイトが攻撃を受けるのを防ぐことができます。

参考文献

Apache Struts の脆弱性 (S2-016) に関する注意喚起(JPCERT/CC)
http://www.jpcert.or.jp/at/2013/at130033.html

修正の上再掲しました。

Posted in WAF