JavaのWebアプリケーションフレームワーク「Apache Struts2」の脆弱性を原因とする情報流出が後を絶たない。例えば、情報通信研究機構(NICT)は2017年5月2日、378人分の個人情報が流出した恐れがあると公表した。Struts2の脆弱性を悪用された事案は、公表されている分だけでこれで12件目だという。

 単に情報が流出するだけではない。漏洩したクレジットカード番号が使われ、金銭被害が発生するケースも出てきている。

 2017年3月から5月にかけて発生している情報漏洩のほとんどの原因は、3月9日に公開された「S2-045」(および実質的にほぼ同じ脆弱性である「S2-046」)である。Struts2では、これまでに多くの脆弱性が報告されてきた。情報処理推進機構(IPA)は「Apache Struts2 の脆弱性対策情報一覧」というページでそれらの脆弱性をまとめている。

 一覧表をながめていると、「任意のコードを実行される脆弱性」と記されたものが多い。「Remote Code Execution」(RCE)と言われるタイプの脆弱性だ。大きな問題を引き起こしているS2-045もそうである。

 Webアプリケーションでたびたび報告されるクロスサイトスクリプティングの脆弱性では、実行されるのはJavaScriptのコードだ。これに対し、Struts2のRCEで実行されるのはJavaのコード(正確にはJavaのオブジェクトのプロパティにアクセスしたりメソッドを実行したりするコード)である。攻撃者が任意のコードを実行できてしまうと危険なのは言うまでもない。

 ここで不思議に思った人もいるだろう。「Javaのコードはコンパイルしなければ動かないのではないか」と。その通りである。だが、Struts2の脆弱性では、コンパイルなしでRCEが成り立ってしまう。そのカギを握るのが、Struts2が内部で多用している「OGNL」(Object Graph Navigation Language)というライブラリだ。