Linux 内核热补丁方案介绍对比
【摘要】 Linux 内核热补丁 linux 内核热补丁技术背景 update和upgrade的区别Linux upgrade (升级)升级是软件的最新版本。升级的频率比更新的频率低,并且通常以软件的重大改进,新功能,增强的功能和其他明显的更改。通常考虑到比较大的变化和更高的性能,必须升级操作系统。Linux update (更新)软件更新是补丁程序,并且可以充当您正在使用的系统的增强版本。通常,更...
Linux 内核热补丁
linux 内核热补丁技术背景
update和upgrade的区别
- Linux upgrade (升级)
升级是软件的最新版本。升级的频率比更新的频率低,并且通常以软件的重大改进,新功能,增强的功能和其他明显的更改。通常考虑到比较大的变化和更高的性能,必须升级操作系统。 - Linux update (更新)
软件更新是补丁程序,并且可以充当您正在使用的系统的增强版本。通常,更新将解决可能导致先前版本中的问题。更新发生的次数比升级发生的次数要多得多,并且通常更着重于细微调整以改善用户体验或安全性,而不是进行任何重大的软件修改。
需求
客户对厂商提供linux服务都有安全补丁周期SLA的要求(一般是1个月到3个月),由于内核频繁的安全补丁并要求重启服务器,对Linux的SLA以及运维带来了很大的困难。
历史
2008年MIT的 JeffArnold 开发了 KSplice ,支持免重启(无数据结构修改的补丁)的内核安全补丁升级。 KSplice 2011年被Oracle收购,社区开始开发自己的热升级能力,2014年 Redhat推出了 Kpatch, SUSE推出了 Kgraft, 同一年CloudLinux推出了KernelCare。 Ubuntu在14.04以后也推出了Canonical Livepatch
主要项目
项目 | 厂商 | 简介 | 自动化程度 | 工作级别 |
---|---|---|---|---|
KSplice | Oracle | linux社区第一个热补丁项目,后被Oracle收购 | 全自动 | 指令集 |
Kpatch | RedHat | 代码开源,但是需要RHEL的license才可以使用 | 管理员 | 函数 |
Kgraft | SUSE | 在企业版SELS中提供 | 管理员 | 函数 |
Canonical Livepatch | Canonical | 只在 Ubuntu Advantage Program中提供 | 全自动 | |
KernelCare | CloudLinux | 支持所有发行版,按月按Server收费 | 全自动 |
这些项目的开源版本都有以下类似的信息:。。。
WARNING: Use with caution! Kernel crashes, spontaneous reboots, and data loss may occur!
方案原理
- KSplice
Ksplice的核心原理是做一个binary的diff,再把patch直接加载到内存中,这就需要为每个update写一个自定义的patch.
工作流:
-
为了准备对运行中的内核进行更改,Ksplice构建了两个内核树(第1阶段),在目标代码级别做diff (第2阶段),优化(第3阶段),打包(第4阶段) )。
-
为启用新功能,Ksplice尝试在旧功能起始为止添加蹦床跳跃,程序首先停止进程,并确保代码不使用线程。
- Kpatch
Kpatch工作在function级别,所以最基本的原理就是使用新的function替换旧的function,的主要组件包括:
- kpatch-build:将源差异补丁程序转换为热补丁程序模块的工具集合。它们的工作方式是在有或没有源补丁的情况下编译内核,比较二进制文件,并生成一个热补丁模块,其中包括要替换功能的新二进制版本。
- 热补丁模块:内核模块(.ko文件),其中包括替换功能和有关原始功能的元数据。
- kpatch核心模块:内核模块(.ko文件),为热补丁模块提供接口以注册新功能以进行替换。它使用内核ftrace子系统来挂钩原始函数的mcount调用指令,以便将对原始函数的调用重定向到替换函数。
- kpatch utility:命令行工具,允许用户管理热补丁模块的集合。可以将一个或多个热补丁模块配置为在引导时加载,这样,即使在重新引导到相同版本的内核之后,系统也可以保持修补状态
- kgraft
与kpatch一样kgraft使用ftrace架构打补丁,主要实现方式如下:
- 为内核的一个函数打补丁,kGraft需要在当前函数前插入一个跳转到新的函数,这就需要一些内存空间,这个空间是在GCC编译功能打开的情况下由内核编译时分配的。实际效果就是一个5字节的调用指令被注入到内核函数的开始的位置。当内核正在引导时,性能分析调用将被替换为5字节的NOP(无操作)指令。
- patch动作执行时,第一个字节被INT3(断点)指令替换。这确保了5字节指令替换的原子性。其他四个字节由新函数的地址替换。最后,第一个字节被JMP(long jump)操作码代替。
- 在整个过程中使用处理器间不可屏蔽中断(IPI NMI)刷新系统中其他CPU的推测解码队列。这样就可以在不停止内核的情况下切换到新功能,即使是在很短的时间内也不会停止。IPI NMI的中断可以以微秒为单位进行度量,并且在任何情况下都不会在内核运行时将其视为服务中断。
- 调用者永远不会被打补丁。取而代之的是,调用者的NOP被新功能的JMP取代。JMP指令将永远保留。包括函数指针,包括结构中的指针,并且不需要保存任何旧数据就可以取消修补。
- 但是,仅靠这些步骤是不够的:由于将以非原子方式替换函数,因此内核某一部分中的新固定函数仍可以在其他位置调用旧函数,反之亦然。如果功能接口的语义在补丁程序中发生了变化,则会造成混乱。
因此,在替换所有功能之前,kGraft使用基于蹦床的方法并且类似于RCU(读-复制-更新),以确保每个用户空间线程,内核线程和内核中断对的一致性。在每个内核entry和exit都设置一个基于线程的标志。这样,旧function将始终调用另一个旧功能,而新功能将始终调用新功能。一旦所有进程都设置了“ new Universe”标志,修补程序就可以完成,可以删除蹦床,并且除了每个修补函数的extra-long jump外代码可以全速运行而不会影响性能.
功能对比
功能 | Ksplice | Kgraft | Kpatch | Livepatch | KernelCare |
---|---|---|---|---|---|
回滚 | 支持 | 支持 | 支持 | 支持 | 支持 |
防火墙友好 | 不支持 | 不支持 | 不支持 | 不支持 | 支持 |
离线更新 | 支持 | 不支持 | 不支持 | 不支持 | 支持 |
访问控制 | 支持 | 不支持 | 不支持 | 支持 | 支持 |
支持的发行版数量 | 2 | 1 | 4 | 1 | 9 |
定制内核 | 不支持 | 不支持 | 支持 | 不支持 | 支持 |
QEMU热升级
- 主要修改了QEMU和linux内存管理子系统,新增cprsave 和cprload两个工具
- 主业务流程:
- VM running with Old QEMU
- Update QEMU binary
- Pause Vm, save state and exec new QEMU (cprsave)
- Restore state and resume VM (cprload)
- VM running with new QEMU
参考
- https://www.infosecurity-magazine.com/blogs/linux-kernel-live-patching/
- https://developer.ibm.com/technologies/linux/tutorials/live-patching-the-linux-kernel/
- https://blog.kernelcare.com/the-ultimate-guide-to-updating-linux-kernel
- https://access.redhat.com/articles/2475321
- https://securityboulevard.com/2020/07/how-to-choose-linux-kernel-live-patching-software/
- https://www.cs.fsu.edu/~zwang/files/asplos19.pdf
- https://blogs.oracle.com/linux/qemu-live-update
- https://blog.kernelcare.com/the-ultimate-guide-to-updating-linux-kernel
- https://lore.kernel.org/qemu-devel/1596122076-341293-1-git-send-email-steven.sistare@oracle.com/
- https://lore.kernel.org/lkml/1588812129-8596-1-git-send-email-anthony.yznaga@oracle.com/
- https://lore.kernel.org/lkml/1595869887-23307-1-git-send-email-anthony.yznaga@oracle.com/
- https://www.howtoforge.com/history-of-linux-kernel-live-patching/
- https://www.cloudsavvyit.com/7091/what-is-linux-kernel-live-patching/
- https://www.redhat.com/en/blog/introducing-kpatch-dynamic-kernel-patching
- https://documentation.suse.com/sles/12-SP4/html/SLES-kgraft/index.html
- https://en.wikipedia.org/wiki/KGraft
- https://www.linux-magazine.com/Issues/2008/95/KSplice
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)