生産性のない話

趣味の範囲でサイバーセキュリティの話

今月のApache Strtus 2 のリモートコード実行の脆弱性(S2-052/S2-053)

毎度おなじみのApache Struts 2 のリモートコード実行の脆弱性です。

前回の脆弱性からさほど時間が経っていませんが、今回もまたCriticalな脆弱性が出てきました。

ブログのネタを提供してくれるのはうれしいのですが、余計な仕事を増やされるのは困りものです。

S2-052(CVE-2017-9805)について

S2-052

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」としています。

f:id:blueBLUE:20170913203408p:plain

f:id:blueBLUE:20170913203506p:plain

投げます。

f:id:blueBLUE:20170913203527p:plain

500番のエラーが返ってきます。

これで攻撃は成功しているようで、サーバ側で攻撃のプロセスは起動しているようです。

f:id:blueBLUE:20170913203544p:plain

Dockerのコンテナの中に入って確認すると、確かにtouchコマンドで作成したファイルが置いてありました。

応答がエラーページになっており、使用したPoCでは、例えばcatのような標準出力の値をそのまま表示させることはできません。バックドアを作ったり、一度ファイルに書き込んで、外に投げるなどが必要です。

ちなみに脆弱性のない修正版の Struts 2.5.13 で試したところ、同様に500番エラーが返ってきましたが、プロセスは実行されませんでした。

脆弱なバージョンでREST プラグインが有効になっていればほぼ攻撃は成功するため、緊急性の高い脆弱性です。

S2-53(CVE-2017-12611)について

S2-053

S2-052が公開されたしばらく後に公開された脆弱性はレートはModerateとなっています。

こちらはアプリケーションの作りによって回避可能な脆弱性です。

概要

Freemarkerタグの処理に脆弱性があり、開発者が誤った使い方をしていると、リモートからコード実行が可能になる脆弱性

影響範囲

修正バージョン

対策

  • 修正バージョンへのアップデート
  • 実装上の問題はあまり詳しくないので下手なことは書けませんが、Freemarkerタグを使って要求の値を読み取ることができるような実装になっている場合に脆弱性が発生するようです(違っていたらすみません)。

検証

S2-053に対して脆弱なアプリケーションが公開されていたので、検証してみました。 Dockerで引っ張ってきて起動すると、以下のようなアプリケーションが立ち上がります。

f:id:blueBLUE:20170913203619p:plain

nameには任意の値を入れることができ、適当な文字列を入れると、その文字がnameに表示されます。 そして、%{100-9}のような値を入れると計算結果の「91」がnameに入ります。

f:id:blueBLUE:20170913203630p:plain

このnameという変数でFreemarkerタグが利用されており、脆弱な状態になっています。 ここに攻撃コードを入れます。今回は「whoami」を実行してみます。

f:id:blueBLUE:20170913203641p:plain

ユーザ(root)が表示されました。

また、「cat /etc/passwd」を実行してみると以下のようになります。

f:id:blueBLUE:20170913203655p:plain

こちらは分かりやすいリモートコード実行ですが、アプリケーションがこのデモ用のサイトと同じような作りになっている必要があります。 アプリケーション個別の実装を考慮する必要がある分、攻撃者にとっては若干攻撃コストが上がります。

また、脆弱性の範囲は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