针对CVE-2025-31710并连接cmd_skt以在未打补丁的unisoc型号上获取root shell的方法
一种利用 CVE-2025-31710 连接到 cmd_skt 抽象套接字,在未修补的展讯机型上获取 root shell 的方法
在大家喊叫之前,展讯公司本身已授权我在 CVE-2025-31710 公告后发布此内容,所以请保持安静。
让我们先讲个笑话

是的,你没有做梦,今天我要向你展示一个针对 com.sprd.engineermode 应用的系统 shell 漏洞,并且由于它是 cmd_skt 的受信客户端之一,我也能成功进入。这个抽象套接字是作为 root 运行的 cmd_services 服务的一部分,所以,是的,我很高兴向你介绍 unisoc-su。这里是从 cmd_services 二进制文件中用 Ghidra 提取的 cmd_skt 受信客户端列表,可以看到 com.sprd.engineermode 在其中:

该漏洞利用使用了 pascua28 的 com.sammy.systools 应用和 TomKing062 的 cli-pie。该应用有两个版本,一个包含多个用于系统 shell 的二进制文件,另一个仅包含 cli-pie 和一些用于连接其他套接字的 CLI(对于 engpc,你现在可以从系统 shell 引用这个脚本,建议先引用 tools.sh),此外两个版本都有针对 Android 9(适用于较旧设备,你可以用 Apktool M 重新打包应用并选择所需版本)。
该方法的工作原理:首先通过 adb 或 shizuku rish 执行 UnisocEngSyshell_Enabler_Script.sh 来启用 com.sprd.engineermode 应用(仅在新机型上需要),然后按照说明在拨号器中输入 *#*#83781#*#* 运行主活动,接着进入 Adb shell 活动。然后在一行中输入完整的 cli-pie 路径(包括 applet 名称),在另一行中输入 "setprop persist.sys.cmdservice.enable enable",然后尽快先按下 setprop 的启动按钮,再按下 cli-pie 行的启动按钮,一旦看到显示 connected 就成功了。接着在 setprop 活动上按下结束按钮并清除其文本,输入 "nc -s 127.0.0.1 -p 1234 -L sh -l" 或你用来启动反向 shell 的命令。然后回到终端,用相应的二进制文件连回去,如果没运行就引用相应的脚本,或者直接用 "nc 127.0.0.1 1234" 连接,之后执行 "source /sdcard/Documents/unisoc-su.sh"(或者你放置脚本的位置,但必须能从系统 shell 访问)。就这样,如果一切正确,你就获得了 root shell。
现在,我们来谈谈这个漏洞,上下文受到 selinux 的严格保护,我们拥有 root 权限,但所有防护仍然有效。这个 root 很强大,因为我们没有像其他类似漏洞那样禁用任何东西。遗憾的是,这个上下文没有足够的能力禁用 selinux,而且执行似乎只在系统 PATH 中有效。关于服务本身,似乎在 Android 9 上(即 CVE-2022-47339 补丁之前)它的服务 rc 中没有组,因此默认以 root 运行;后来添加了组(并移除了 root 的 gid/groups),所以该服务明显受到了更多限制,但只要有 selinux 启动,它仍然起主导作用。关于服务的行为:在新设备上,该服务似乎一直运行直到有东西使用它或连接到它,如果没有连接的客户端或发出的命令,服务将关闭,并且需要 setprop 属性才能重新开启,服务几乎立即执行此操作,这就是为什么在该方法中我们运行 setprop 并快速连接;在 Android 9 上,服务似乎在发出 setprop 后等待命令,这似乎是新旧设备之间的区别,执行后它会关闭,当然也可以直接用 socat 或 cli-pie 连接(或运行网桥),此时服务将保持运行,因为它被这个连接占用,如果没有提供命令,服务将无限期等待。
来自 Android 13 用户 ROM 和 Android 9 eng ROM 的 cmd_services.rc 展示差异:

