LoginSignup
1
1

More than 5 years have passed since last update.

Apache Struts2にリモートコード実行(RCE)の脆弱性(S2-057、CVE-2018-11776)

Last updated at Posted at 2018-08-22

はじめに

本日(8/22)、最新のリモートコマンド実行脆弱性(S2-057)が公開され、8/22の夜中にはPoCが公開されました。
脆弱な条件はいろいろあるみたいだけど、正確なのはJPCERT/CCだと思ってる。
検証の結果、やっぱりalwaysSelectFullNamespaceがTrueである必要があるみたいです。

脆弱性の概要(直訳)

名前空間を持たず、上位アクションにも名前空間を持たない/ワイルドカードを利用している場合、リモートでコードが実行される可能性があります。

影響範囲のバージョン

Struts 2.3 - Struts 2.3.34
Struts 2.5 - Struts 2.5.16
Strutsのサイトでは、サポート以前のバージョンは未確認とのことですが、検証した2.2系のもOGNLは解釈してくれました。

脆弱性の条件

JPCERT/CCはalwaysSelectFullNamespaceに関して言及していませんが、OGNLの解釈を成功するためにはTrueにする必要があります。

【IPA】
1と2を両方満たす場合、脆弱である。
1.alwaysSelectFullNamespace を true に設定している場合
2.Struts設定ファイルに、オプションのnamespace属性を指定しないか、ワイルドカードネームスペースを指定する "action"タグまたは "url"タグが含まれている場合

【JPCERT/CC】
どれか満たせば、脆弱である。
・Struts の設定ファイル(struts.xml など) で namespace の値が指定されていない
・Struts の設定ファイル(struts.xml など) で ワイルドカードが指定されている
・URL タグの記述において value かaction の値が指定されていない

検証結果

参考URLのPoCを参考に、特にalwaysSelectFullNamespaceに関する検証を実施しました。
結論として、strutsのデフォルト設定(alwaysSelectFullNamespaceはFALSE)では、OGNLが解釈されて、コード実行できました。

Strutsのデフォルト設定は、Strutsの/WEB-INF/lib 中の struts2-core-2.x.x.x.jar ファイルを展開し、org/apache/struts2/default.propertiesを見ることでわかります。

struts.xmlにalwaysSelectFullNamespaceをFALSEにすれば成功しませんでしたが、Strutsのデフォルト設定で成功したので、IPAが記載している成功条件のalwaysSelectFullNamespaceをTrueというのは違う気がしてます。(PoCも設定してませんしね)

struts.xmlにちゃんとalwaysSelectFullNamespaceをFALSEと書いたら成功しないので、対策としてはちゃんと指定するといったところでしょうか。

(8/27追記)
showcaseには、struts2-convention-plugin-*.*.*.jarというものは含まれています。
このjarを展開してやると、struts-plugin.xmlがあり、ここにalwaysSelectFullNamespaceがTrueと記載されておりました。
このxmlをFalseにしてやれば、コード実行は成功しませんでしたので、成功条件にはTrueが必要であることがわかりました。

PoCが成功すると、以下のようなURLにリダイレクトされます。
ただ、Strutsのバージョンによっては、サーバからの応答が302になり、次のアクセスが200だったり、404だったりするのがこまっちゃった。
ちなみに、自分は2.3.34のバージョンでコード実行できました。

リクエスト:
hXXp://192.168.220.137:8080/struts2.3.34-showcase/OGNL形式/actionChain1.action

リダイレクト先:
hXXp://192.168.220.137:8080/struts2.3.34-showcase/java.lang.UNIXProcess@347223c7/register2.action

参考URL

Security Bulletins S2-057
脆弱性発見者のブログ
IPA(Apache Struts2 の脆弱性対策について(CVE-2018-11776)(S2-057))
JPCERT/CC(Apache Struts 2 の脆弱性 (S2-057) に関する注意喚起)
PoC(jas502n/St2-057)
中国語の解説サイト →Redirect actionだけでなく、Action chainingとPostback resultもあってわかりやすい

最後に

中華系のブログ見る限り、ServletActionRedirectResult.javaに存在するnamespaceの値を渡すところが脆弱みたいです。やっぱりいつものOGNL形式!

8月25日18時現在も、ハニーさんで検知はありません。
今回の脆弱性は、struts使ってたら即脆弱ではないので、攻撃者もあまり使わないと思います。
そもそもそんな設定してんの?って話。

修正(8/25)
もろもろと検証結果を追加

修正(8/27)
ぼんたさんより、struts2-convention-pluginに関する情報提供をいただきました。
ありがとうございました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1