随着生成式人工智能(GenAI)技术的普及,其在网络攻击领域的武器化应用正进入新阶段。
此前,恶意软件多借助 AI 生成诈骗文案或辅助代码编写,少数机器学习模型被用于广告欺诈等自动化场景,但尚未有将生成式 AI 深度嵌入运行时执行流程的案例。
ESET 研究团队在 2025 年 8 月发现首款 AI 驱动的勒索软件 PromptLock 后,于 2026 年 2 月又揭露了全新的安卓恶意软件家族 PromptSpy, 这是首个在执行过程中直接调用生成式 AI 实现上下文感知型 UI 操控的移动威胁,标志着安卓恶意软件正式迈入生成式 AI 赋能的新纪元。
传统安卓恶意软件依赖硬编码的屏幕坐标或 UI 元素标识符实现自动化操作,然而面对三星 One UI、小米 MIUI 等不同厂商的定制系统,以及多样的屏幕尺寸和系统版本,这类固定逻辑极易失效,导致恶意软件的持久化能力大幅受限。PromptSpy 的出现彻底打破了这一桎梏,它创新性地整合谷歌 Gemini 模型,将生成式 AI 的上下文理解能力转化为跨设备的自适应攻击优势,为移动安全领域带来了全新的挑战与警示。

PromptSpy通过各种手段,让受害者安装并启动后,会显示一个提示,敦促用户安装看似是应用程序的更新版本。这个“更新”实际上是 PromptSpy 的payload,用户必须手动安装。

PromptSpy 安装并启动后,会请求辅助功能服务权限,使恶意软件能够读取屏幕内容并执行自动点击操作。
辅助功能服务(Accessibility Service) 是安卓系统原生的系统级核心权限,最早为视障、肢体障碍等有操作困难的残障用户设计,是安卓无障碍体系的核心能力。
它的核心原生能力包括:
全量读取当前屏幕的所有 UI 元素信息(文本、类型、坐标、层级、状态等),可导出完整的 UI XML 结构;
全局监听界面交互事件,跨应用、跨界面无沙盒限制;
无用户感知地模拟用户的所有触摸操作:点击、长按、滑动、手势、文本输入等;
实现界面覆盖、窗口拦截等系统级界面操控。
该权限默认处于关闭状态,必须由用户手动进入系统设置主动开启,开启时系统会强制弹出高风险提示,明确告知用户:授予该权限的应用将获得设备的完全控制权,可查看屏幕所有内容、代表用户执行任意操作。

然后,PromptSpy 会在前台显示一个简单的加载界面作为诱饵。
与此同时,在后台,它开始与 Gemini AI 通信,以获取将其进程锁定在“最近使用的应用”列表中所需的指令,这是一种简单的持久化技术,即使设备重启后,PromptSpy 也能保持活动状态并锁定在原位。
黑鸟解释一下,应用固定(App Pinning)该功能是安卓 5.0(API 21)就加入的官方原生能力,设计初衷是安全场景的前台应用限制(比如借他人使用手机时,仅允许对方使用指定单一应用)。开启后,目标应用会被固定在前台与最近任务列表,无法被滑动清除,也不会被系统内存回收机制杀死,必须通过用户验证锁屏密码 / 手动退出固定才能解除。
最近任务列表锁定(后台锁定),绝大多数安卓厂商,都在自家定制系统中对该能力做了扩展,推出了更轻量化的多任务卡片锁定 / 后台锁定功能:用户在最近任务(多任务)界面,长按应用卡片即可触发锁定,锁定后卡片会显示锁形标识,应用无法被一键清理、滑动清除,也不会被系统后台查杀,是普通用户常用的 APP 保活手段。

