-
-
KernelSnitch(侧信道泄漏内核地址部分)
-
发表于: 2025-10-17 19:43 603
-
来自2025黑帽大会亚洲峰会:
光看演讲的内容,还是有些晦涩,简单总结一下关键环节:
1. futex()系统调用(bilibili视频19:03~19:42)
int futex(int *uaddr, int op, int val, const struct timespec *timeout, int *uaddr2, int val3);
op=FUTEX_WAKE,进入内核执行sys_futex_wake(),会根据uaddr+mm计算hash值,遍历查询bucket[hash];
op=FUTEX_WAIT,进入内核执行sys_futex_wait(),会根据uaddr+mm计算hash值,往bucket[hash]添加一个元素。
uaddr和mm,一起参与计算hash值:



2. 侧信道(bilibili视频19:43~21:23)
往bucket[hash0]添加4096个结点(hash0根据collisions[0]+mm计算,其中collisions[0]=futexes[0]),后续如果sys_futex_wake()花费的时间,大于空桶查询时间的10倍,就可以认为进入了bucket[hash0]。
3. 只变uaddr,不变mm,可以得到相同的hash值(bilibili视频21:24~21:57)
从futexes[]另外再找15个"uaddr",存入collisions[1~15],保证根据它们+mm计算的hash值,也为hash0。
4. 用户态暴力推算mm地址(bilibili视频21:58~22:52)
穷举内核地址(很多地址不用尝试的,后面有优化),如果某个地址,结合collisions[0~15],计算的hash值都一样,那就是mm地址了。
5. 2^64个内核地址,优化到2^35.5个地址(bilibili视频22:53~24:15)
保证攻击程序1分钟内找到mm地址。
赞赏
- KernelSnitch(侧信道泄漏内核地址部分) 604
- CVE-2014-0038内核漏洞exp分析 3408
- 零碎记录 389
- how2heap动态演示 3407
- CAS (compare and set) 1683