今月のApache Strtus 2 のリモートコード実行の脆弱性(S2-052/S2-053)
毎度おなじみのApache Struts 2 のリモートコード実行の脆弱性です。
前回の脆弱性からさほど時間が経っていませんが、今回もまたCriticalな脆弱性が出てきました。
ブログのネタを提供してくれるのはうれしいのですが、余計な仕事を増やされるのは困りものです。
S2-052(CVE-2017-9805)について
S20-50~S2-052 までは同時に公開されました。そのうちS2-052 の脆弱性はレートがCriticalとなっており、緊急性の高いものでした。
今回はREST プラグインが有効になっているという前提条件が付きます。
概要
Apache StrutsのRESTプラグインを有効にしていると、XStream ハンドラのデシリアライズの処理に起因してリモートからコード実行が可能になる脆弱性
影響範囲
修正バージョン
対策
- 修正バージョンへのアップデート
- REST プラグインの無効化
検証
今回もすぐにPoCが公開されましたので、検証してみました
Dockerでさくっと、Struts 2.5.12の環境を作ります。
POSTで Content-type ヘッダに「application/xml」にし、ボディにコード実行のPoCを入れます。今回実行するコマンドは「touch /tmp/hackedByMe」としています。
投げます。
500番のエラーが返ってきます。
これで攻撃は成功しているようで、サーバ側で攻撃のプロセスは起動しているようです。
Dockerのコンテナの中に入って確認すると、確かにtouchコマンドで作成したファイルが置いてありました。
応答がエラーページになっており、使用したPoCでは、例えばcatのような標準出力の値をそのまま表示させることはできません。バックドアを作ったり、一度ファイルに書き込んで、外に投げるなどが必要です。
ちなみに脆弱性のない修正版の Struts 2.5.13 で試したところ、同様に500番エラーが返ってきましたが、プロセスは実行されませんでした。
脆弱なバージョンでREST プラグインが有効になっていればほぼ攻撃は成功するため、緊急性の高い脆弱性です。
S2-53(CVE-2017-12611)について
S2-052が公開されたしばらく後に公開された脆弱性はレートはModerateとなっています。
こちらはアプリケーションの作りによって回避可能な脆弱性です。
概要
Freemarkerタグの処理に脆弱性があり、開発者が誤った使い方をしていると、リモートからコード実行が可能になる脆弱性
影響範囲
修正バージョン
対策
- 修正バージョンへのアップデート
- 実装上の問題はあまり詳しくないので下手なことは書けませんが、Freemarkerタグを使って要求の値を読み取ることができるような実装になっている場合に脆弱性が発生するようです(違っていたらすみません)。
検証
S2-053に対して脆弱なアプリケーションが公開されていたので、検証してみました。 Dockerで引っ張ってきて起動すると、以下のようなアプリケーションが立ち上がります。
nameには任意の値を入れることができ、適当な文字列を入れると、その文字がnameに表示されます。 そして、%{100-9}のような値を入れると計算結果の「91」がnameに入ります。
このnameという変数でFreemarkerタグが利用されており、脆弱な状態になっています。 ここに攻撃コードを入れます。今回は「whoami」を実行してみます。
ユーザ(root)が表示されました。
また、「cat /etc/passwd」を実行してみると以下のようになります。
こちらは分かりやすいリモートコード実行ですが、アプリケーションがこのデモ用のサイトと同じような作りになっている必要があります。 アプリケーション個別の実装を考慮する必要がある分、攻撃者にとっては若干攻撃コストが上がります。
また、脆弱性の範囲はS2-045などをかぶっている部分が多いので、この攻撃を行うならS2-045のほうが…という気もしなくはないです。
ただ、2.3系では最新版以外は有効ですし、S2-045などの脆弱性をパーサの変更などで対処してバージョンアップをしていないというような場合は、影響を受ける可能性があるので、注意が必要です。
参考
Apache Struts 2 の脆弱性 (S2-052) に関する注意喚起
CVE-2017-9805 (S2-052) - 脆弱性調査レポート | ソフトバンク・テクノロジー
Apache Struts 2における脆弱性 (S2-052、CVE-2017-9805)は悪用可能と確認 | セキュリティ対策のラック
Apache Struts 2の脆弱性(S2-052)や(S2-053)についてのまとめてみた。 - にゃんたくのひとりごと
VulApps/s/struts2/s2-053 at master · Medicean/VulApps · GitHub