Tapjacking
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
Basic Information
Tapjacking は、悪意のある アプリケーション が起動され、被害者アプリケーションの上に自分自身を配置する 攻撃です。被害者アプリを視覚的に覆うと、そのユーザーインターフェースはユーザーを騙して操作させつつ、受けた操作を被害者アプリに渡すように設計されています。
結果として、ユーザーは自分が実際には被害者アプリ上で操作を行っていることに気づかないようにされます。
Detection
- Android マニフェスト内の exported activities を探す(intent-filter を持つ activity はデフォルトで exported されます)。もし exported な activity が permission によって保護されている場合、攻撃アプリは 同じ permission を必要とするため、悪用可能性は制限されます。
AndroidManifest.xmlの minimum SDK バージョンandroid:minSdkVersionを確認してください。もし 30 未満 であれば、古いデフォルトの挙動により tapjacking の悪用が容易になる場合があります。- ランタイムでは、
logcatを使って Android 12+ 上でブロックされたタッチを検出します:オーバーレイがフィルタされるとシステムはUntrusted touch due to occlusion by <package>をログに出力します。
Protection
Android 12+ default blocking & compat flags
Android 12 (API 31) は “Block untrusted touches” を導入しました:TYPE_APPLICATION_OVERLAY タイプの別 UID ウィンドウ(opacity ≥0.8)から来るタッチは破棄されます。これはデフォルトで有効になっています。テスト中はこれを切り替えることができます:
# disable blocking for a specific package (for PoC crafting)
adb shell am compat disable BLOCK_UNTRUSTED_TOUCHES com.example.victim
# re‑enable
adb shell am compat reset BLOCK_UNTRUSTED_TOUCHES com.example.victim
信頼されたウィンドウ(accessibility、IME、assistant)は引き続きイベントを受け取ります。見えない、または完全に透明なオーバーレイもブロックを回避し、攻撃者は alpha < 0.8 を維持することでこれを悪用しようとします。
部分的な遮蔽 の対処
ターゲット領域が見えるまま残る部分的なオーバーレイは自動的にブロックされません。敏感なビューでは、FLAG_WINDOW_IS_PARTIALLY_OBSCURED フラグ付きのイベントを拒否して緩和してください:
@Override
public boolean onFilterTouchEventForSecurity(MotionEvent event) {
if ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_PARTIALLY_OBSCURED) != 0) {
return false; // drop tap when anything partially obscures us
}
return super.onFilterTouchEventForSecurity(event);
}
filterTouchesWhenObscured
もし android:filterTouchesWhenObscured が true に設定されていると、View は別の可視ウィンドウによって自身のウィンドウが覆われている間はタッチを受け取りません。
setFilterTouchesWhenObscured
属性 setFilterTouchesWhenObscured set to true は、Android のバージョンが古い場合でもこの脆弱性の悪用を防げる可能性があります。
If set to true, 例えばボタンは自動的に 覆われているときに無効化される ことがあります:
<Button android:text="Button"
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:filterTouchesWhenObscured="true">
</Button>
エクスプロイト
Tapjacking-ExportedActivity
攻撃対象アプリのエクスポートされたアクティビティ呼び出し(invoking before an exported activity of the attacked application)を含む Tapjacking 攻撃を行う最新の Android アプリは、次で入手できます: https://github.com/carlospolop/Tapjacking-ExportedActivity。
使用方法は README の指示に従ってください。
FloatingWindowApp
他のアクティビティの上に重ねて clickjacking 攻撃を行うために使える FloatingWindowApp を実装したサンプルプロジェクトは FloatingWindowApp にあります(やや古いので apk のビルドは苦労するかもしれません)。
Qark
Caution
現在このプロジェクトはメンテナンスされておらず、この機能は正しく動作しない可能性があります
qark を --exploit-apk と --sdk-path /Users/username/Library/Android/sdk パラメータで実行すると、可能な Tapjacking 脆弱性をテストするための悪意あるアプリを作成できます。\
緩和策は比較的単純で、ビューが別の表示に覆われているときにタッチイベントを受け取らないように開発者が選択できます。Android Developer’s Reference を参照すると:
時には、アプリケーションがユーザーの十分な理解と同意の下でアクションが実行されていることを検証できることが重要です(例: 権限要求の許可、購入、広告のクリックなど)。残念ながら、悪意あるアプリケーションはビューの意図を隠してユーザーを騙し、これらの操作を行わせようとする可能性があります。この問題への対処として、フレームワークは機密機能にアクセスするビューのセキュリティを向上させるために使用できるタッチフィルタリング機構を提供します。
タッチフィルタリングを有効にするには、
setFilterTouchesWhenObscured(boolean)を呼び出すか、レイアウト属性 android:filterTouchesWhenObscured を true に設定します。有効にすると、ビューのウィンドウが別の表示可能なウィンドウで覆われている場合に受信したタッチは破棄されます。その結果、toast、dialog、その他のウィンドウがビューのウィンドウ上に表示されている間は、そのビューはタッチを受け取りません。
Recent overlay-based malware techniques
- Hook/Ermac variants はほぼ透過のオーバーレイ(例: 偽の NFC プロンプト)を使ってジェスチャーやロック画面 PIN をキャプチャしつつタッチを下層に転送します。これらは Accessibility-ATS モジュール経由で配布されます。
- Anatsa/TeaBot droppers は数百のバンキング/暗号アプリ向けにオーバーレイを配し、ATS が転送を完了する間に被害者を引き止めるために全画面の「メンテナンス」オーバーレイを表示します。
- Hidden-VNC banking RATs は資格情報を盗むために短時間フィッシングオーバーレイを表示し、その後は秘匿 VNC と Accessibility を併用して、デバイス上に目立つ痕跡を残さずにタップを再生します。
実務上のポイント(red teams 向け): Android 12 のブロッキングを回避するために alpha < 0.8 のオーバーレイを混ぜ、その後ユーザーがサービスを切り替えたらフルスクリーンの accessibility オーバーレイにエスカレートします。資格情報取得後の制御保持には GestureDescription やヘッドレス VNC を用います。
Accessibility Overlay Phishing (Banking-Trojan Variant)
古典的な Tapjacking に加え、近年の Android バンキングマルウェア(例: ToxicPanda、BrasDex、Sova など)は Accessibility Service を悪用して、正当なアプリの上に全画面の WebView オーバーレイを配置しつつ、下層のビューへユーザー入力を転送できるようにします。これにより信憑性が大幅に高まり、攻撃者は資格情報や OTP を盗んだり、不正な取引を自動化したりできます。
How it works
- 悪意ある APK は高度に敏感な
BIND_ACCESSIBILITY_SERVICE権限を要求します。通常、この要求は偽の Google/Chrome/PDF-viewer ダイアログの背後に隠されます。 - ユーザーがサービスを有効にすると、マルウェアは追加の危険な権限(
READ_SMS,SYSTEM_ALERT_WINDOW,REQUEST_INSTALL_PACKAGES, …)を許可させるために必要なタップをプログラム的にシミュレートします。 - WebView を inflate して WindowManager に
TYPE_ACCESSIBILITY_OVERLAYウィンドウタイプで追加します。オーバーレイは完全不透明にすることも半透明にすることもでき、元のタッチが背景アクティビティに届くように “through” フラグを付けることも可能です(つまり被害者にはフィッシングフォームだけが見えている間に、実際の取引が下層で発生します)。
WebView phishingView = new WebView(getApplicationContext());
phishingView.getSettings().setJavaScriptEnabled(true);
phishingView.loadUrl("file:///android_asset/bank_login.html");
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY, // <-- bypasses SYSTEM_ALERT_WINDOW prompt
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, // «through» flag → forward touches
PixelFormat.TRANSLUCENT);
wm.addView(phishingView, lp);
銀行 Trojans で使われる典型的なワークフロー
- インストール済みパッケージを照会して(
QUERY_ALL_PACKAGES)どの銀行/ウォレットアプリが現在開かれているかを判別する。 - C2 から HTML/JS overlay template をダウンロードし、その特定のアプリケーションを完全に模倣する(ロゴ、色、i18n 文字列…)。
- オーバーレイを表示し、資格情報/PIN/パターンを収集する。
- バックグラウンドで送金を自動化するために Accessibility API(
performGlobalAction,GestureDescription)を使用する。
検出と対策
adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICEでインストール済みアプリの一覧を監査する。- アプリケーション側(銀行 / ウォレット)からは:
- 機密性の高いビューで
android:accessibilityDataSensitive="accessibilityDataPrivateYes"(Android 14+) を有効にし、Play-Store以外のサービスをブロックする。 setFilterTouchesWhenObscured(true)とFLAG_SECUREを併用する。
For additional details on leveraging Accessibility Services for full remote device control (e.g. PlayPraetor, SpyNote, etc.) see:
参考文献
- Android Developers – Tapjacking risk & mitigations (updated 2024)
- Zimperium – HOOK v3 overlay expansion (Aug 2025)
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。


