チェック・ポイントのリサーチ・チームは、最新の調査において、各種Java/Android開発ツールに影響する複数の脆弱性を発見しました。該当ツールは多岐にわたっており、Java/Android開発を行うほとんどすべての組織が、同脆弱性を狙った攻撃の影響を受けるおそれがあります。

脆弱性が見つかったのは、世界最大規模のアプリケーション開発コミュニティであるAndroidアプリケーション・エコシステムで使用されている複数の開発ツールです。問題の開発ツールは、ローカル・アプリケーションとして提供されているケースも、クラウド・アプリケーションとして提供されているケースもあります。この中には、多くのJava/Androidプログラマが業務アプリケーションの開発に使用しているツールと、セキュリティ・アナリストやリバース・エンジニアがプログラムの分析に使用しているツールが含まれます。

今年前半、WikiLeaksによって行われた機密情報の暴露活動「Vault 7」を見ても分かるように、米中央情報局(CIA)や国家安全保障局(NSA)は、規模の大小を問わず、世界中のあらゆるベンダーの製品に含まれる脆弱性の悪用を試みています。例えばCIAは、マルウェアを企業各社に侵入させ、その社員や事業についての情報を収集する目的で、CCleanerNotepad++などさまざまなアプリケーションをハッキングしていました。

今回見つかった脆弱性は、広く使用されているAndroid用IDE(GoogleのAndroid Studio、JetBrainsのIntelliJ IDEA、Eclipseなど)に加え、Androidアプリ向けの主要なリバース・エンジニアリング・ツール(APKTool、CuckooDroidサービスなど)にも影響します。

本記事では、ツールの脆弱性を利用して内部のファイルにアクセスする方法を解説します。なおチェック・ポイントでは、脆弱性を発見後、2017年5月にAPKToolの開発者やその他IDEの開発ベンダーに問題を報告済みです。GoogleとJetBrainsは、脆弱性の存在を確認した後、問題を適切に修正しています。

 

技術的な詳細 - XXEからRCEへ: 第2レイヤへの攻撃

私たちが最初の調査を行ったのは、APKTool(Android Application Package Tool)です。

サードパーティAndroidアプリのリバース・エンジニアリング・ツールとして最も高い人気を誇るAPKToolは、カスタム・プラットフォームのサポートやアプリケーションの分析、リソースのデコードおよび再ビルドなど、さまざまな用途に利用されています。

APKToolには、次の2つの主要機能があります。
1. APKファイルの逆コンパイル
2. APKファイルのビルド

調査の結果、この主要機能の両方に脆弱性が存在することが判明しました。

APKToolのソースコードを検証したところ、XML外部エンティティ(XXE)の脆弱性が見つかったのです。この脆弱性は、APKToolの構成済みXMLパーサが、プログラム内のXMLファイルを解析する際、外部エンティティ参照を無効化しないことに起因しています。

脆弱性が存在する関数loadDocumentは、APKToolの2つの主要機能、つまり逆コンパイルとビルドの両方で使用されています。

この脆弱性は、APKToolユーザのOSファイルシステム全体をリスクにさらします。例えば攻撃者は、XXEの脆弱性を悪用する不正なAndroidManifest.xmlファイルを利用することで、PC上の任意のファイルを取得し、リモートのサーバに転送することができます。この攻撃シナリオは、XXEの脆弱性を利用して被害をもたらす、数ある攻撃手法の1つに過ぎません。

この脆弱性は、Androidアプリの開発者や研究者に極めて大きな影響をもたらします。そこで私たちは、調査の範囲を拡大し、APKToolプロジェクトで使用されている脆弱なXMLパーサDocumentBuilderFactoryの検証に乗り出すことにしました。

複数の開発ツールに脆弱性を発見

検証の結果、この脆弱なXMLパーサが複数のプロジェクトに実装されている事実が判明しました。しかも、Androidアプリの開発に広く利用されている複数の主要IDE、具体的にはIntelliJ、Eclipse、Android Studioもこの脆弱性の影響を受けることが分かったのです。

この脆弱性を悪用すると、不正なAndroidManifest.xmlファイルを任意のAndroidプロジェクトの一部として読み込ませるだけで、指定した任意のファイルをIDEに提供させることが可能となります。

