Chronomaly 是一个利用 CVE-2025-38352 的 Android/Linux 内核漏洞利用程序。该漏洞利用专门针对 Linux 内核 v5.10.157 编写,但由于不需要任何特定内核文本偏移量,它应适用于所有有漏洞的 v5.10.x 内核。
我在一个三部分的博客系列文章中详细介绍了该漏洞,从 PoC 一直讲到漏洞利用:

该漏洞利用仅在 QEMU 中运行的 x86_64 Linux 内核 v5.10.157 上测试过。我请一位朋友给我发送了他们 Pixel 6a 的内核配置,以此为基础配置我的内核。以下是该漏洞利用所需的关键内核配置选项(我从 kernelCTF 配置开始):
CONFIG_POSIX_CPU_TIMERS_TASK_WORK=nCONFIG_PREEMPT=y(完全抢占,非 RT)CONFIG_SLAB_MERGE_DEFAULT=nDEBUG_LIST=nBUG_ON_DATA_CORRUPTION=nLIST_HARDENED=n要禁用 CONFIG_POSIX_CPU_TIMERS_TASK_WORK,您可以按照我第一篇博客文章中此处的步骤操作。
关于我的 QEMU 运行脚本,请参考 qemu.sh 文件。测试时我使用了 4 个内核和 3 GB RAM。
由于漏洞利用依赖于 CPU 定时器,你可能需要更改两个参数以适应你的环境。
CPU_USAGE_THRESHOLD该参数用于在 race_func() 内消耗 CPU 时间来触发定时器。必须将其设置为:
race_func() 线程退出之前就触发了,说明 CPU_USAGE_THRESHOLD 太高)。要判断定时器是否触发,可以在 free_func() 的 SIGUSR1 轮询代码中插入一个 printf() 语句。如果你看到消息打印出来,说明定时器触发了。
如果设置正确,你会在终端中开始看到 "Parent raced too late / too early"(父进程竞态太晚/太早)的消息。
PARENT_SETTIME_DELAY_USPARENT_SETTIME_DELAY_US。父进程使用此参数来与子进程同时命中 send_sigqueue() 中的第二个竞态窗口。运行漏洞利用程序,观察并根据以下情况修改:
理想情况下,你应该看到 "raced too late" 和 "raced too early" 都打印出来,漏洞利用程序将在一分钟内生效。如果你只看到其中一种出现频率远高于另一种,请相应调整。
在我的跨缓存实现中,我假设内核不是太繁忙,并且没有太多的 struct sigqueue 分配。我在 sigqueue_crosscache_preallocs() 中添加了一条注释,解释了改进所需的操作。
如果内核非常繁忙,或者在某些每 CPU / 每节点 partial 列表中已经存在一些 struct sigqueue slab 页面,那么 exploit.c 中当前的跨缓存实现将会失败,并且 uaf_sigqueue / realloc_sigqueue 将无法重新分配为管道缓冲区数据页面。
我特意选择不在繁忙内核中实现跨缓存,以免漏洞利用被滥用 :)
如果你有任何问题,请通过 X / Twitter 联系我!