VED (Vault Exploit Defense): 开源实现
VED - Linux内核威胁检测与防护
VED的LKM版本终于开源了。
VED进化过程
赛博堡垒之前的文章中介绍了Linux内核安全的现状和挑战以及云原生和车联网方案中第三方Linux内核安全方案的场景。赛博堡垒致力于为运行(GNU)-Linux系统的平台和基础架构构建全栈安全方案,在这个过程中我们从PaX/GRsecurity中学习了很多东西,从2010年开始我们持续研究了不同场景下的Linux内核漏洞利用的方法,有些案例是公开的而有些则是并未公开,到2021年赛博堡垒(HardenedVault)成立后我们开始着手研究如何能在部署简易度,性能开销,稳定性以及安全性之间达到平衡,这也是VED目标,这也让VED从一开始就是针对企业生产环境而设计和实现的,比如:
-
根据漏洞利用方法通用性进而判断是否应该减少某些代码模块的检测范围
-
VED和Linux内核对于企业生产环境来说是一个整体,我们也通过VaultFuzzer对生产环境应用高度依赖的Linux内核子系统进行压力测试以达到较高的代码覆盖率
-
安全方案扮演业务系统守护者的角色,VED通过VSPP自防护特性加强了自身的防护能力以避免类似Tetragon事件的发生。
理论上讲,VED的特性可以兼容包括LKRG,AKO甚至Linux内核rootkit在内的任意LKM框架,我们在LKM的版本最终选定基于开源并且长期维护的LKRG。我们针对公开的漏洞利用和客户提供的0day漏洞利用方法进行了分析。
漏洞 | 漏洞缓解阶段 |
---|---|
CVE-2021-22555 | Exploitation |
CVE-2021-3573 | Exploitation |
CVE-2021-3490 | Post-exploitation, situational hardening |
CVE-2021-33909 | Exploitation |
CVE-2021-34866 | Exploitation |
CVE-2021-43267 | Exploitation |
CVE-2021-42008 | Exploitation |
CVE-2022-0185 | Exploitation |
CVE-2022-0492 | Post-exploitation, situational hardening |
CVE-2022-25636 | Exploitation |
CVE-2022-1015/CVE-2022-1015-1016 | Exploitation |
CVE-2022-23222 | Post-exploitation |
Tetragon bypass | Exploitation |
赛博堡垒制作了一个用于测试漏洞利用的AMI,读者有兴趣可以在AWS上进行测试,选择区域:US East (N.Virginia),之后进行搜索"vault exploit test":
赛博堡垒也在AWS提供了代号为“超越合规“的安全加固版本Hardened Linux (Ubuntu for both x86_64 and arm64),这个版本提供默认的安全加固,通过CIS/STIG最佳实践更容易的帮助用户实现合规(比如PCI-DSS,GDPR等),也默认提供了ModSecurity(Web防火墙),VED(Vault Exploit Defense)社区版以及其他安全特性。
- Hardened Linux (Ubuntu 22.04 for x86_64)
- Hardened Linux (Ubuntu 22.04 for arm64)
检测类型:从赛博堡垒的视角
LKRG 特性
- 检查SMEP/SMAP的开启和关闭(p_ed_pcfi_cpu)
- pCFI(pSMEP/pSPC): 检测栈上返回地址是否为内核代码段, 以及栈的指针, 大小
- 提权检测: 检查credentials是否被数据污染,修改提权(p_ed_enforce_validation)
- 内核代码段完整性检测,模块加载检测
- addr_limit (针对老版本内核)
- 隐藏内核模块
VED 特性
- wCFI: 检查栈上返回地址是否为正确callsite
- wCFI: Callee可能被特定函数重用的检测(依赖于关闭tail-call优化和直接调用)
- VSPP (Vault self-protection): 检查kprobe是否被关闭, 检查关键 hook 点是否被关闭, 卸载 ved 模块函数的执行流检查
- 只读timer: 检查部分安全相关的只读数据有没有被污染, 导致安全特性被bypass
提权检测
kprobe point: native_write_cr4, commit_creds, override_creds, revert_creds, call_usermodehelper_exec, call_usermodehelper, set_current_groups, sys_set*id, sys_capset
触发点: 这些内核函数可以重用以进行权限提升,检查它们是否由可用的调用站点调用。
特性: L1 + L2 + V1 + L3 + (V2) 括号表示部分函数使用
VED自防护
kprobe point: disable_kprobe, p_exploit_detection_exit, text_poke
触发点: 被重用的代码路径。
特性: L1 + L2 + V1 + L3 + V1 + V3
后漏洞利用检测
kprobe point: mark_inode_dirty, sys_unshare, cap_task_prctl, sys_add_key, security_ptrace_access, generic_permission, security_bprm_committed_creds, security_bprm_committing_creds, wake_up_new_task, sys_ptrace
触发点: 提权发生后进行新建进程时、或运行时namespace/capability/credentials检测。
特性: L1 + L2 + V1 + V3
Timer & schedule
LKRG timer
kprobe point: schedule, lookup_fast, __queue_work, wake_up_new_task
触发点: 提升检测漏洞利用频率。
特性: L1 + L2 + V1 + L3 + L5 + L6 + V1
- 间隔: 默认15秒
VED ro guard
只读数据: mmap_min_addr, kptr_restrict, kprobes_all_disarmed
触发点: cyclical check if these essential date was corrupted.
特性: L4 + V4
- 间隔: 1秒
编译和使用
make && insmod ved.ko