LibcarePlus 用户态热补丁技术那些事
LibcarePlus 用户态热补丁作为 openEuler 社区关键技术,受到了广大开发者的关注和讨论。openEuler 社区与天翼云基础架构技术团队通力合作,共同打造了全面支持 aarch64 及 x86 平台的 LibcarePlus 热补丁功能,可以应用于 CVE 漏洞修复,也可应用于不中断应用服务的紧急 bug 修复。下面我们就来聊聊什么是热补丁技术。
热补丁技术背景
当运行的程序存在漏洞的时候,我们一般有以下几种解决办法:
-
替换最新的包含修复补丁的 OS 版本,在有主备倒换能力的组网环境上,可以先将当前运行的程序迁移到备区,待主区升级完后,再将程序迁移到主区; -
替换程序的 rpm 包,然后重新运行程序(注意此时需要考虑依赖包的兼容性),对于具备热替换能力的程序,则可以利用热替换能力,实现程序运行内容的替换; -
直接给运行的程序内容打补丁,替换有问题的代码,实现程序漏洞的修复;
从补丁粒度上来说,上述技术漏洞修复粒度是从大到小变化的:第一个是系统级的,主要涉及的技术有热迁移技术;第二个是 rpm 包级的,主要涉及的技术有热替换;第三个是运行程序级的,主要涉及的技术有热补丁。从业务中断时长来说,上述技术的业务中断时长也是从大到小变化的:第一种技术业务中断时间一般在分钟级,且一般涉及整个系统业务的主备倒换,升级周期最长,一般需要几个月的升级窗口;第二种技术业务中断时间一般在百毫秒级,且该技术一般不通用,需要侵入式修改和适配大量业务代码,升级周期相对比较短,一般仅需要一个月的升级窗口;第三种技术业务中断时间则一般在毫秒级,该技术比较通用,不需要侵入式修改和适配业务代码,仅需要适配一些通用代码,适配工作量较小,升级周期相对比较短,一般仅需要一个月的升级窗口。
通过上述分析,我们大概能总结出热补丁的如下几个优点:一是热补丁能够在不影响现网业务的情况下,完成程序漏洞的修复;二是热补丁适用于需要快速响应的市场环境,将验证工作从版本验证简化为补丁验证。总结一句话:热补丁短小精悍,适合使用在需要快速响应的场景中。
今天,我们就来简单介绍一下,集万千宠爱于一身的 LibcarePlus 热补丁技术。
LibcarePlus 热补丁技术的基本原理
LibcarePlus 热补丁技术是基于上游社区 libcare 独立发展的分支,当前由 openEuler 社区进行自主孵化。相比于上游社区的 libcare,LibcarePlus 支持主流的 x86_64 架构和 aarch64 架构,全面支持 openEuler Qemu 组件,支持函数级过滤,支持增量补丁,支持补丁文件解析等。
我们以 LibcarePlus Qemu 热补丁技术为例,进行相关介绍。热补丁的整体架构如下:
LibcarePlus 热补丁技术主要包括:热补丁制作、补丁管理和补丁加/卸载。
热补丁制作
LibcarePlus 制作热补丁的基本原理是基于汇编级指令比较技术。LibcarePlus 通过比较基线代码生成的汇编中间文件和打了补丁的基线代码生成的汇编中间文件,找到两者之间的差异部分;再基于差异部分,去除冗余段和修复重定位信息,最终得到热补丁 kpatch 文件。在分析汇编差异的前,LibcarePlus 会基于一些关键信息将汇编内容分成函数块和变量块,然后通过比较函数块和变量块之间的差异,找到差异的函数和变量。补丁制作的大概流程如下图所示:
Qemu 热补丁管理
依托于 libvirt 组件对 Qemu 的管理,openEuler 同样将 Qemu 热补丁的管理集成到 libvirt 中。通过与虚拟机的生命周期交互,libvirt 能够更完美地寻找到 Qemu 补丁加载的最佳时机,完成对 Qemu 组件热补丁的管理。
热补丁加载/卸载
热补丁加/卸载的基本原理如下图所示:
LibcarePlus 热补丁加/卸载基于内核提供的 ptrace 能力。通过 ptrace 目标进程,将目标进程短暂冻结,随后进行补丁加载环境的安全校验,在确保补丁加载环境安全的情况下,以 mmap 映射的方式,将适配好的补丁文件插入到目标进程的内存空洞中。在执行完上述步骤后,通过修改缺陷函数的前面五个字节的代码,让缺陷函数在被调用时跳转到新函数的地址中,从而使热补丁生效。最后,解冻目标进程,完成热补丁的加载。
在热补丁加载过程中,缺陷函数被替换的前五个字节代码会保存在目标进程的热补丁的管理结构中,将这五个字节代码重新写回原地址处,可使热补丁回滚到原来状态,从而实现了热补丁卸载。
加入我们
LibcarePlus 当前已经在 openEuler 社区开源。后续我们将开展一系列技术分享,让大家更加详细地了解 LibcarePlus。如果您对热补丁技术感兴趣,欢迎您的围观。您也可以扫描文末小助手二维码,回复 LibcarePlus 加入 SIG 交流群。
项目地址:https://gitee.com/openeuler/libcareplus
项目交流:https://gitee.com/openeuler/libcareplus/issues
本文分享自微信公众号 - openEuler(openEulercommunity)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
openEuler 资源利用率提升之道 01:概论
问题背景 据 Canalys 发布的一份报告显示[1],全球云基础设施服务支出在 2022 年第一季度同比增长 34%,达到 559 亿美元。然而,多个研究表明,当前全球数据中心用户集群的平均 CPU 利用率低于 20%,存在巨大的资源浪费。因此,提升数据中心资源利用率是当前急需解决的一个重要问题[2]。 问题成因 资源利用率低下的主要原因是任务和资源调配失衡,这种失衡又有多种表现形式,例如: 调度系统和集群独立:不同的作业采用不同的调度系统,作业不能在更加广泛的集群中流动,其他集群的空闲资源不能有效利用。 任务类型缺乏多样性:集群中的作业同质化严重,作业集中使用一部分资源,导致这部分资源利用率较高,但是其余资源空闲。 缺乏优先级分级管理:要么是缺乏低优先级作业填补空闲资源,要么是有低优先级作业但是集群不具备分级管控能力,导致资源过度分配。 集群中资源类型单一:集群内部资源整体规格单一,不能根据总体业务对各类资源的动态需求进行弹性伸缩,导致部分资源配置过高。 总体而言,是集群内部任务和资源的多样性不足,调度对多样性任务和资源的管理能力薄弱导致。 解决思路 将不同类型的作业混合部署,分别...
- 下一篇
ThreadLocal源码解析及实战应用
作者:京东物流 闫鹏勃 1 什么是ThreadLocal? ThreadLocal是一个关于创建线程局部变量的类。 通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程则无法访问和修改。ThreadLocal在设计之初就是为解决并发问题而提供一种方案,每个线程维护一份自己的数据,达到线程隔离的效果。 2 有什么作用? 2.1 set once,get everywhere 在现在的系统设计中,前后端分离已基本成为常态,分离之后如何获取用户信息就成了一件麻烦事,通常在用户登录后, 用户信息会保存在Session或者Token中。这个时候,我们如果使用常规的手段去获取用户信息会很费劲,拿Session来说,我们要在接口参数中加上HttpServletRequest对象,然后调用 getSession方法,且每一个需要用户信息的接口都要加上这个参数,才能获取Session,这样实现就很麻烦了。 在实际的系统设计中,我们肯定不会采用上面所说的这种方式,而是使用ThreadLocal,我们会选择在拦截器的业务中, 获取到保...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Hadoop3单机部署,实现最简伪集群
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8编译安装MySQL8.0.19