Tapjacking

Reading time: 11 minutes

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をサポートする

基本情報

Tapjackingは、悪意のある アプリケーションが起動し、被害者アプリケーションの上に位置する攻撃です。被害者アプリが視覚的に隠されると、そのユーザーインターフェースはユーザーを騙してそれと対話させるように設計されており、同時にその対話を被害者アプリに渡します。
実際には、ユーザーが実際に被害者アプリでアクションを実行していることを知らないようにしています

検出

この攻撃に対して脆弱なアプリを検出するには、androidマニフェスト内のエクスポートされたアクティビティを検索する必要があります(インテントフィルターを持つアクティビティはデフォルトで自動的にエクスポートされることに注意してください)。エクスポートされたアクティビティを見つけたら、それらが何らかの権限を必要とするか確認してください。これは、悪意のあるアプリケーションもその権限を必要とするためです

アプリの最小SDKバージョンを確認することもできます。AndroidManifest.xmlファイル内のandroid:minSdkVersionの値を確認してください。値が30未満の場合、そのアプリはTapjackingに対して脆弱です。

保護

Android 12 (API 31,32) 以降

この情報源によると**、**Tapjacking攻撃はAndroid 12 (API 31 & 30) 以降、Androidによって自動的に防止されます。したがって、アプリケーションが脆弱であっても、それを悪用することはできません

filterTouchesWhenObscured

**android:filterTouchesWhenObscuredtrue**に設定されている場合、Viewは別の可視ウィンドウによってウィンドウが隠されているときにタッチを受け取ることはありません。

setFilterTouchesWhenObscured

setFilterTouchesWhenObscured属性がtrueに設定されている場合、Androidバージョンが低い場合でもこの脆弱性の悪用を防ぐことができます。
例えば、
trueに設定されている場合、ボタンは隠されている場合に自動的に無効化される
ことがあります:

xml
<Button android:text="Button"
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:filterTouchesWhenObscured="true">
</Button>

Exploitation

Tapjacking-ExportedActivity

最も最近のAndroidアプリケーションでTapjacking攻撃を実行するもの(+ 攻撃対象アプリケーションのエクスポートされたアクティビティの前に呼び出すこと)が見つかるのは: https://github.com/carlospolop/Tapjacking-ExportedActivity

READMEの指示に従って使用してください

FloatingWindowApp

FloatingWindowAppを実装した例のプロジェクトは、他のアクティビティの上に配置してクリックジャッキング攻撃を実行するために使用でき、FloatingWindowAppに見つかります(少し古いですが、apkのビルドに幸運を祈ります)。

Qark

caution

このプロジェクトは現在メンテナンスされていないようで、この機能は正しく動作していないようです。

--exploit-apk --sdk-path /Users/username/Library/Android/sdk パラメータを使用してqarkを使用すると、可能なTapjacking脆弱性をテストするための悪意のあるアプリケーションを作成できます。\

緩和策は比較的簡単で、開発者は別のビューに覆われているときにタッチイベントを受け取らないことを選択できます。Android Developer’s Referenceを使用すると:

時には、アプリケーションがユーザーの完全な知識と同意のもとでアクションが実行されていることを確認することが重要です。たとえば、権限リクエストを承認したり、購入を行ったり、広告をクリックしたりする場合です。残念ながら、悪意のあるアプリケーションは、ビューの意図された目的を隠すことによって、ユーザーを騙してこれらのアクションを実行させようとする可能性があります。これに対する対策として、フレームワークは、敏感な機能へのアクセスを提供するビューのセキュリティを向上させるために使用できるタッチフィルタリングメカニズムを提供します。

タッチフィルタリングを有効にするには、setFilterTouchesWhenObscured(boolean)を呼び出すか、android:filterTouchesWhenObscuredレイアウト属性をtrueに設定します。有効にすると、フレームワークは、ビューのウィンドウが別の可視ウィンドウによって覆われているときに受信したタッチを破棄します。その結果、トースト、ダイアログ、または他のウィンドウがビューのウィンドウの上に表示されるとき、ビューはタッチを受け取らなくなります。


Accessibility Overlay Phishing (Banking-Trojan Variant)

クラシックなTapjackingに加えて、現代のAndroidバンキングマルウェアファミリー(例:ToxicPanda、BrasDex、Sovaなど)は、Accessibility Serviceを悪用して、正当なアプリケーションの上にフルスクリーンのWebView オーバーレイを配置し、ユーザー入力を下のビューに転送することができます。これにより、信憑性が大幅に向上し、攻撃者は資格情報、OTPを盗んだり、不正な取引を自動化したりすることができます。

仕組み

  1. 悪意のあるAPKは、非常に敏感なBIND_ACCESSIBILITY_SERVICE権限を要求し、通常は偽のGoogle/Chrome/PDFビューアーダイアログの背後にリクエストを隠します。
  2. ユーザーがサービスを有効にすると、マルウェアは追加の危険な権限(READ_SMSSYSTEM_ALERT_WINDOWREQUEST_INSTALL_PACKAGESなど)を付与するために必要なタップをプログラム的にシミュレートします。
  3. WebViewが膨張され、**TYPE_ACCESSIBILITY_OVERLAY*ウィンドウタイプを使用してウィンドウマネージャーに追加されます。オーバーレイは完全に不透明または半透明にレンダリングされ、元のタッチがバックグラウンドアクティビティに配信されるように「透過的」*としてフラグを立てることができます(したがって、取引は実際に行われ、犠牲者はフィッシングフォームのみを見ることになります)。
java
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);

銀行トロイの典型的なワークフロー

  • インストールされたパッケージをクエリする (QUERY_ALL_PACKAGES) ことで、現在開いている銀行/ウォレットアプリを特定する。
  • 特定のアプリケーション(ロゴ、色、i18n文字列など)を完璧に模倣したHTML/JSオーバーレイテンプレートをC2からダウンロードする。
  • オーバーレイを表示し、認証情報/PIN/パターンを収集する。
  • Accessibility API (performGlobalAction, GestureDescription) を使用して、バックグラウンドでの送金を自動化する。

検出と緩和

  • adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICEを使用してインストールされたアプリのリストを監査する。
  • アプリケーション側(銀行/ウォレット)から:
  • 敏感なビューに対して**android:accessibilityDataSensitive="accessibilityDataPrivateYes"**(Android 14+)を有効にして、非Playストアサービスをブロックする。
  • setFilterTouchesWhenObscured(true)FLAG_SECUREを組み合わせる。
  • システムの強化:
  • 不明なソースからのインストール信頼できないアプリのアクセシビリティを無効にする。
  • PlayProtectと最新のデバイスを強制する。

フルリモートデバイス制御のためのアクセシビリティサービスの活用に関する詳細は、以下を参照してください:

Accessibility Services Abuse

参考文献

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をサポートする