linux 热补丁机制基本概念

linux 热补丁技术叫 livepatch 机制,可以在不重启内核的情况下应用补丁到内核中,常用于服务器环境,比如服务器处于生产环境不能随意重启,而为了应对某些临时发现漏洞修补,则可以通过该机制进行动态修复。

  • 依赖于 kprobe 和 ftrace 机制来实现 patch 注入。
  • 需要一致性模型

一致性模型:
一般 patch 修复不会改变一个函数的语义,只是为了添加一个 null 指针或者边界检查,添加一些内存屏障,或者给临界区加锁。还有一些复杂的 patch 会修改锁的顺序,修改变量,更新函数功能。所以需要一个一致性模型来解决这些问题。

kpatch 有下面的方式跟踪注入 patch 是安全的:

  • 第一种最有效方式:对睡眠任务进行堆栈检查,如果任务的堆栈上没有需要修改的函数,那么则是可以进行安全修复。大多数情况下,会在这时完成修补,否则周期性尝试检查并修补。这个能力需要 arch 提供 HAVE_RELIABLE_STACKTRACE 可靠栈支持。(目前仅 powerpc 和 x86 提供了该支持)
  • 第二种是内核从系统调用,用户空间 irq 和 信号返回到用户空间时,任务被切换,此时在以下两种情况有效:(1)修补是在受影响的函数上休眠的 i/o 绑定任务,这种可以通过 SIGSTOP 和 SIGCNT 信号强制退出后来进行补丁修补(2)修补是 cpu 绑定任务。如果任务是高度 cpu 绑定的,那么它将在下一次被 irq 中断时得以修补。
  • “swapper“ 任务,在进入 idle 前调用 klp_update_patch_state() ,此时可以进行修补。

如果 arch 没有 HAVE_RELIABLE_STACKTRACE 支持,则只能使用第二种修补方式。但无论怎样不支持 HAVE_RELIABLE_STACKTRACE 都会被认为是不完全受支持的 livepatch。

实现原理简述:

在 ftrace 原理详细分析这篇文章中 中知道:每个 tracer 实现 struct ftrace_ops 来在指定的 hook 点调用回调函数。livepatch 利用了这个 ftrace_ops,在 hook 点调用回调并调用相对应 patch 中的函数,并修改返回地址,实现一个函数的修补功能。

该过程可以分为load,enable,replace,disable,removing 五个步骤,其中 load 负责加载补丁,enable 负责注册 ftrace 等操作,replace 在合适时机调用 stop_machine 替换函数。

可以看到 livepatch 的修补单位是函数,其中对 patch 具有许多限制:

  • 只有可以被 trace 的函数才能被修补
    livepatch 需要动态 ftrace 支持,相对应的 notrace 的函数不能被修补,否则可能导致代码陷入无限循环。
  • 需要动态 ftrace 位于函数的最开始,也就是架构支持 -mfentry 编译选项(可以看 ftrace 原理详细分析 中的介绍),目前 x86 支持,arm64 不支持。
  • kretporbe 和 livepatch 是冲突的,因为他们实现都是基于在 hook 点修改返回值实现的,具体还是可以看 kprobe 原理详细分析 中对 kprobe 原理分析。

限制:
一些编写 patch 上的限制:
(1)补丁之间的交互
补丁之间可能存在潜在交互,所以建议补丁是以累计升级模式制作,即第二个补丁基于第一个补丁制作,并且第二个补丁是第一个补丁的累积升级。
(2)数据结构的修改
kpatch 修补的单位是函数,而不是数据结构,如果补丁对数据结构进行了修改,那一般会出问题,需要重新制作补丁,默认不允许修改数据结构,如果这样做了,kpatch-build 可能会抛出错误。
如果实在需要对数据结构中变量修改,可以使用 livepatch 提供的影子变量机制来分配一个变量使用。
(3)不能修补 __init 的函数
它们只会被调用一次,且可能涉及硬件初始化条件。
(4)头文件修改
头文件修改可能导致大范围数据产生变化,破坏数据结构。
(5)小心意外更改的函数
如内联函数,新补丁中的函数可能被编译器内联。
(6)静态局部变量
静态局部变量是全局变量,patch 中无法默认对其修改。
(7)移除代码
patch 中不要移除老的修复代码,只能新增代码,被移除的代码在 kpatch-build 作用下会被保留。
(8)禁止对 once 相关宏使用
类似的 pintk_once。。。等等会将变量存储在 __data_once 中,这是静态的,我们不能再去修改。

