Apache Struts 2 (S2-045/CVE-2017-5638)

Apache Struts 2 って何?

Java 用のオープンソースのウェブアプリケーションフレームワーク。JavaScript 系の人には、Angular とかがだいたいそれってって言ったほうが分かりやすいかもれない。

一からウェブアプリケーションを作るのはかなり大変なので、一般的にこういうフレームワークを導入する。Struts 2 はまあまあ人気があるフレームワークで、他にも Java EE 系や Spring とかがある。けど、私 Java よく分かりません。

CVE って?

脆弱性に対して一意に割り当てられる番号。詳しくは IPA の説明を見るとよい。

これがないと、どの脆弱性の話をしているのか分からなくなる。別々の似たような脆弱性を同じものとして扱って、対応を間違うとか、そういう事故を防ぐ。

S2-045 の方は、おそらく Struts 2 側で割り当てられた脆弱性番号だと思う。

どういう脆弱性?

今回の脆弱性は任意のコードを実行できるというもの。簡単に言うと、第三者が悪意のあるプログラムを対象となるサーバー上で動作させられるというもの。Java のコードはもちろん、OS のコマンドも実行できるので、できることはものすごくたくさんある。

攻撃の一例として、攻撃対象のサーバーで curl を使ってリモートコントロール用のプログラムをダウンロードし、設置してそれを使ってより簡単に外部からコントロールできるようにする。脆弱性を使わなくても攻撃が成立するだけでなく、セキュリティアップデートを行っても攻撃を続行できる利点がある。

こういった攻撃のノウハウは確立されてるので、自分らが考えている以上のことができる。

脆弱性の攻撃方法はこんな感じらしい。

HTTP のリクエストはこんな感じ。(ブラウザーの開発者ツールのネットワーク機能で簡単に見れます)

POST /login.jsp HTTP/1.1
Host: www.example.com
Content-Type: multipart/form-data
... フォームデータ

この Content-Type ヘッダーにコマンドを含んだ文字を書くと、実行されてしまうというもの。

以下のようにすればいいらしいんだけど、試してないからあってるかはわからない。

POST /login.jsp HTTP/1.1
Host: www.example.com
Content-Type: %{(#test='multipart/form-data').(new java.lang.Integer(42))}
... フォームデータ

時系列

調べてみたけど、JST か UTC かわからないのも多くて、ちょっとはっきりしない…
3/2 
Apache Struts 2 のサイトに脆弱性情報が掲載される (公開されてたかは分からない)
3/6
Apache Struts 2 のサイトで脆弱性情報が公開
3/8
3/9
3/10
LAC さんの資料から

各社の対応とか