深入研究 Linux 的新 mseal 系统调用

主要观点:介绍了 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 攻击等。
  • 提到msealglibc集成中的发展,期望出现可调节的自动密封功能,开发者可选择性地密封特定的 mmap 分配。
阅读 53
0 条评论