Java Usage Tracker の脆弱性「CVE-2018-3211」を発見、Windows 環境で検証

トレンドマイクロは、Java の機能「Java Usage Tracker(JUT)」を利用することで、任意のファイル作成、攻撃者が指定したパラメータの注入、および上位権限の利用が可能になる脆弱性「CVE-2018-3211」を発見し、Windows 環境で検証しました。これらの活動を組み合わせることで、通常はその他のアプリケーションやユーザによるアクセスが制限されているリソースへのアクセスが可能になります。影響を受ける Java のバージョンは、「Java SE:8u182 および 11」と「Java SE Embedded: 8u181」です。

Java を提供する Oracle 社は、トレンドマイクロが運営する脆弱性発見・研究コミュニティ「Zero Day Initiative(ZDI)」の協力を受けてこの脆弱性を修正し、2018 年 10 月のクリティカルパッチアップデートにおいて更新プログラムを公開しました。従って、企業および一般ユーザは、Java を最新バージョンに更新することが推奨されます。

本記事では、問題の脆弱性が Windows 環境で利用可能となる条件および脆弱性攻撃の仕組みについて解説します。

■Java Usage Tracker(JUT)とは

JUT は、Java の使用状況を追跡する以下のような Java の機能です。

  • 「Java virtual machine(Java 仮想マシン、JVM)」の起動設定パラメータ情報の記録
  • データをダンプしログファイルに保存または UDP サーバに転送
  • JUT のプロパティファイルに設定したカスタムプロパティの値を記録

JUT は、初期設定では無効になっており、プロパティファイル “usagetracker.properties” を作成することで有効化および構成することが可能です。オペレーティングシステム(OS)ごとに定められた既定のパスにこのプロパティファイルを作成すると、PC で起動しているすべての JVM の使用状況を追跡することが可能になります。例えば、Windows OS ではプロパティファイルのパスは「%ProgramData%\Oracle\Java\」です。

以下は、”usagetracker.properties” の設定例です。

JUT のプロパティファイル usagetracker.properties の設定例
図 1:JUT のプロパティファイル “usagetracker.properties” の設定例

図 1 の 9 行目で指定されているように、JUT はファイル “global_javatracker.log” に情報を記録します。以下、Java アプリケーションの Web コンテナ「Apache Tomcat」がインストールされた PC を例に解説していきます。Tomcat のサービスが再起動されると、”global_javatracker.log” ファイルが作成され、Java 使用状況データが追加されます。Tomcat を起動するたびに、新しい追跡情報がファイル末尾に付け加えられます。

図 2 は追跡データの例です。図 1 のプロパティファイルで設定された区切り文字(この例ではカンマ「,」)によって値が区切られていることが分かります。

global_javatracker.logに追加された Tomcat の使用状況追跡データ
図 2:”global_javatracker.log” に追加された Tomcat の使用状況追跡データ

■ユーザが指定可能な JUT のプロパティ

JUT のプロパティファイル “usagetracker.properties” には、ユーザが指定することのできる以下のプロパティが存在します。

  • oracle.usagetracker.logToFile
  • oracle.usagetracker.additionalProperties

この「logTofile」プロパティには、ログファイルのパスとして PC 内の任意のパスを指定することが可能です。このログファイルは、監視対象の JVM によって作成されます。そのため、対象の JVM が上位の権限を持っている場合、JVM は権限に応じて PC 内の任意のパスにファイルを作成することが可能です。作成するファイルの拡張子には制限がなく、例えば “global_javatracker.bat” のように「.log」以外の拡張子を持ったログファイルの作成も可能です。

「logToFile」プロパティには任意のパスを設定することが可能ですが、JVM はユーザが操作することのできないデータを使用して値を書き込むため、通常はファイルの内容を操作することはできません。しかし、JUT は、ユーザが設定したカスタムプロパティの値を取得する機能を備えており、この機能を利用することでログファイルに任意の値を追加することが可能です。図 3 は、「additionalProperties」プロパティにカスタムプロパティを設定するコードです。

「additionalProperties」に設定することでカスタムプロパティを追加可能
図 3:「additionalProperties」に設定することでカスタムプロパティを追加可能
この例では「com.anotherInterestingProperty」という名称のプロパティを追加

