farazsth98/chronomaly
GitHub: farazsth98/chronomaly
Chronomaly 是一个针对 CVE-2025-38352 的 Android/Linux 内核漏洞利用程序,专门利用竞态条件攻击 v5.10.x 版本的内核。
Stars: 286 | Forks: 44
# Chronomaly
Chronomaly 是一个利用 CVE-2025-38352 针对 Android / Linux 内核的漏洞利用程序。该利用程序专门为 Linux 内核 v5.10.157 编写,但应该适用于所有存在漏洞的 v5.10.x 内核,因为它不需要任何特定的内核文本偏移量即可工作。
我在一个分为三部分的博客文章系列中详细介绍了该漏洞,从 PoC 到漏洞利用全流程:
- 第一部分 - [野外 Android 内核漏洞分析 + PoC](https://faith2dxy.xyz/2025-12-22/cve_2025_38352_analysis/)
- 第二部分 - [在无需内核补丁的情况下扩展竞态窗口](https://faith2dxy.xyz/2025-12-24/cve_2025_38352_analysis_part_2/)
- 第三部分 - [揭示 Chronomaly](https://faith2dxy.xyz/2026-01-03/cve_2025_38352_analysis_part_3/)

# 构建设置
该漏洞利用程序仅针对在 QEMU 中运行的 x86_64 Linux 内核 v5.10.157 进行了测试。我请一位朋友发给我他们的 Pixel 6a 内核配置作为基准,以下是该漏洞利用程序的重要配置选项(我以 kernelCTF 配置为基础):
- `CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n`
- `CONFIG_PREEMPT=y`(完全抢占,非 RT)
- `CONFIG_SLAB_MERGE_DEFAULT=n`
- `DEBUG_LIST=n`
- `BUG_ON_DATA_CORRUPTION=n`
- `LIST_HARDENED=n`
要禁用 `CONFIG_POSIX_CPU_TIMERS_TASK_WORK`,你可以按照我在第一篇博客文章[此处](https://faith2dxy.xyz/2025-12-22/cve_2025_38352_analysis/#config_posix_cpu_timers_task_work)列出的步骤操作。
请参考 `qemu.sh` 文件查看我的 QEMU 运行脚本。测试时我使用了 4 个核心和 3 GB 内存。
# 你需要更改的漏洞利用参数
由于该漏洞利用程序依赖于 CPU 定时器,你可能需要更改两个参数以使其适应你的环境。
## `CPU_USAGE_THRESHOLD`
该参数在消耗 CPU 时间以在 `race_func()` 中触发定时器时使用。必须将其设置为:
- 定时器不会在每次重试尝试时都触发(这意味着 `CPU_USAGE_THRESHOLD` 太高了,因为定时器在 `race_func()` 线程退出之前就触发了)。
- 定时器只是有时触发(这意味着有时定时器在线程退出之前触发,而其他时候在线程退出时触发)。
要确定定时器是否触发,请在 `free_func()` 的 `SIGUSR1` 轮询代码中插入一条 `printf()` 语句。如果你看到打印出消息,这意味着定时器触发了。
如果设置正确,你将开始在终端中看到 "Parent raced too late / too early" 消息。
## `PARENT_SETTIME_DELAY_US`
`PARENT_SETTIME_DELAY_US`。该参数由父进程使用,旨在与子进程同时命中 `send_sigqueue()` 内部的第二个竞态窗口。运行漏洞利用程序,观察并按如下方式修改:
- 消息 "Parent raced too late, readjusting..." 出现得太频繁——减少此参数。
- 消息 "Parent raced too early, readjusting..." 出现得太频繁——增加此参数。
理想情况下,你会看到 "raced too late" 和 "raced too early" 都被打印出来,并且漏洞利用程序将在 1 分钟内成功。如果你只看到其中一个比另一个出现得更频繁,请相应调整。
# 潜在的改进
在我的跨缓存(cross-cache)实现中,我假设内核并不繁忙,并且没有过多的 `struct sigqueue` 分配。我在 `sigqueue_crosscache_preallocs()` 中添加了一条注释,解释了你需要做什么来改进这一点。
如果内核确实非常繁忙,或者 per-cpu / per-node partial 列表上已经存在一些 `struct sigqueue` slab 页面,那么 `exploit.c` 中当前的跨缓存实现将会失败,并且 `uaf_sigqueue` / `realloc_sigqueue` 将不会被重新分配为 pipe buffer 数据页。
我故意选择不在繁忙的内核中使跨缓存生效,以免该漏洞利用程序被滥用 :)
# 问题
如果你有任何问题,请通过 X / Twitter 联系我!
标签:Android, CPU Timers, Cutter, CVE-2025-38352, DSL, KernelCTF, Linux内核, Pixel 6a, POC, QEMU, SLAB, x86_64, 内存破坏, 内核漏洞, 内联执行, 安全渗透, 客户端加密, 提权, 竞态条件, 身份验证强制