diff --git a/src/mobile-pentesting/android-app-pentesting/tapjacking.md b/src/mobile-pentesting/android-app-pentesting/tapjacking.md index 71fb1f86e..b986da75f 100644 --- a/src/mobile-pentesting/android-app-pentesting/tapjacking.md +++ b/src/mobile-pentesting/android-app-pentesting/tapjacking.md @@ -4,20 +4,20 @@ ## **基本情報** -**Tapjacking**は、**悪意のある** **アプリケーション**が起動し、**被害者アプリケーションの上に位置する**攻撃です。被害者アプリが視覚的に隠されると、そのユーザーインターフェースはユーザーを騙してそれに対話させるように設計されており、同時にその対話を被害者アプリに渡します。\ +**Tapjacking**は、**悪意のある** **アプリケーション**が起動し、**被害者アプリケーションの上に位置する**攻撃です。被害者アプリを視覚的に隠すと、そのユーザーインターフェースはユーザーを騙してそれと対話させるように設計されており、その間に対話を被害者アプリに渡します。\ 実際には、**ユーザーが実際に被害者アプリでアクションを実行していることを知らないようにしています**。 ### 検出 -この攻撃に対して脆弱なアプリを検出するには、androidマニフェスト内の**エクスポートされたアクティビティ**を検索する必要があります(インテントフィルターを持つアクティビティはデフォルトで自動的にエクスポートされることに注意してください)。エクスポートされたアクティビティを見つけたら、**それらが何らかの権限を必要とするか確認してください**。これは、**悪意のあるアプリケーションもその権限を必要とするためです**。 +この攻撃に脆弱なアプリを検出するには、Androidマニフェスト内の**エクスポートされたアクティビティ**を検索する必要があります(インテントフィルターを持つアクティビティはデフォルトで自動的にエクスポートされることに注意してください)。エクスポートされたアクティビティを見つけたら、**それらが何らかの権限を必要とするか確認してください**。これは、**悪意のあるアプリケーションもその権限を必要とするためです**。 -アプリの最小SDKバージョンを確認することもできます。**`AndroidManifest.xml`**ファイル内の**`android:minSdkVersion`**の値を確認してください。値が**30未満**の場合、そのアプリはTapjackingに対して脆弱です。 +アプリの最小SDKバージョンを確認することもできます。**`AndroidManifest.xml`**ファイル内の**`android:minSdkVersion`**の値を確認してください。値が**30未満**の場合、そのアプリはTapjackingに脆弱です。 ### 保護 #### Android 12 (API 31,32) 以降 -[**この情報源によると**](https://www.geeksforgeeks.org/tapjacking-in-android/)**、**Tapjacking攻撃はAndroid 12 (API 31 & 30) 以降で自動的に防止されます。したがって、アプリケーションが脆弱であっても、**それを悪用することはできません**。 +[**この情報源によると**](https://www.geeksforgeeks.org/tapjacking-in-android/)**、**Tapjacking攻撃はAndroid 12 (API 31 & 30) 以降、Androidによって自動的に防止されます。したがって、アプリケーションが脆弱であっても、**それを悪用することはできません**。 #### `filterTouchesWhenObscured` @@ -25,7 +25,7 @@ #### **`setFilterTouchesWhenObscured`** -属性**`setFilterTouchesWhenObscured`**がtrueに設定されている場合、Androidバージョンが低い場合でもこの脆弱性の悪用を防ぐことができます。\ +**`setFilterTouchesWhenObscured`**属性がtrueに設定されている場合、Androidバージョンが低い場合でもこの脆弱性の悪用を防ぐことができます。\ 例えば、**`true`**に設定されている場合、ボタンは**隠されている場合に自動的に無効化される**ことがあります: ```xml ``` -## 利用 +## エクスプロイト ### Tapjacking-ExportedActivity @@ -45,19 +45,62 @@ android:filterTouchesWhenObscured="true"> ### FloatingWindowApp -**FloatingWindowApp**を実装した例のプロジェクトは、他のアクティビティの上に置いてクリックジャッキング攻撃を実行するために使用できるもので、[**FloatingWindowApp**](https://github.com/aminography/FloatingWindowApp)に見つかります(少し古いので、apkのビルドに幸運を祈ります)。 +**FloatingWindowApp**を実装した例のプロジェクトは、他のアクティビティの上に配置してクリックジャッキング攻撃を実行するために使用でき、[**FloatingWindowApp**](https://github.com/aminography/FloatingWindowApp)に見つかります(少し古いですが、apkのビルドに幸運を祈ります)。 ### Qark > [!CAUTION] -> このプロジェクトは現在メンテナンスされていないようで、この機能は正しく動作していないようです +> このプロジェクトは現在メンテナンスされていないようで、この機能は正しく動作していないようです。 `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` パラメータを使用して[**qark**](https://github.com/linkedin/qark)を使用すると、可能な**Tapjacking**脆弱性をテストするための悪意のあるアプリケーションを作成できます。\ 緩和策は比較的簡単で、開発者は別のビューに覆われているときにタッチイベントを受け取らないことを選択できます。[Android Developer’s Reference](https://developer.android.com/reference/android/view/View#security)を使用して: -> 時には、アプリケーションがユーザーの完全な知識と同意のもとでアクションが実行されていることを確認することが不可欠です。たとえば、権限リクエストを承認したり、購入を行ったり、広告をクリックしたりする場合です。残念ながら、悪意のあるアプリケーションは、ビューの意図された目的を隠すことによって、ユーザーを騙してこれらのアクションを無意識に実行させようとする可能性があります。これに対する対策として、フレームワークは、機密機能へのアクセスを提供するビューのセキュリティを向上させるために使用できるタッチフィルタリングメカニズムを提供します。 +> アプリケーションがユーザーの完全な知識と同意のもとでアクションが実行されていることを確認することが重要な場合があります。たとえば、権限リクエストの承認、購入、広告のクリックなどです。残念ながら、悪意のあるアプリケーションは、ビューの意図された目的を隠すことによって、ユーザーを騙してこれらのアクションを実行させようとする可能性があります。これに対する対策として、フレームワークは、敏感な機能へのアクセスを提供するビューのセキュリティを向上させるために使用できるタッチフィルタリングメカニズムを提供します。 > > タッチフィルタリングを有効にするには、[`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29)を呼び出すか、android:filterTouchesWhenObscuredレイアウト属性をtrueに設定します。有効にすると、フレームワークは、ビューのウィンドウが別の可視ウィンドウによって覆われているときに受信したタッチを破棄します。その結果、トースト、ダイアログ、または他のウィンドウがビューのウィンドウの上に表示されるとき、ビューはタッチを受け取らなくなります。 +--- + +## アクセシビリティオーバーレイフィッシング(バンキングトロイの木馬バリアント) + +クラシックなTapjackingに加えて、現代のAndroidバンキングマルウェアファミリー(例: **ToxicPanda**, BrasDex, Sovaなど)は、**Accessibility Service**を悪用して、正当なアプリケーションの上にフルスクリーンのWebView **オーバーレイ**を配置し、なおかつ**ユーザー入力を下のビューに転送する**ことができます。これにより、信憑性が大幅に向上し、攻撃者は資格情報、OTPを盗んだり、不正な取引を自動化したりすることができます。 + +### 仕組み +1. 悪意のあるAPKは、非常に敏感な`BIND_ACCESSIBILITY_SERVICE`権限を要求し、通常は偽のGoogle/Chrome/PDFビューアーダイアログの背後にリクエストを隠します。 +2. ユーザーがサービスを有効にすると、マルウェアは追加の危険な権限(`READ_SMS`, `SYSTEM_ALERT_WINDOW`, `REQUEST_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を強制し、最新のデバイスを使用します。 + +## 参考文献 +* [Bitsight – ToxicPanda Android Banking Malware 2025 Study](https://www.bitsight.com/blog/toxicpanda-android-banking-malware-2025-study) + {{#include ../../banners/hacktricks-training.md}}