図 4 のログファイルの末尾には、図 3 で追加したカスタムプロパティの値が「com.anotherInterestingProperty=null」のように記録されています。値が「null」ということは、このプロパティが存在していないことを意味します。

Tomcat サービス再起動後、ログファイルに追跡データが追加される
図 4:Tomcat サービス再起動後、ログファイルに追跡データが追加される

以上のように、JUT の挙動に関して、ユーザは、ログファイルのパスおよびカスタムプロパティの 2 つについて、任意の値を設定することが可能です。これだけでは攻撃に利用できるようには思われないかもしれませんが、その他のセキュリティ欠陥と組み合わせて利用することにより脆弱性攻撃が可能になります。

■カスタムプロパティを悪用する仕組み

カスタムプロパティを悪用する方法について解説していきます。図 5 の 9 行目に示したように、ログファイルのパスに「C:/ProgramData/Oracle/Java/global_javatracker.bat」を設定し、JUT が「.bat」という拡張子を持つファイル “global_javatracker.bat” を作成するようにします。次に、19 行目で、カスタムプロパティ「ping 172.0.1.1 >」を追加します。

JUT のプロパティファイルで、ログファイルのパスとカスタムプロパティを設定
図 5:JUT のプロパティファイルで、ログファイルのパスとカスタムプロパティを設定

図 6 のログファイルに「ping 172.0.1.1 >= null」とあることから、このカスタムプロパティの値が「null」であることが分かります。また、バッチファイル “global_javatracker.bat”の実行結果を見ると、「”VM start” is not recognized」というエラーメッセージが表示されています。

global_javatracker.batの実行結果(中)とglobal_javatracker.batの内容(右)
図 6:”global_javatracker.bat” の実行結果(中)
“global_javatracker.bat” の内容(右)

このエラーは、JUT のプロパティファイルで「com.oracle.usagetracker.separator = ,」のように区切り文字としてカンマ「,」が指定されており、生成されるログデータが 1 行になっていることに起因します。

そこで、図 7 のように、区切り文字として改行「\n」を指定してみます。

区切り文字として改行を指定した JUT のプロパティファイル
図 7:区切り文字として改行を指定した JUT のプロパティファイル

すると、図 8 のように複数行の追跡ログが生成されます。最終行にはカスタムプロパティの値「ping 172.0.1.1 >= null」を確認することができます。

区切り文字に改行「\n」を指定した際の追跡ログ
図 8:区切り文字に改行「\n」を指定した際の追跡ログ

ここで、”global_javatracker.bat” を実行すると、最終行の「ping 172.0.1.1 >= null」も実行されますが、ダブルクォーテーション「"」で囲まれているためコマンドとして認識されません。追跡ログを囲う記号は、プロパティファイル内で「com.oracle.usagetracker.quote = “」のように指定されています。そこで、図 9 のように、「com.oracle.usagetracker.quote」プロパティに空文字列を指定してみましょう。

囲い文字を表す「com.oracle.usagetracker.quote」プロパティに空文字列を指定
図 9:囲い文字を表す「com.oracle.usagetracker.quote」プロパティに空文字列を指定

今度は、”global_javatracker.bat ” 内の「ping 172.0.1.1 >= null」がコマンドとして認識され、図 10 のようにファイル “null” が作成されました。

囲い文字を表すプロパティ「com.oracle.usagetracker.quote」に空白文字列を指定した際のglobal_javatracker.batの実行結果
図 10:囲い文字を表すプロパティ「com.oracle.usagetracker.quote」に空白文字列を指定した際の “global_javatracker.bat” の実行結果

この段階で、JUT を利用することにより以下のような活動が可能になっています。

  • ファイルシステム内の任意のパスにファイルを作成
  • スクリプトとして実行可能な文字列を含むファイルの作成(例:バッチファイル)
  • 任意のコマンドや、スクリプトとして実行可能なテキストの注入

■脆弱性攻撃が可能となる条件

前述のような活動を実行するためには、以下の条件を満たしている必要があります。

  • 「ProgramData」配下のようなシステムの重要フォルダに不正ファイルを作成することが可能
  • 重要フォルダへのアクセス権限を持ったプロセスの利用が可能