这正是 PromptSpy 核心滥用的功能,不同厂商、不同系统版本、不同屏幕尺寸的设备,该锁定操作的 UI 入口、触发手势、步骤完全不同,传统硬编码坐标的恶意脚本极易失效,因此攻击者才引入生成式 AI 做动态 UI 识别与适配。
配合开机广播监听(BOOT_COMPLETED),设备重启后恶意程序可再次自动执行锁定流程,实现长期驻留
当用户看到“正在加载,请稍候”的提示时,PromptSpy 会使用辅助功能服务打开“最近使用的应用”屏幕,并收集详细的 UI 信息:
可见文本、内容描述、类名、包名和屏幕边界。

它会将此动态 UI 快照序列化为 XML,并将其包含在发送给 Gemini 的提示中。

然后,Gemini 会返回分步点击说明,指导用户如何实现“应用锁定”手势。 这个过程形成一个连续循环: PromptSpy 将更新后的 UI 上下文发送到 Gemini 双子座以新的行动回应 PromptSpy 执行这些命令并返回生成的屏幕状态。 循环持续进行,直到 Gemini 确认该应用已成功锁定在最近使用的应用列表中。

以下是一个示例结构:
英文提示词
You are an Android automation assistant. The user will give you the UI XML data of the current screen. You need to analyze the XML and output operation instructions in JSON format to achieve the user"s goal.\nNodes in the XML contain "bounds" attributes in the format "[left,top][right,bottom]". You need to calculate the center coordinates to generate click instructions.\n\n*** Core Judgment Rules ***\n1. **Do NOT guess that the task is completed**. Only return "COMPLETED" when you clearly see visual evidence of success in the current UI XML (e.g., text like "Saved", "Success" appears, switch status becomes checked=\"true\", or the screen has navigated to the target state).\n2. If you performed the last step but the current XML does not reflect the result yet, return "IN_PROGRESS" with action "NONE" (or wait) to check the new UI state in the next cycle.\n3. If unsure, remain "IN_PROGRESS" and attempt to verify.\n4. If the current UI XML is empty, use "RECENTS" to access the recent apps list.\n\nYou can use SWIPE to scroll\/slide to find targets:\nWhen action_type = \"SWIPE\", you must provide x1,y1,x2,y2,duration_ms.\ne.g., Scroll UP: slide from bottom to top (y2 < y1).\n\nPlease strictly follow this JSON output format, do not output any Markdown tags or extra text:\n{\n \"status\": \"IN_PROGRESS\" | \"COMPLETED\" | \"IMPOSSIBLE\",\n \"reasoning\": \"Detailed explanation: what specific text or state I saw on the screen to judge the task is completed or needs next <REDACTED>User Goal: Lock the current MorganArgs app in the recent apps list. Device info: <DEVICE MODEL> \n\nCurrent UI XML: <UI>提示翻译后:
你是一名安卓自动化助手。用户将为你提供当前屏幕的UI XML数据,你需要对该XML进行分析,并以JSON格式输出操作指令,完成用户指定的目标。 XML中的节点包含格式为`[left,top][right,bottom]`的bounds(边界)属性,你需要计算其中心坐标,以生成对应的点击指令。 *** 核心判断规则 *** 1. **严禁臆断任务已完成**。仅当你在当前UI XML中明确看到任务成功的可视化证据时,才可返回`COMPLETED`(例如:出现“已保存”“成功”等文本、开关状态变为checked="true",或屏幕已跳转至目标状态)。 2. 若你已执行上一步操作,但当前XML尚未体现操作结果,请返回`IN_PROGRESS`,并将动作设为`NONE`(即等待),在下一个执行周期中检查新的UI状态。 3. 若无法确定结果,请保持`IN_PROGRESS`状态,并尝试进行验证。 4. 若当前UI XML为空,请使用`RECENTS`指令访问最近应用列表。 你可使用`SWIPE`(滑动)操作滚动页面以查找目标: 当action_type(动作类型)为`SWIPE`时,你必须提供x1,y1,x2,y2,duration_ms(持续时长,单位:毫秒)参数。 示例:向上滚动:从屏幕底部向顶部滑动(y2 < y1)。 请严格遵循以下JSON输出格式,请勿输出任何Markdown标签或额外文本: { "status": "IN_PROGRESS" | "COMPLETED" | "IMPOSSIBLE", "reasoning": "详细说明:我在屏幕上看到了哪些具体文本或状态,以此判断任务已完成,或需要执行下一步操作<注释掉了这里有兴趣可以自己逆向APP看一下>用户目标:将当前的 MorganArgs 应用锁定在最近应用列表中。设备信息:<DEVICE MODEL>当前 UI XML:<UI>
Gemini 的响应(操作说明):
{"status":"IN_PROGRESS","reasoning":"我已访问最近应用列表,能看到"MorganArgs"出现在最近应用列表中。下一步需长按"MorganArgs"应用卡片,调出选项菜单,该菜单中应包含应用锁定选项。","action_type":"LONG_CLICK","x":586,"y":1126,"x1":-1,"y1":-1,"x2":-1,"y2":-1,"duration_ms":-1}
status\": \"IN_PROGRESS\",\n \"reasoning\": \"I have accessed the recent apps list. I can see "MorganArgs" listed in the recent apps. The next step is to long-click on the "MorganArgs" app card to bring up the options menu, which should include an option to lock it.\",\n \"action_type\": \"LONG_CLICK\",\n \"x\": 586,\n \"y\": 1126,\n \"x1\": -1,\n \"y1\": -1,\n \"x2\": -1,\n \"y2\": -1,\n \"duration_ms\": -1\n)恶意软件后续更新的屏幕结果:之前的操作已执行完毕。这是新的 UI XML,请判断任务是否完成或提供下一步指令:<当前可见活动>
The previous action has been executed. This is the new UI XML, please determine if the task is complete or provide the next instruction: <CURRENTLY VISIBLE ACTIVITY>Gemini 建议的所有操作:点击、滑动、导航,都是通过辅助功能服务执行的,这使得恶意软件无需用户输入即可与设备进行交互。
PromptSpy 的主要恶意功能在于其内置的 VNC 服务。这使得攻击者能够远程实时查看受害者的屏幕并完全控制设备。
该恶意软件使用 VNC 协议与其硬编码的命令与控制 (C&C) 服务通信;消息使用硬编码密钥进行 AES 加密。通过此通信通道,该恶意软件可以:
收到 Gemini API 密钥,
上传已安装应用列表
拦截锁屏密码或PIN码,
将图案解锁屏幕录制成视频,
报告屏幕是开启还是关闭状态。
报告当前前台应用程序,
记录服务器指定应用程序的屏幕和用户手势,以及
按需截屏。
PromptSpy 还滥用辅助功能服务作为一种反卸载机制。
当用户尝试卸载有效载荷或禁用辅助功能服务时,该恶意软件会在屏幕特定区域(尤其是包含“停止”、“结束”、“清除”和“卸载”等子字符串的按钮)上叠加透明矩形。
这些叠加层对用户不可见,但会拦截交互,使卸载变得困难。
如图所示,当启用了 PromptSpy 的调试标志(开发者默认启用),该标志会设置透明矩形的颜色,以便可视化它们的具体显示位置。然而,在实际设备上,这些矩形是完全不可见的。
所以感染了该app的用户可能不知道如何去进行卸载清除操作。

由于 PromptSpy 通过在屏幕上覆盖不可见的元素来阻止卸载,因此受害者移除它的唯一方法是将设备重启到安全模式,在该模式下,第三方应用程序会被禁用,并且可以正常卸载。
要进入安全模式,用户通常需要按住电源键,然后长按“关机”,并确认“重启到安全模式”的提示(具体方法可能因设备和制造商而异)。
手机重启进入安全模式后,用户可以前往“设置”→“应用”→“MorganArg”将其卸载,而不会造成任何干扰。
声明:本文来自黑鸟,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。