ローグウェーブソフトウェアのブログ

開発をシンプルに 安全で高品質のコードを 素早くお客様のもとへ

Javaのデシリアライズ脆弱性について

ローグウェーブ米国本社のブログCodeBuzzに投稿された記事を紹介します。2015年11月頃話題になったJavaライブラリ Apache commons-collectionsの脆弱性についてローグウェーブでOpenLogic業務に携わっているAndrew Pomponioが問題の概要と対応の指針について紹介しています。

なお、この件について日本では、以下のid:Kangoさんによるブログが詳細なリンク集を作成して紹介しており、とても参考になります。

d.hatena.ne.jp

Java deserialization vulnerability — Could you be at risk?

blog.klocwork.com

2015年の11月、Foxglove SecurityがJavaライブラリcommons-collectionsに関する脆弱性CVE-2015-4852について記事を投稿しました。見つかったのは、不正な形式のデータが通信後にデシリアライズされた際、アプリケーションのロジックの隙を突いて任意のコードを実行できる、というものです。シリアライズ(シリアル化)というのは、Javaでオブジェクトを送信する際に使われます。オブジェクトをバイト列に変換してパケットとしてネットワークやインターネットを通して送られ、パケットが目的地で受信されるとデシリアライズ作業が行われ、データが復元されます。

パフォーマンスを高める目的でしばしばアプリケーションからトラフィックが信頼できるかどうかのチェックとバリデーションを保護レイヤーから取り除くということが行われます。このセキュリティのための工程は追加のロードとリソースを要するからです。このようにデータを信頼してしまうと、もしパケットが目的地に到着する前に改竄された場合に脆弱性が発生します。たとえば改竄されたデータがJavaオブジェクトとして復元されると、任意のコードを実行するなど悪意のある行為を招くことになります。チェックされていないデシリアライズのコードは信頼された正しいデータであると認識されます。Javaの他にもC、C++PythonRubyなど他の言語でも同様に信頼に関する脆弱性が存在します。

シリアライズ-シリアライズの機能を利用せず、Javaオブジェクトのアクセッサを保護しない場合、データの整合性は損なわれます。Javaオブジェクトでオーバーロード関数を保護せずにデフォルトのままで使用する場合、オブジェクトの生の出力ストリームは危険です。transient修飾子(modifier、Javaのシリアライザが一部のフィールドをデシリアライズしないようにします)を使っていない場合、やはり機密性の問題に直面します。さらに厳しい例ではこの脆弱性を利用すると一般に公開されていない内部向けのアプリケーションもリモートからアクセスできてしまいます。データを破壊したり盗み見たりできるだけでなく、攻撃者はそのサーバ自体をあなたのネットワーク内への攻撃の拠点とすることも可能です。

Apache commons-collectionは広範囲に使われているため、この脆弱性は多くのJavaアプリケーションに影響します。もしジェネリック型を使っていないのであればあなたは脆弱性の影響を受けないでしょう。その場合明示的に全てのJavaオブジェクトを前もって定義してあるため攻撃者は悪意のあるコードを注入することができません。commons-collectionsライブラリのバージョン 3.2.2と4.1ではこの問題は解決されており、以前のバージョンをお使いの場合はアップグレードすべきです。(https://issues.apache.org/jira/browse/COLLECTIONS-580)。回避策は暗号化のレベルとアプリケーション層におけるセキュリティの実装という2つの因子に依存します。暗号化は便利ですし推奨されますが、クライアント側でしか保護しません。あなたのアプリケーションがセキュアであることを保証するにはtransient フィールドを使ってシリアライズやデシリアライズの試みがなされても非transient なデータが存在しないようにすることです。

地点Aから地点Bへのトラフィックがある場合、何らかのレベルでの送信側の正当性を担保するための認証と受信側での安全性を担保するためのverificationの仕組みが必要です。SSHSSL/TLSトラフィックをセキュアに行うために推奨される方法です。この脆弱性は深刻に捉えられなければならず、もし使用しているエンドポイントがデータを送受信していてバリデーションを行っていない場合、直ちに調査すべきです。

結論として、アプリケーションが信頼出来ないデータをデシリアライズしているなら、あなたのシステムは常に深刻な攻撃のリスクにさらされているということです。オープンソースコミュニティで利用可能なツールを使ってあなたのアプリケーションをアプリケーション層でもトランスポート層でもセキュアに保つことが重要です。オブジェクトをシリアル化するその他の方法、例えばjson-ioやXMLのマーシャリングといった代替手段も考慮すべきでしょう。

Andrew Pomponio

お問い合わせ

OpenLogicについてのその他の記事もご覧ください。OpenLogicのガバナンスとスキャニングサービスについてのプレゼン資料もご覧いただけます。

www.slideshare.net

roguewave.jp

ローグウェーブ 柄澤(からさわ)