主要观点:介绍了 Linux 内核 6.10 中的新系统调用mseal及其内存密封保护机制,包括其与之前内存保护方案的区别、工作原理、能阻止的攻击场景以及如何使用等。
关键信息:
mseal可在程序运行时使内存区域不可被非法修改,由 Chrome 的 Security 团队引入用于支持 V8 CFI 策略。- 函数签名为
int mseal(unsigned long start, size_t len, unsigned long flags),flags暂未使用需设为 0。 - 实现中会计算
end偏移、锁定内存区域,通过check_mm_seal确保目标内存映射范围有效,apply_mm_seal为目标区域添加VM_SEALED标志。 mseal会添加VM_SEALED检查到多个内存管理文件中,禁止对密封 VMA 进行多种操作,如修改权限、解除映射等。- 可通过直接系统调用在 6.10+内核中调用
mseal,有基本的封装实现代码。 mseal能阻止两种攻击场景:篡改 VMA 权限和通过任意解除映射/重新映射进行“打洞”攻击。- 在软件中使用
mseal可增强栈的 NX 保护,开发者需负责保护特定区域,期望glibc集成中出现可调节的自动密封功能。
重要细节: - 在
do_mseal函数中,通过mmap_write_lock_killable锁定内存区域,防止并发访问。 check_mm_seal函数通过遍历vm_area_struct列表来检查目标内存映射范围的有效性。apply_mm_seal函数再次遍历vm_area_struct,通过mseal_fixup为目标区域添加VM_SEALED标志。- 在其他内存管理系统调用中,
can_modify_vma函数用于检查 VMA 是否可修改,若存在VM_SEALED标志则禁止修改。 - 举例说明了
mseal在防止传统 shellcode 攻击和阻止特定数据攻击方面的作用,如针对 MikroTik RouterOS 的 CVE-2018-7445 漏洞和 House of Muney 攻击等。 - 提到
mseal在glibc集成中的发展,期望出现可调节的自动密封功能,开发者可选择性地密封特定的 mmap 分配。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。