还有其他一些限制:可以参考 https://github.com/dynup/kpatch/blob/master/doc/patch-author-guide.md 。

总结下来 livepatch 机制的限制很多,对应架构支持也不相同(至少 arm64 支持目前很差,只支持最基本 livepatch 功能,上游目前有对 arm64 进行支持开发。。。),不过 kpatch 项目中可以检测架构是否支持 livepatch,如果不支持,kpatch 会在自己项目中的 kpatch/core 路径中单独编译出一个 kpatch.ko(而不是用内核自己 build 的kpatch.ko)来为架构提供热补丁支持。内核实现 livepatch 对架构,编译器等均有一些要求,比如编译器为架构提供可靠栈回溯,支持动态 ftrace regs 等,否则对应架构很难实现 livepatch,目前有 x86,powerpc,s390 能在内核直接支持 livepatch。而排除可靠栈回溯的特性也能去实现 livepatch,不过会得到更多的限制,包括对需要制作的 patch 也提出许多限制。目前 kpatch 项目中外部实现的 livepatch 也还没有对 arm64 提供支持(arm64相关支持开发在这儿:Arm64 support, including @surajjs95 & @t-msn changes #1302)。
不过上述 pull request 提到的 patch 并未被 merge 到主线,一直处于解决一些 bug 的阶段,直到现在该 pull request 也是 open 状态,其中 kpatch 的对应 arm64 分支:GitHub - swine/kpatch at arm64。

简单示例:替换 /proc/version 版本字符串
拉取最新的 GitHub - dynup/kpatch: kpatch - live kernel patching,并在 x86 环境演示,执行命令如下:

make BUILDMOD=yes
make BUILDMOD=yes installCACHEDIR=/home/xxxxx/build_dir kpatch-build -r kernel-4.18.0.el8.src.rpm  -t vmlinux kpatch/examples/proc-version.patch  -R[root@localhost xx]# kpatch load livepatch-proc-version.ko 
loading patch module: livepatch-proc-version.ko
waiting (up to 15 seconds) for patch transition to complete...
transition complete (2 seconds)
[root@localhost xx]# cat /proc/version 
kpatch Linux version 4.18.0.el8.x86_64 (mockbuild@kojid_x86_bj) (gcc version 8.4.1 20200928 (Red Hat 8.4.1-1) (GCC)) #1 SMP Mon Jul 17 00:45:01 EDT 2023
[root@localhost xx]# kpatch unload livepatch-proc-version.ko 
disabling patch module: livepatch_proc_version
waiting (up to 15 seconds) for patch transition to complete...
transition complete (2 seconds)
unloading patch module: livepatch_proc_version
[root@localhost xx]# cat /proc/version 
Linux version 4.18.0.el8.x86_64 (mockbuild@kojid_x86_bj) (gcc version 8.4.1 20200928 (Red Hat 8.4.1-1) (GCC)) #1 SMP Mon Jul 17 00:45:01 EDT 2023
[root@localhost xx]# 

示例中的kpatch/examples/proc-version.patch如下:

From 64aff1ab8f9a9f5df06c998be73d4981b77e480d Mon Sep 17 00:00:00 2001
From: Joe Lawrence <joe.lawrence@redhat.com>
Date: Mon, 7 Nov 2022 08:21:58 -0500
Subject: [PATCH] kpatch: modify /proc/version output
Content-type: text/plainThis is a simple kpatch example that modifies version_proc_show() so
that the output of /proc/version will be prefixed by "kpatch ".Signed-off-by: Joe Lawrence <joe.lawrence@redhat.com>
---fs/proc/version.c | 1 +1 file changed, 1 insertion(+)diff --git a/fs/proc/version.c b/fs/proc/version.c
index 02e3c3cd4a9a..957faeea8f5c 100644
--- a/fs/proc/version.c
+++ b/fs/proc/version.c
@@ -9,6 +9,7 @@static int version_proc_show(struct seq_file *m, void *v){
+	seq_printf(m, "kpatch ");seq_printf(m, linux_proc_banner,utsname()->sysname,utsname()->release,
-- 
2.26.3

主要是修改了Linux version 中Linux version 4.18.0.el8.x86_64Linux字段,修改成了kpatch字符串,从打印中可以看到补丁应用成功,卸载补丁后恢复原来的字符串。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/594916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】一些数组面试题以及顺序表的思考

简单不先于复杂&#xff0c;而是在复杂之后。 文章目录 1. 数组相关面试题2. 顺序表的问题及思考 1. 数组相关面试题 1.原地移除数组中所有的元素val&#xff0c;要求时间复杂度为O(N)&#xff0c;空间复杂度为O(1)。 int removeElement(int* nums, int numsSize, int val) {i…

网络安全—部署CA证书服务器

文章目录 网络拓扑安装步骤安装证书系统安装从属证书服务器 申请与颁发申请证书CA颁发证书 使用windows Server 2003环境 网络拓扑 两台服务器在同一网段即可&#xff0c;即能够互相ping通。 安装步骤 安装证书系统 首先我们对计算机名进行确认&#xff0c;安装了证书系统后我…

59.网游逆向分析与插件开发-游戏增加自动化助手接口-文字资源读取类的C++还原

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;游戏菜单文字资源读取的逆向分析-CSDN博客 之前的内容&#xff1a;接管游戏的自动药水设定功能-CSDN博客 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fing…

Redis缓存击穿、缓存雪崩、缓存穿透

缓存击穿&#xff08;某个热点key缓存失效&#xff09; 概念 缓存中没有但数据库中有的数据&#xff0c;假如是热点数据&#xff0c;那key在缓存过期的一刻&#xff0c;同时有大量的请求&#xff0c;这些请求都会击穿到DB&#xff0c;造成瞬时DB请求量大、压力增大和缓存雪崩的…

定性数据的介绍与讨论

关于数据的分类 数据可以根据不同的属性和特征进行分类。以下是数据常见的分类方式&#xff1a; 1. 数值型数据&#xff1a;表示为具体的数值&#xff0c;可以进行数学运算和统计分析。例如年龄、身高、体重等。 2. 分类型数据&#xff1a;表示为不同的类别或标签&#xff0…

c++语言基础18-开房门

题目描述 假设你手里有一串钥匙&#xff0c;这串钥匙上每把钥匙都有一个编号&#xff0c;对应着一个房门的编号。现给你一个房门编号&#xff0c;你需要判断是否能够打开该房门。 输入描述 测试数据共有多组。 第一行为一个整数 s&#xff0c;表示共有多少组测试数据。 每组第一…

Windows 10系统用Xlight FTP搭建SFTP服务器

步骤&#xff1a; 1.安装SFTP服务器 刚开始我使用的是freeSSHd&#xff0c;后面发现由于公司网络原因&#xff0c;打不开这个软件&#xff0c;改成了使用Xlight FTP&#xff0c; 官网下载链接&#xff1a;Xlight FTP 服务器 - 下载免费的windows FTP 服务器 Xlight FTP有30…

tp8/6 插件PhpOffice\PhpSpreadsheet导入表格

一、安装 composer require phpoffice/phpspreadsheet 官网&#xff1a;phpoffice/phpspreadsheet - Packagist 二、代码 <?php namespace app\services\upload\model; use app\services\BaseServices; use \PhpOffice\PhpSpreadsheet\Spreadsheet; use \PhpOffice\Php…

Keras内置数据集

目录 1、MNIST数字分类数据集 2、CIFAR10小图像分类数据集 3、CIFAR100小图像分类数据集 4、IMDB电影评论情感分类数据集 参数说明 imdb_word_index.json 示例 5、路透社新闻专线分类数据集 reuters_word_index.json 6、Fashion MNIST数据集 7、加州房价回归数据集 …

React16源码: createRef与forwardRef源码实现

ref 概述 拿一个场景举例开始 比如&#xff0c;在react当中写一个组件&#xff0c;类型是 class Component在 render function 里面渲染一系列的子组件或者 dom节点会有这样的需求&#xff0c;就是获取某个dom节点或某个子组件的实例来做一些手动的操作不局限于 props 更新这种…

JVM:字节码

JVM&#xff1a;字节码 前言1. JVM概述 前言 1. JVM概述 1. JVM vs JDK vs JRE JVM Java 虚拟机&#xff08;JVM&#xff09;是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现&#xff08;Windows&#xff0c;Linux&#xff0c;macOS&#xff09;&#xff0c;目的是…

实现文本 内容展开 / 收起

<template><el-table :data"tableData" style"width: 100%" height"250"><el-table-columnfixedprop"date"label"日期"width"150"></el-table-column><el-table-columnprop"name…

正向代理和反向代理的区别

我们作为用户是操作客户端的&#xff0c;所以对于客户端的代理就是正向的。牢记&#xff0c;我们是正向的&#xff0c;我们是正向的&#xff0c;我们是正向的。 正向代理和反向代理都是网络中常见的代理服务类型&#xff0c;它们在网络通信中的角色和功能有所不同。 正向代理&…

阿里云PolarDB数据库不同配置租用价格表

阿里云数据库PolarDB租用价格表&#xff0c;云数据库PolarDB MySQL版2核4GB&#xff08;通用&#xff09;、2个节点、60 GB存储空间55元5天&#xff0c;云数据库 PolarDB 分布式版标准版2核16G&#xff08;通用&#xff09;57.6元3天&#xff0c;阿里云百科aliyunbaike.com分享…

【数据湖架构】数据湖101:概述

数据湖是非结构化和结构化数据池&#xff0c;按原样存储&#xff0c;没有特定的目的&#xff0c;可以建立在多种技术上&#xff0c;如Hadoop&#xff0c;NoSQL&#xff0c;Amazon Simple Storage Service&#xff0c;关系数据库或各种组合根据一份名为“什么是数据湖”的白皮书…

微软截图工具SnippingTool_6.1.7601免费版

SnippingTool是一款win7系统自带的一款非常实用型截图工具&#xff0c;操作简单&#xff0c;点击“新建"可一键截图&#xff0c;截图之后会弹出编辑器&#xff0c;可以进行一些简单的勾画编辑操作&#xff0c;您可以使用笔、荧光笔、电子邮件或保存等选项。如果您的系统丢…

界面控件DevExpress Blazor Grid v23.2 - 支持全新的单元格编辑模式

DevExpress Blazor UI组件使用了C#为Blazor Server和Blazor WebAssembly创建高影响力的用户体验&#xff0c;这个UI自建库提供了一套全面的原生Blazor UI组件&#xff08;包括Pivot Grid、调度程序、图表、数据编辑器和报表等&#xff09;。 在这篇文章中&#xff0c;我们将介…

Android 13 - Media框架(30)- MediaCodec(五)

前一节我们了解了input buffer写入的流程&#xff0c;知道了起播写前几笔数据时会先获取graphic buffer&#xff0c;这一节我们就一起来了解下dequeueBufferFromNativeWindow是如何工作的。 1、dequeueBufferFromNativeWindow ACodec::BufferInfo *ACodec::dequeueBufferFromN…

基于Matlab的车道线检测技术研究与实现

一、摘要 车道线检测是自动驾驶和智能交通系统的重要组成部分&#xff0c;它对于车辆的导航和控制具有重要的作用。本文主要研究了基于Matlab的车道线检测技术&#xff0c;包括图像预处理、边缘检测、霍夫变换等步骤&#xff0c;并实现了一个车道线检测系统。实验结果表明&…

死锁的处理策略“预防死锁”-第三十七天

目录 前言 破坏互斥条件 破坏不剥夺条件 破坏请求和保持条件 静态分配法 破坏循环等待条件 顺序资源分配法 本节思维导图 前言 死锁的产生必须满足四个必要条件&#xff0c;只要其中一个或几个条件不满足&#xff0c;死锁就不会发生 破坏互斥条件 互斥条件&#xff1a;…