Security Test Suite Trade Federation (sts-tradefed) は、 Android Trade Federationテスト ハーネスの上に構築されており、互換性テスト スイートに該当しないセキュリティ パッチ テストのためにすべての Android デバイスをテストします。これらのテストは、Common Vulnerabilities and Exposures (CVE) に関連付けられた (または関連付けられる予定の) 修正専用です。
SDK を使用すると、Android Studio または標準の Android SDK を使用して、Android ソース ツリーの外部で STS テストを開発できます。これには、STS テストを構築して実行するために必要なすべてのユーティリティが含まれています。
前提条件
- 64 ビット Linux PC。
- Android Studio (ディストリビューションのパッケージ マネージャーからインストールすることもできます。
- Android プラットフォーム ツール(
adb
、fastboot
) がインストールされ、$PATH
に存在する必要があります (つまり、コマンド ラインからadb
を実行できる必要があります)。プラットフォーム ツールをインストールする最も簡単な方法は、ディストリビューションのパッケージ マネージャーを使用することです。- スタンドアロンのプラットフォーム ツールの代わりに Android Studio の SDK マネージャーを使用する場合は、SDK の
platform-tools
ディレクトリを $PATH に忘れずに追加してください。
- スタンドアロンのプラットフォーム ツールの代わりに Android Studio の SDK マネージャーを使用する場合は、SDK の
- aapt 。ディストリビューションのパッケージ マネージャー経由でインストールすることもできます。
Android Studio の使用を開始する
アーカイブを抽出した後、Android Studio でディレクトリを既存のプロジェクトとして開きます。ターゲット Android デバイスのアーキテクチャに応じて、 assembleSTSARM
またはassembleSTSx86
ビルド ターゲットを実行してスケルトン テストをビルドします。 runSTS
ビルド ターゲットを実行して、接続されたデバイス上でスケルトン テストを実行します (ADB が承認されている必要があります)。
Gradle の使用を開始する
アーカイブを抽出した後、Gradle プロジェクトのルートにあるlocal.properties
ファイルにsdk.dir
プロパティを設定し、 assembleSTSARM
Gradle タスクを実行してスケルトン テストを構築します。ビルドが完了したら、 build/android-sts/tools
に移動 ( cd
) し、 sts-tradefed
ラッパーを実行することでテストを実行できます。
$ echo 'sdk.dir=/home/<myusername>/Android/Sdk' > local.properties
$ ./gradlew assembleSTSARM
$ cd build/android-sts/tools
$ ./sts-tradefed run sts-dynamic-develop -m hostsidetest
STS テストを作成する
STS テストには 3 つの部分があります。
-
sts-test
サブディレクトリ内の adb を介してデバイスと対話するホスト側の Tradefed テスト。 - オプションのネイティブ概念実証攻撃
adb push
を通じてデバイスにプッシュされ、native-poc
サブディレクトリ内のホスト側のテストによって実行されます。 -
adb install
を通じてデバイスにインストールされ、ホスト側のテストによっても起動されるオプションのアプリまたはサービス APK。アプリまたはサービスには、ホスト側ランナーに報告される独自の JUnit アサーション セットを含めることもできます。これはtest-app
サブディレクトリにあります。
典型的な STS テスト フローは通常、次の 2 つのパターンのいずれかに従います。
ネイティブの概念実証:
- ホスト側のテストは、デバイス上でネイティブ実行可能ファイルをプッシュして起動します。
- ネイティブ プログラムがクラッシュするか、特定の終了コードが返されます。
- ホスト側のテストでは、クラッシュのチェック、logcat バックトレースの確認、または特定の終了コードの検索を行って、攻撃が成功したかどうかを判断します。
インストルメント化されたテスト アプリ:
- ホスト側のテストは、アプリまたはサービスで構成される APK をデバイスにプッシュします。
- ホスト側のテストは、
runDeviceTest()
を通じて APK にバンドルされているデバイス側の JUnit テストを開始します。 - デバイス側の JUnit テストは、ボタンをタップして UIAutomator を使用してアプリを監視するか、セキュリティの脆弱性を明らかにする方法で Android システムにアクセスします。
- デバイス側の JUnit テストの成功または失敗はホスト側のテストに返され、テストが成功したかどうかを判断するために使用できます。
2 つのパターンを組み合わせること (たとえば、デバイス側のテストと組み合わせてネイティブ プログラムを実行するなど) も可能です。 frida-inject
などの他のインストルメンテーション フレームワークも利用できます。詳細については、セキュリティ テスト スイートのリファレンス ドキュメントおよびTradefed のリファレンス ドキュメントを参照してください。
私の概念実証攻撃にはテスト アプリやネイティブの実行可能ファイルは必要ありません
ほとんどのテストでは、デバイス側アプリとネイティブ実行可能ファイルの両方は必要ありません。
テストにデバイス上のアプリ/サービスの使用が含まれない場合は、 test-app
サブディレクトリを削除するだけです。同様に、テストでネイティブ実行可能ファイルを使用しない場合は、 native-poc
サブディレクトリを削除してから、プロジェクトを Gradle 同期します。プロジェクトは、これらのモジュールが存在しない場合、自動的にビルドをスキップするように設定されています。
私の概念実証攻撃には 2 番目のアプリ/サービスが関係しています
まず、2 番目のアプリ/サービスのプロジェクトに新しいモジュールを追加し、他の APK と同様にそれを記述します。
次に、このディレクトリのルートにあるbuild.gradle
編集し、 copyArtifacts
、 assembleStsARM
、およびassembleStsx86
の手順に従ってモジュールを追加します。これにより、コンパイルされた APK が STS の出力ディレクトリに確実にコピーされ、テストから新しいアプリのインストール/呼び出しが可能になります。
最後に、プロジェクトを Gradle 同期します。
STS テストの提出
zipForSubmission
タスクを実行します (Android Studio またはコマンド ラインの Gradle を使用)。新しいファイルcodesubmission.zip
プロジェクトのルートのbuild
ディレクトリに作成される必要があります。 Android 脆弱性報奨プログラムへの提出物と一緒にそのファイルをアップロードします。