この脆弱性を実証するため、私たちは、不正なプロジェクト・ライブラリをGitHubにアップロードし、それをAndroid Studioプロジェクトにクローンしました。

XXEペイロードを含む不正なGitHubプロジェクトの例:

プロジェクトをAndroid Studioにクローン:

結果:以下の図に示すように、ユーザに気づかれることなく、保護されたファイルを取得して外部のサーバへと送信することに成功しました。

多様なAndroid開発者の攻撃に利用できるシナリオはこれだけではありません。XXEペイロードを含む不正なAAR(Android Archive)ライブラリをリポジトリに混入させるという方法もあります。

例えば、Mavenのセントラル・リポジトリなどの公開リポジトリに不正なAARをアップロードするという手法があります。このAARをリポジトリからクローンさせることで、設定ファイルやソースコード、企業のデジタル資産などの重要ファイルをOSのファイルシステムから盗み出せるようになります。以下では、デモとして、不正なAARをローカル・リポジトリにアップロードしています。

不正なAARをローカル・リポジトリにアップロード:

AARをAndroid Studioプロジェクトに追加:

結果:先ほどのシナリオと同じく攻撃が成功し、ユーザに気づかれることなく、保護されたファイルを取得して外部のサーバへと送信することができました。

この後もさらにAPKToolの調査を進めたところ、標的のPC上でOSコマンドを実行できる別の脆弱性が見つかりました。

APKToolには、高度な活用を可能にするAPKTOOL.YMLという設定ファイルが用意されています。

このファイルには、unknownFilesという特別なセクションがあります。このセクションを使用すると、APKの再ビルド・プロセス中に、通常使用しないファイル・パスをインクルードすることができます。ここで指定するのは、ファイルシステムの「Unknown」フォルダに保存されているファイルです。

通常のAPKTOOL.YMLファイルは次のような構造になっています。

このunknownFilesセクションのパスを細工すると、ファイルシステムの任意の場所にある任意のファイルをAPKファイルに挿入することが可能となります(この手法は「パス・トラバーサル」と呼ばれます)。このような操作が可能なのは、パックされたAPKから不明ファイルを抽出する際、APKToolがそのパスを検証しないためです。

デコード先ファイルシステムの任意の場所に任意のファイルを配置できるということは、完全なリモート・コード実行(RCE)が可能であるということです。つまり、APKToolを利用するすべてのユーザやサービスは、不正なAPKをデコードする際、RCEのリスクにさらされることになります。

この脆弱性を実証するため、私たちは、公式のオンラインAPKデコーダ(https://apk.tools/)に似たWebアプリケーションを用意しました。

APKToolは、不正なファイル(ここではPHP Webシェルを使用)をこのサーバのwwwrootフォルダに抽出します。

細工を施した設定ファイルでAPKをビルドすると、指定したパスにある不正なファイルを含む圧縮APKが作成されます。

このAPKを先ほどのデモ・サイトにアップロードすると、そのWebアプリケーション・サーバ上でOSコマンドを実行できるようになります。この攻撃は、APKToolを使用してAPKをデコードするすべてのオンライン/オフライン・サービスに対して実行可能です。

脆弱性の存在を実証するためにここで紹介した方法は、完全なRCEの実行に利用できる数ある攻撃手法の1つに過ぎません。パス・トラバーサルを使用すれば、ファイルシステムの任意の場所に任意のファイルをコピーできるため、多様な攻撃が可能となります。

APKToolは複数のオペレーティング・システムに対応しているため、ここで紹介した攻撃手法は、いずれも複数のプラットフォームで汎用的に使用できます。また、APKToolが動作するシステムであれば、制限なしに攻撃を実行できます。

APKToolは広く利用されているオープンソースのツールであり、そのユーザ数を把握することは困難です。ユーザの中には、https://apk.toolshttp://www.javadecompilers.com/APKToolhttps://www.apkdecompilers.com/http://undroid.av-comparatives.infoCuckooDroidなど、大手のサービスや企業が含まれることから、チェック・ポイントは、APKToolの開発者やIDEベンダー各社に脆弱性の存在を報告しています。幸い、すべての開発者とベンダーが脆弱性を修正し、問題を解決した新バージョンをリリースしています。