一、背景介绍 虽然经常更新内核版本通常被认为是一种安全最佳实践,但由于各种原因,尤其是生产环境中的服务器无法这样操作。这就意味着在机器运行时,会存在利用已知的漏洞(当然,还会有一些未知的漏洞)来进行攻击的情况,所以需要某种方法来检测和阻止对这些漏洞的利用,这正是linux kernel runtime guard(linux内核运行时保护lkrg)诞生目的所在。
lkrg出自openwall项目,该项目因其安全性增强的linux发行版而闻名。openwall的创始人亚历山大·佩斯利亚克(alexander peslyak),在安全领域也很极为出名。他在当年1月底宣布lkrg是“我们有史以来最具争议的项目”。发布的0.0版本“相当草率”,peslyak在lkrg 0.1发布公告中说;首席开发者adam“pi3”zabrocki根据10天的反馈整理内容并添加了一些新功能。
lkrg在linux内核运行时对完整性进行检查,并检测内核的安全漏洞。lkrg是一个内核模块(不是内核补丁),所以它可以针对各种主线和发行版内核进行构建和加载,而不需要打补丁。目前支持的内核版本已更新至5.19,并支持x86-64、32位x86、aarch64 (arm64)和32位arm这几类的cpu架构。
二、lkrg技术原理分析 lkrg对正在运行的linux内核进行检测,并希望能够及时响应对正在运行的进程用户id等凭证未经授权的修改(完整性检查)。对于进程凭据,lkrg尝试检测漏洞,并在内核根据未经授权的凭据授予访问权限(例如打开文件)之前采取行动。juho junnila的论文题为“linux rootkit检测工具的有效性”,显示了lkrg可以作为有效的内核rootkit检测器。lkrg挫败了许多预先存在的linux内核漏洞的利用,并且很可能会检测并防御许多未来没有特意试图绕过lkrg的利用(包括未知的漏洞)。虽然lkrg在设计上是可以绕过的,但这种绕过需要更复杂和/或更不可靠的漏洞。
就其核心而言,lkrg是一个可加载的内核模块,它试图检测正在运行的内核是否存在更改情况,以表明正在对其使用某种类型的漏洞利用。除此之外,它还可以检查系统上运行的进程,以查找对各种凭证的未经授权修改,以防止这些更改授予额外的访问权限,这是exploit试图做的事情。 三、lkrg流程
为了跟踪正在运行的内核,lkrg创建了一个数据库,其中包含关于系统及其上运行的内核的各种类型信息的散列。它跟踪系统中可用的和活动的cpu,以及它们的中断描述符表(idt)和特定于模型的寄存器(msrs)的位置和内容。由于插入(或从系统中拔出)的cpu数量的变化,内核可能会修改自己,所以lkrg必须准备好根据这些事件重新计算一些哈希值。
lkrg除了跟踪内核.text、.rodata和异常向量表之外,也会跟踪每个加载的内核模块,包括它的struct模块指针、名称、.text的大小和哈希值等信息,以及模块特定的信息。为了检测修改,需要定期验证存储的值。这是通过许多机制实现的:
首先是定时检查计时器,检测周期可以通过sysctl接口设置;
当检测到模块加载或cpu热插拔活动,并且可以通过另一个sysctl手动触发时,它也会运行该检查;
系统中的其他事件(例如cpu空闲、网络活动、usb更改等)将触发验证,尽管只有一定百分比的时间来降低性能影响。例如,cpu空闲将触发0.005%的时间验证,而usb更改将触发50%的时间验证;
所有这些都是为了保护运行时内核本身的完整性,但漏洞利用通常会针对系统上运行的进程,以提高特权等,这些信息保存在内核的内存中。因此lkrg还会跟踪每个进程的一系列不同属性,并维护自己的任务列表,用于验证内核的列表。如果两个进程发生分歧,则终止受影响的进程,目的是在被漏洞利用差异之前进行防御。
lkrg跟踪的目标包括task属性,如task_struct的地址、进程名称和id、cred和real_cred凭据结构的地址、与之关联的各种用户和组id、selinux设置以及seccomp配置。所有这些信息在每次系统调用(例如setuid(), execve())或系统中发生其他事件(例如,在打开文件之前检查权限)时被验证。此外,每次运行内核验证时都要执行进程列表验证。每次都要验证所有进程,而不仅仅是进行系统调用的进程,任何差异都会导致终止有差异的进程。
lkrg测试了一些已知内核漏洞 (如cve-2014-9322, cve-2017-6074),性能的影响约为6.5%。
四、lkrg防御种类
非法提权(illegal elevation of privileges)
token / pointer swapping
非法调用comit_creds()
覆写cred/read_cred结构体
沙箱逃逸
namespace逃逸
容器逃逸
异常修改cpu状态
异常修改内核的.text和.rodata段 五、绕过lkrg防御
为了说明lkrg的漏洞检测能力,在对发行版内核的测试中,lkrg成功检测到cve-2014-9322 (badret)、cve-2017-5123 (waitid(2) missing access_ok)、cve-2017-6074(在dccp协议中使用后free)的某些预先存在的漏洞。
但是,它无法检测到cve-2016-5195 (dirty cow)的漏洞,因为这些漏洞直接针对用户空间,即使是通过内核来进行操作。在dirty cow中,lkrg的“绕过”是由于漏洞的性质和利用它的方式,这也是未来利用类似的直接针对用户空间绕过lkrg的一种方式。
从检测端避开lkrg:
覆盖lkrg不保护的关键元数据
将攻击移动到用户空间
赢得竞态
从正面攻击lkrg角度:
攻击lkrg内部的同步机制和锁机制
找到lkrg所有的上下文并禁用它们
通过内核直接攻击用户空间(如dirtycow)
六、增强lkrg防御 计算关键metadata的哈希值
保护范围:
发送到所有cpu中的核心数据ipi (inter-processor-interrupt),并独占地运行lkrg的保护功能(idt/msr/crx/等)
linux内核.text部分
linux内核.rodata部分
linux内核的异常向量表
关键的系统全局变量,如smep和smap
所有动态加载的模块及其在内部结构中的顺序;
如有iommu,也可对其防护
pcfi机制
检测rop
检测栈迁移
非.text数据的利用
动态生成可执行page的利用
通过sysctl动态配置lkrg
root@ubuntu:~/lkrg# sysctl -a|grep lkrglkrg.block_modules = 0lkrg.heartbeat = 0lkrg.hide = 0lkrg.interval = 15lkrg.kint_enforce = 2lkrg.kint_validate = 3lkrg.log_level = 3lkrg.msr_validate = 1lkrg.pcfi_enforce = 1lkrg.pcfi_validate= 2lkrg.pint_enforce = 1lkrg.pint_validate= 3lkrg.profile_enforce = 2lkrg.profile_validate = 9lkrg.smap_enforce = 2lkrg.smap_validate= 1lkrg.smep_enforce = 2lkrg.smep_validate = 1lkrg.trigger = 0lkrg.umh_enforce = 1lkrg.umh_validate = 1
七、结论 从以上lkrg原理的角度来分析,对于需要仔细考虑内核的威胁模型以及具体需求的个人或公司来说,lkrg的功能是有价值的。所以可以作为系统级别纵深防御策略中的另一道防线,而不是“一招胜天”的灵丹妙药。我们知道,内核中充满了各种类型的自修改代码,从跟踪点和其他调试特性到各种优化,因此保护运行时的内核完整性并不是一项简单的任务。本文分析了lkrg的原理与优劣势解析,下篇将从实际案例和代码的角度来分析,为什么会选择lkrg做运行时安全检测,敬请期待。
关于透明传输在通信中的应用浅谈
关于HF与HNO3混合物中硅的湿化学蚀刻机理研究报告
NSA先行SA将是主流部署方式,5G手机该如何选择
欧美计划提高LED照明标准再度来袭
5年耕耘,赫联亚太已从呱呱落地到翩翩少年
LKRG技术原理分析
多种功能的完美结合造就了线性充电器稳健的系统设计
升级iOS10.3更流畅,大家都被苹果耍了!
视觉检测在耳机帽外观缺陷检测中的优势是什么
改用OLED屏搞不定?传iPhone 8可能延期
不得不关注的六个LED照明技术细节
全国首条智慧地下电缆线路的监控信息正式接入
助力低碳,深耕低温锡膏技术引领行业工艺发展
有哪些平价的蓝牙耳机?四款适合学生的平价蓝牙耳机推荐
冠层分析仪的作用是什么,它有哪些应用
传感器前级信号处理
UWB室内定位高精度定位应用的宠儿
ADI新数字隔离器封装确保医疗和工业应用安全
基于A2DP框架的近距离无线音频通信研究
联发科公布第三季财报 营收达670亿元并表示对AI的投入已有相当的成果