コンテンツにスキップ

Task Hijacking

タスクハイジャック

説明

Androidのタスクは、ユーザーが特定の作業を実行する際に対話するアクティビティの集合です。異なる アプリケーションのアクティビティが同じタスク内に配置されることがあり、以下のパラメータを操作することで、悪意のあるアクティビティをアプリケーションのタスクに再配置する可能性があります。

  • taskAffinity 属性によって制御される Task Affinity
  • allowTaskReparenting 属性によって制御される Task Reparenting

Task Affinityは、AndroidManifest.xml ファイルの <activity> タグで定義されるアクティビティ属性です。 Task Affinityは、アクティビティが参加を希望するタスクを指定します。デフォルトでは、アプリ内のすべてのアクティビティは同じアフィニティ(アプリのパッケージ名)を持ちます。

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="co.secureApp.app">
    <application>
        <activity android:name=".ActivityA"></activity>
        <activity android:name=".ActivityB" android:taskAffinity="co.ostorlab.Myapp:taskB"></activity>
    </application>
</manifest>

アクティビティAに対して allowTaskReparentingtrue に設定されている場合、同じアフィニティを持つ新しいタスクがフォアグラウンドに表示されると、システムは 再配置可能 なアクティビティAを元のホスティングタスクから新しいフォアグラウンドのタスクスタックに移動します。

タスクハイジャック攻撃には、以下の種類があります。

  • Task Affinity Control: アプリケーションのパッケージ名が com.mySecureApp.app で、アクティビティ A1 を持つとします。悪意のあるアプリケーションには M1M2 の2つのアクティビティがあり、M2.taskAffinity = com.mySecureApp.app および M2.allowTaskReparenting = true となっています。悪意のあるアプリが M2 で開かれている場合、ターゲットアプリケーションを起動すると、M2 がフォアグラウンドに再配置され、ユーザーは 悪意のあるアプリケーションと対話することになります。

  • Single Task Mode: アプリケーションが起動モードを singleTask に設定している場合。悪意のあるアプリケーションが M2.taskAffinity = com.mySecureApp.app を持つ場合、ターゲットアプリケーションのタスクスタックをハイジャックする可能性があります。

  • Task Reparenting: アプリケーションが taskReparentingtrue に設定している場合。悪意のあるアプリケーションは、ターゲットアプリケーションのタスクを悪意のあるアプリケーションのスタックに移動させることができます。

タスクハイジャックは、フィッシングや使用拒否攻撃(Denial of Use)の実行に悪用される可能性があり、過去には銀行を標的としたマルウェア(トロイの木馬)によって悪用されました。新しい形態の攻撃(StrandHogg 2.0)はコードベースの攻撃であるため、検出が極めて困難です。

タスクハイジャックは、CVE-2020-0267 WindowManager confused deputy の修正の一環として、Android バージョン 11 で対処されています。

推奨事項

タスクハイジャックの脆弱性には、形態ごとに異なる修正が必要です。

  • AndroidManifest.xml<activity> タグでアプリケーションのアクティビティの Task Affinity を ""(空の文字列)に設定して、ランダムに生成された Task Affinity をアクティビティに強制的に使用させるか、<application> タグで設定してアプリケーション内のすべてのアクティビティに適用します。

または

  • android:launchModesingleInstance に設定します。singleInstance は、同じタスク内に他のアクティビティが作成されないことを保証します。

  • 起動モードを singleTask に指定しないか、悪意のあるフォアグラウンドタスクの存在を検出する監視サービスのサポートを追加します。

  • アクティビティ起動時のインテントで FLAG_ACTIVITY_NEW_TASK フラグを設定しないか、FLAG_ACTIVITY_CLEAR_TASK とともに使用してください。

Intent i = new Intent(this, AnActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
  • taskAffinity とともに allowReparenting を指定しないか、悪意のあるフォアグラウンドタスクの存在を検出する監視サービスを追加します。

  • ターゲットアプリケーションのパッケージ名、または完全修飾コンポーネントクラス名を提供することで、どのアプリケーションがインテントを満たすかを指定する明示的インテントの使用を推奨します。暗黙的インテントは一般的なアクションのみを指定します。

リンク

基準

  • OWASP_MASVS_L2:
    • MSTG_PLATFORM_9
  • GDPR:
    • ART_5
    • ART_25
    • ART_32
  • PCI_STANDARDS:
    • REQ_2_2
    • REQ_6_2
    • REQ_6_3
    • REQ_11_3
  • HIPAA_CONTROLS:
    • SECURITY221
    • SECURITY212
    • SECURITY213
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5