これらの条件はどちらも実現可能です。例えば、JUT のプロパティファイル “usagetracker.properties” は、上位の権限を持たないユーザでも作成することが可能で、不正なログファイルは上位の権限を持った Tomcat のようなプロセスによって作成可能です。

■JUT のログファイルの作成

すべての JVM に適用されるパス(例:Windows では「%ProgramData%\Oracle\Java」)にプロパティファイルを作成すると、JVM は起動時に JUT のログファイルを読み込むようになります。ここでも Tomcat を例に解説していきます。JUT のプロパティファイル”usagetracker.properties” が既定のパスに存在する場合、Tomcat のインストールおよび再起動後に図 11 のようなログファイルが作成されます。

Tomcat インストール後に作成されたログファイル
図 11:Tomcat インストール後に作成されたログファイル

図 12 のように、Tomcat サービスは「System」権限で実行されているため、任意のパスに不正ファイル “global_javatracker.bat” を作成することが可能です。ただし、この脆弱性攻撃を成功させるためには、上位の権限を持たないユーザであっても、JUT のプロパティファイル “usagetracker.properties ” を作成することが可能である必要があります。

Tomcat が作成した追跡ログファイル
図 12:Tomcat が作成した追跡ログファイル

■パーミッション設定の甘さを利用し、上位の権限を悪用

すべての JVM に適用される JUT のプロパティファイルのパスは、Windows PC では「%ProgramData%\Oracle\Java\」です。このパスとプロパティファイルのひな形は Java のインストール時に作成されます。他にも、例えば「java -c」のような Java コマンドを実行した結果として作成することも可能です。

「%ProgramData%」のパーミッション設定は、初期設定で「Users」グループのユーザに書き込み権限が与えられています。図 13 のように、配下に作成されるフォルダ「Oracle/Java」にも初期設定のパーミッションが引き継がれます。

「%ProgramData%\Oracle\Java\」のパーミッション設定、「Users」グループに書き込み権限が付与されている
図 13:「%ProgramData%\Oracle\Java\」のパーミッション設定
「Users」グループに書き込み権限が付与されている

つまり、下位の権限しか持たないユーザであっても、不正な設定を追加した JUT のプロパティファイル ” usagetracker.properties” を「%ProgramData%\Oracle\Java\」に作成することが可能です。また、Tomcat のようなアプリケーションは「System」権限で実行されているため、PC 内の任意のパスにバッチファイルを作成することが可能です。このバッチファイルを通して、スタートアップフォルダのようなパスに不正なファイルを作成するコマンドを実行することも可能です。

■結論

攻撃者にこのJUTの脆弱性が悪用されるシナリオとしては、侵入した環境で上位の権限を必要とする操作を実行する攻撃が考えられます。今回、トレンドマイクロは、Windows 環境でのみ調査を実施しましたが、その他の OS でも同様の脆弱性が存在する可能性はあります。侵入した攻撃者に悪用されないよう、使用しているJavaのバージョンを確認し、アップデートすることを忘れないようにしてください。

本記事で解説した攻撃手法は、以下のような一連の脆弱性を組み合わせたものです。

  • 任意の拡張子を持つファイルの作成
    「oracle.usagetracker.logToFile」プロパティに、「.bat」のような拡張子を持つファイルのパスを指定
  • パラメータの注入
    「oracle.usagetracker.additionalProperties」プロパティに任意のパラメータを設定
  • 上位の権限の悪用
    「%ProgramData%/Oracle/Java」のパーミッション設定の甘さを足がかりとして、上位の権限を持つプロセスを悪用

■トレンドマイクロの対策

トレンドマイクロの法人向けエンドポイント製品「ウイルスバスター™ コーポレートエディション XG」や中小企業向けのクラウド型エンドポイントセキュリティサービス「ウイルスバスター™ ビジネスセキュリティ」は、脆弱性「CVE-2018- 3211」を利用している恐れのある不正なファイル、関連する不正な URL およびマルウェアを検知し、ブロックすることによって、強固な保護を提供します。

参考記事:

翻訳: 澤山 高士(Core Technology Marketing, TrendLabs)