费曼来信:如何在不碰原件的情况下,篡改图书馆的“母盘”?——聊聊 Linux 内核的 Copy Fail 漏洞
读完步子哥关于
CVE-2026-31431 (Copy Fail) 的深度拆解,我感觉这简直是一场发生在内存深处的“
数字神偷”大戏。
为了让你明白这四个字节是如何撬动 Root 王座的,咱们把 Linux 内核比作一家
超高性能的自动化图书馆。
1. Page Cache:那个极速的“阅览室复印件”
图书馆为了快,不会每次都从地库(磁盘)里搬大部头。它会把热门书(常用文件)复印一份,放在阅览室的桌子上(Page Cache)。
大家读书,读的其实都是桌上这份
复印件。
2. Splice():那个“嫌复印麻烦”的管理员
内核里有个提速神器叫
splice()。它为了追求“零拷贝”的极致速度,做了一件极其大胆的事:
当你想把书的内容传给别人时,它不再去复印一遍,而是直接把阅览室桌子上那份
复印件的指针(引用)递给了你。
这就好比管理员把原稿递到了读者手里,却忘了叮嘱:“这玩意儿是公用的,你千万别在上面划线。”
3. AF_ALG 与 AEAD:那个“手滑”的快递员
攻击者找来了一个内核加密工具(AF_ALG)。
他利用一个叫
In-place(原地处理) 的优化漏洞:
- 偷梁换柱:攻击者先用
splice() 骗到了一个只读文件(比如 passwd 程序)在内存里的“复印件”。
- 暗度陈仓:然后他发起一个加密请求。内核这个“快递员”在处理时,为了省事,直接在刚才那个“复印件”上原地写入了 4 个字节的序列号。
这就好比你在看书时,快递员走过来,非要在你手里那份本该只读的“母盘复印件”边角上,盖了一个章。
4. 费曼式的判断:内存的“背叛”
磁盘上的文件(原稿)确实没变,权限也依然是 Root 所有的。
但
阅览室桌子上的复印件(内存缓存)已经被污染了。
当系统下一次运行那个
setuid 程序(比如
passwd)时,它不会去磁盘读,而是直接读取内存里那个被你“盖过章”的、已经叛变的版本。
那区区四个字节,可能刚好改写了一个跳转指令,让程序直接跳过了权限检查。
带走的启发:
所谓的“安全”,往往在追求“效率”的路上被献祭了。
splice() 的零拷贝和 AEAD 的原地优化,单独看都是天才的设计,但当它们在“
共享引用”这个点上相撞时,就产生了一个致命的坍塌。
在架构设计中,永远要警惕那种“跨越信任边界”的直接指针传递。 当你把“母盘”借出去的那一刻起,你就必须假设它已经被涂鸦了。
#LinuxKernel #CVE202631431 #PageCache #ZeroCopy #PrivilegeEscalation #FeynmanLearning #智柴安全实验室🎙️