启发此方法的 CVE:CVE-2022-47339 (cmd_services) 由曲乐炜 (Lewei Qu) 发现,CVE-2025-31710 (com.sprd.engineermode 系统 shell) 由我发现,尽管曲乐炜 (Lewei Qu) 似乎也有一个关于 com.sprd.engineermode 的类似 CVE (CVE-2022-47341),但我是在自己发现之后才注意到的。
另外还有三个后期出现的特殊情况,它们不属于启发性的 CVE 列表:第一个是重新引入的漏洞,我将其添加在这里以使事情更清晰:CVE-2025-67264 (Doogee 在新展讯机型上对 com.sprd.engineermode 的不完整补丁,详情见这里),也是由我发现的;第二个情况涉及 ZTE 新机型,不清楚是否适用于所有机型或仅部分机型,com.sprd.engineermode 的 Adb shell 活动被保留,在 ZTE Blade V70 Vita 上发生了与 CVE-2025-67264 相同的问题,但后来 ZTE 通过将活动锁定到 userdebug/eng(没有 CVE,因为他们自己注意到了)而不是删除它来修补,结果该活动在应用 UI 中显示但提示无法在 user 版本上打开,易受攻击的设备(可能在此更改之前)为:ZTE/EEA_P606F17/P606F17:14/UP1A.231005.007/20241231.044538:user/release-keys,在 ZTE/EEA_P606F17/P606F17:14/UP1A.231005.007/20250527.224618:user/release-keys 上已修复;类似的情况发生在 ZTE Blade A55 上,这些机型运行 Android 14,其中 cmd_services 被重写并更名为 tool_service(并且可以访问它的服务被缩减为:com.sprd.engineermode, com.sprd.autoslt, com.sprd.runtime, com.spreadtrum.sgps, com.sprd.validationtools),这个新版本始终处于活动状态,不需要任何 setprop;第三个是与本仓库中提到的漏洞类似、影响旧展讯机型的漏洞,详情见这里。
这里提供了 unisoc-su 的各种脚本:不带教程的 unisoc-su.sh;一个引导仅用系统 shell 进入 root shell 的脚本(此方法更简单,可离线工作,无需 shizuku/adb):unisoc-su-syshell-only-tut.sh;一个引导使用 shizuku/adb 进入 root shell 的脚本(仅用于运行 setprop 部分):unisoc-su-adb-shizuku-tut.sh;还有一个用来连接各种套接字的版本,从你的终端引用你喜欢的一个,只有 unisoc-su.sh 和最后一个需要从系统 shell 引用。此外,ghostroot 文件夹中还有一个 tools.sh 脚本,用于向 PATH 添加各种目录,兼容 adb/系统/root 环境;还有一个 multi 脚本,如果你不知道系统上有哪个 nc,它会尝试从多个可能的二进制文件中进行 nc 直到连接成功。
现在也添加了一个小的 POC 应用,它只有四个按钮:一个用于连接到 cmd_services root shell,另一个用于连接到系统 shell,一个帮助按钮,一个清除输出按钮,以及一个迷你终端。准备工作必须手动完成,因此使用安全。
关于 GhostRoot(后利用 root 通道) 一种隐秘的后利用命令通道,驻留在 RAM 中,并通过基于文件的 I/O 接受来自任何无权限应用的输入。
该漏洞适用于 Android 13 及以下版本,因为在更高版本中展讯移除了 EngineerMode 应用中的 sharedUserId 标签,现在它变成了一个普通用户应用,这使得 selinux 在 Android 14 及以上版本中拒绝执行 cli-pie。
图片由 TomKing062 提供
一张系统 shell 和 root shell 的截图

以下是进入 cmd_services root shell 的视频教程
https://github.com/user-attachments/assets/225165d9-fd8b-4558-849a-7b00895ce894
https://github.com/user-attachments/assets/953ed696-f3a1-4556-8756-07bbe555b3ae
更简单的进入 root shell 的方法(需要 com.sprd.engineermode 在后台打开)
https://github.com/user-attachments/assets/d3eb19db-befa-4136-9bd4-b6bdf9bb8bc7
如果可能,请不要在其他地方转载此内容。