Task Hijacking
タスクハイジャック
説明
Androidのタスクは、ユーザーが特定の作業を実行する際に対話するアクティビティの集合です。異なる アプリケーションのアクティビティが同じタスク内に配置されることがあり、以下のパラメータを操作することで、悪意のあるアクティビティをアプリケーションのタスクに再配置する可能性があります。
taskAffinity属性によって制御される Task AffinityallowTaskReparenting属性によって制御される 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に対して allowTaskReparenting が true に設定されている場合、同じアフィニティを持つ新しいタスクがフォアグラウンドに表示されると、システムは 再配置可能 なアクティビティAを元のホスティングタスクから新しいフォアグラウンドのタスクスタックに移動します。
タスクハイジャック攻撃には、以下の種類があります。
-
Task Affinity Control: アプリケーションのパッケージ名が
com.mySecureApp.appで、アクティビティ A1 を持つとします。悪意のあるアプリケーションには M1 と M2 の2つのアクティビティがあり、M2.taskAffinity = com.mySecureApp.appおよびM2.allowTaskReparenting = trueとなっています。悪意のあるアプリが M2 で開かれている場合、ターゲットアプリケーションを起動すると、M2 がフォアグラウンドに再配置され、ユーザーは 悪意のあるアプリケーションと対話することになります。 -
Single Task Mode: アプリケーションが起動モードを
singleTaskに設定している場合。悪意のあるアプリケーションがM2.taskAffinity = com.mySecureApp.appを持つ場合、ターゲットアプリケーションのタスクスタックをハイジャックする可能性があります。 -
Task Reparenting: アプリケーションが
taskReparentingをtrueに設定している場合。悪意のあるアプリケーションは、ターゲットアプリケーションのタスクを悪意のあるアプリケーションのスタックに移動させることができます。
タスクハイジャックは、フィッシングや使用拒否攻撃(Denial of Use)の実行に悪用される可能性があり、過去には銀行を標的としたマルウェア(トロイの木馬)によって悪用されました。新しい形態の攻撃(StrandHogg 2.0)はコードベースの攻撃であるため、検出が極めて困難です。
タスクハイジャックは、CVE-2020-0267 WindowManager confused deputy の修正の一環として、Android バージョン 11 で対処されています。
推奨事項
タスクハイジャックの脆弱性には、形態ごとに異なる修正が必要です。
AndroidManifest.xmlの<activity>タグでアプリケーションのアクティビティの Task Affinity を""(空の文字列)に設定して、ランダムに生成された Task Affinity をアクティビティに強制的に使用させるか、<application>タグで設定してアプリケーション内のすべてのアクティビティに適用します。
または
-
android:launchModeをsingleInstanceに設定します。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を指定しないか、悪意のあるフォアグラウンドタスクの存在を検出する監視サービスを追加します。 -
ターゲットアプリケーションのパッケージ名、または完全修飾コンポーネントクラス名を提供することで、どのアプリケーションがインテントを満たすかを指定する明示的インテントの使用を推奨します。暗黙的インテントは一般的なアクションのみを指定します。
リンク
- Understand Tasks and Back Stack - Android Documentation
- Towards Discovering and Understanding Task Hijacking in Android
- StrandHogg Attack
- StandHogg Attack 2.0
- Task Hijacking exploited by Mobile Banking Malware
- CVE-2020-0267: WindowManager Confused Deputy
基準
- 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