Skorpion96/unisoc-su
GitHub: Skorpion96/unisoc-su
针对 Unisoc 芯片 Android 设备的本地提权工具,利用 CVE-2025-31710 漏洞通过工程模式应用获取 root shell
Stars: 90 | Forks: 14
# unisoc-su
一种利用 [CVE-2025-31710](https://nvd.nist.gov/vuln/detail/CVE-2025-31710) 并连接到 cmd_skt 抽象套接字以在未修补的 Unisoc 机型上获取 root shell 的方法。
在大家惊呼之前,Unisoc 本人授权我在 [CVE-2025-31710](https://nvd.nist.gov/vuln/detail/CVE-2025-31710) 公告发布后公开此内容,所以请保持冷静。
让我们从一个玩笑开始

是的,你没在做梦,今天我想向大家展示一个针对 com.sprd.engineermode 应用获取 system shell 的 exploit,而且由于它是 cmd_skt 的受信任客户端之一,我也能够进入该套接字。这个套接字属于一个以 root 运行的服务 (cmd_services),所以是的,我很高兴向大家展示 unisoc-su。在这里你可以看到通过 ghidra 从 cmd_services 二进制文件中提取的 cmd_skt 受信任客户端列表,其中显示了 com.sprd.engineermode 的存在:

这个 cmd_skt 是一个抽象套接字,曾在 2022 年被侵入过:[CVE-2022-47339](https://nvd.nist.gov/vuln/detail/cve-2022-47339),因此现在如果没有连接,它几乎会立即退出,你必须足够快才能不让连接断开。对于此 exploit,使用了由 [pascua28](https://github.com/pascua28) 开发的 com.sammy.systools 应用以及由 [TomKing062](https://github.com/TomKing062) 开发的 [cli-pie](https://github.com/TomKing062/cmd_services_client/releases),还有另一个放置者 (placer) 应用,它仍然是 com.sammy.systools 应用,但除了 [cli-pie](https://github.com/TomKing062/cmd_services_client/releases) 和一些用于连接其他各种套接字的 cli 外,删除了所有二进制文件(对于 engpc,你现在可以从 system shell source [这个](https://github.com/user-attachments/files/25319358/engpcctl_cli.sh),我建议先 source tools.sh),如果你不想要完整的应用,请使用这个。两者都应该能在 arm 和 arm64 上运行,我后来修改了第二个应用,所以它看起来不同,但它仍然是 com.sammy.systools 应用,现在还有一个适用于低版本 Android 设备的 Android 9 版本应用,包含与这第二个放置者应用相同的二进制文件。
此方法的工作原理:你首先以 adb 或 shizuku rish 身份执行 UnisocEngSyshell_Enabler_Script.sh 以启用 com.sprd.engineermode 应用(仅在新机型上需要),然后按照说明在拨号器上运行 `*#*#83781#*#*` 以启动主 activity,然后从这里进入 Adb shell activity。然后在一行中输入完整的 [cli-pie](https://github.com/TomKing062/cmd_services_client/releases) PATH(包括 applet),在另一行输入 "setprop persist.sys.cmdservice.enable enable",然后尽可能快地先在 setprop 行按 start,然后在 [cli-pie](https://github.com/TomKing062/cmd_services_client/releases) 行按 start, boom,它会显示已连接。然后在 setprop activity 上按 end 并删除其文本,输入 "nc -s 127.0.0.1 -p 1234 -L sh -l" 或你用来运行 reverse shell 的命令。然后转到终端并使用相应的二进制文件连回,如果它不运行,则 source 相应的脚本或简单地使用 "nc 127.0.0.1 1234" 连接,之后 "source /sdcard/Documents/unisoc-su.sh"(或你放置脚本的位置,但必须可从 system shell 访问)。就是这样,如果一切正确,你就获得了 root shell。
现在,让我们谈谈这个 exploit,其上下文受到 selinux 的严密保护,我们拥有 root 但所有保护仍然开启。这个 root 非常重要,因为我们没有像其他类似 exploit 那样禁用任何东西来获取它。不幸的是,这个上下文没有足够的权限来禁用 selinux,而且执行似乎只能在 system PATH 上工作。关于服务本身,似乎在 eng 版本上没有组(至少在 Android 9 上),因此 gid 默认为 root,而在 user 构建上 gid 是 system,所以它更受限制,但在 selinux 开启的情况下,起决定作用的还是它。


启发此方法的 CVE:[CVE-2022-47339](https://nvd.nist.gov/vuln/detail/cve-2022-47339) (cmd_services) 和 [CVE-2025-31710](https://nvd.nist.gov/vuln/detail/CVE-2025-31710) (com.sprd.engineermode system shell)。
还有后来出现的两个特殊情况,它们不在启发性 CVE 列表中,第一个是重新引入的漏洞,我会把它加在这里以使事情更清晰:[CVE-2025-67264](https://www.cve.org/CVERecord?id=CVE-2025-67264) (Doogee com.sprd.engineermode 在新 unisoc 机型上的错误补丁,已在 [此处](https://github.com/Skorpion96/unisoc-su/blob/main/CVE-2025-67264.md) 覆盖),第二个是影响旧 unisoc 机型的与此仓库类似的漏洞,已在 [此处](https://github.com/Skorpion96/unisoc-su/issues/4) 覆盖。
这里为 unisoc-su 提供了各种脚本,一个没有教程:unisoc-su.sh,一个指导仅使用 system shell 进入 root shell(此方法更简单,可离线工作且不需要 shizuku/adb):unisoc-su-syshell-only-tut.sh,一个指导使用 shizuku/adb 进入 root shell,仅用于运行 setprop 部分:unisoc-su-adb-shizuku-tut.sh,还有一个用于连接各种套接字的版本,从你的终端 source 你喜欢的那个,只有 unisoc-su.sh 和这最后一个需要从 system shell 进行 source。ghostroot 文件夹中还提供了一个 tools.sh 脚本,用于将各种目录添加到 PATH,它与 adb/system 和 root 兼容,还有一个多脚本用于运行 system shell,如果你不知道你的系统上有什么 nc,它将尝试从各种可能的二进制文件运行 nc 直到连接成功。
关于 GhostRoot (Post-Exploit Root Channel)
一个隐蔽的 Post-Exploit 命令通道,它存在于 RAM 中,并通过基于文件的 I/O 接受来自任何非特权应用的输入。
该 exploit 适用于最高 Android 13 的版本,因为在更高版本中,unisoc 从 EngineerMode 应用中移除了 sharedUserId 标签,所以现在它是一个普通的用户应用,这使得 selinux 在 Android 14 及更高版本上拒绝执行 [cli-pie](https://github.com/TomKing062/cmd_services_client/releases)。

图片由 [TomKing062](https://github.com/TomKing062) 提供
除非你的设备的 EngineerMode 位于 vendor 中且未随 system 分区一起更新,我刚刚在 ZTE Blade A55 上发现了这种情况:
[ZTE_Blade_A55_system_ext_build.txt](https://github.com/user-attachments/files/21763984/ZTE_Blade_A55_system_ext_build.txt) [ZTE_Blade_A55_vendor_build.txt](https://github.com/user-attachments/files/21763989/ZTE_Blade_A55_vendor_build.txt) 如果没有,你应该拥有未修补的 engineermode 和 tool_service 而不是 cmd_services。注意,tool_service 不需要任何 setprop 并且应该始终处于活动状态。[tool_service.rc.txt](https://github.com/user-attachments/files/21764386/tool_service.rc.txt)
这是 system 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
如果可能,请不要在其他地方转载此内容。
应用图标取自此处的 [icon-link],许可证在此处的:[license-link]
标签:0day, Abstract Socket, Android 安全, Arm, Arm64, cmd_services, cmd_skt, com.sprd.engineermode, Cutter, CVE-2025-31710, Exploit, Ghidra, Root Shell, T1059, T1068, Unisoc, Web报告查看器, 云资产清单, 工程模式, 抽象套接字, 提权, 本地提权, 目录枚举, 移动安全, 紫光展锐, 补丁绕过, 逆向工程, 零日漏洞