主要观点:介绍利用“Overwriting modprobe_path”技术的新方法,该技术曾因上游内核补丁而不可行,但通过“AF_ALG 套接字”等方式可重新使用,结合其他技术可实现无文件提权。
关键信息:
- 去年合并的补丁使上游内核无法通过执行虚拟文件触发“modprobe_path”。
- “Overwriting modprobe_path”技术通过覆盖“modprobe_path”符号实现提权,此前因众多博客已详细解释故只作简要总结。
- 去年 11 月的补丁移除了/fs/exec.c 中的遗留代码,导致原触发“modprobe_path”的方法失效,但可寻找其他调用“request_module()”的执行流。
- “AF_ALG 套接字”在调用“bind()”时会触发“alg_bind()”函数,若传入无效加密类型字符串则会调用“request_module()”,从而可执行“modprobe_path”变量中的文件实现提权。
- 利用“AF_ALG 套接字”的方法无需创建文件,与 lau 的 memfd_create()技术结合可实现完全无文件提权,在挂载命名空间中只需实现 PID 猜测。
重要细节: - 内核版本 v6.14 - rc1 前执行特定魔法数的虚拟文件会触发一系列调用栈,其中“call_modprobe()”会从“modprobe_path[]”变量获取文件路径并执行。
- “modprobe_path[]”变量可写,攻击者可利用任意地址写原语覆盖它为执行 shell 的文件路径,从而以 root 权限执行 shell 实现提权。
- “AF_ALG 套接字”相关代码中,通过“alg_bind()”函数搜索用户提供的类型,若未找到则调用“request_module()”加载模块。
- 完整的 PoC 代码通过 memfd_create()创建匿名内存映射,填充 shell 脚本,将映射路径存储在“fake_modprobe”变量中,利用 AAW 原语覆盖“modprobe_path[]”,创建“AF_ALG”套接字并调用“bind()”实现提权。在挂载命名空间中需实现 PID 猜测。
- 目前/fs/exec.c 补丁仅合并到上游内核,未回退到稳定树或发行版内核,分发版内核仍可使用虚拟文件执行技术,未来可利用其他调用“request_module()”的流。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。