はじめに
本日(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に関する情報提供をいただきました。
ありがとうございました。