最近需要修复cve漏洞,研究了如何在源码上修复漏洞,在这里记录一下。
I. 介绍
首先介绍一下相关的概念
漏洞和补丁
漏洞是计算机软件中存在的错误或者缺陷。
攻击者可以利用漏洞在未经授权的情况下访问和修改文件,以此破坏系统或收集敏感数据。
严重的漏洞可能导致数据泄露,系统崩溃或者系统被控制。
为了解决漏洞带来的问题,软件开发商会发布一个或多个“补丁”来修复漏洞。
一旦补丁安装成功,相应的漏洞将被消除,系统将变得更加安全和稳定。
CVE漏洞
CVE(Common Vulnerabilities and Exposures)漏洞是指由于软件或硬件产品中存在的安全漏洞所引发的安全问题。
漏洞编号格式为“CVE-年份-序号”,例如“CVE-2022-1234”,每个漏洞都会被分配一个唯一的CVE编号。
普通漏洞和CVE漏洞的区别
CVE漏洞和普通漏洞的区别在于是否有CVE编号。
CVE编号由MITRE公司负责分配,MITRE公司是一家非盈利性的研究机构。
MITRE公司根据一定的标准来选择哪些漏洞应该被分配CVE编号。这个标准主要包括漏洞的严重性、漏洞的公开情况、漏洞的重要性和影响范围等方面。一般来说,只有那些被认为有严重影响和公开的漏洞才会被分配CVE编号。
需要注意的是,CVE漏洞并不一定是最严重的漏洞。
II. 获取补丁
要获取补丁之前首先要确定改漏洞是否被修复(有些漏洞没有被修复),在以下网站查询。
Enterprise Open Source and Linux | Ubuntu
举个例子,假如我要在ubuntu2004上修复CVE-2020-14928,先在网站上查一下。
2004对应的名称是focal,对应的状态是Released。
说明这个问题在2004上已经修复了,修复的版本是3.36.3-0ubuntu1.1。
为了简单,你可以直接将软件升级到这个版本。
出于项目需要,要使用旧版本的软件,就需要把对应的补丁应用在旧版本上。
在对应漏洞的网页上会附上使用的patch的网址,像是修复这个漏洞的有两个patch。
我们进入gitlab,选择Plain Diff将改动(patch)下载下来,改个名字。
III. 应用补丁
常见的打补丁工具
patch
一般使用patch指令来打patch。(好像是废话)
patch指令是Linux系统中最基本的打补丁工具。
quilt
quilt是一个比patch更高级的打补丁工具,可以用来管理多个补丁,并对其进行排序、组合和卸载等操作。
这种方法没学明白,先不详细写
diff和patch组合
这是一种手动打补丁的方法,需要手动使用diff命令生成补丁文件,然后使用patch命令应用补丁。
打补丁的步骤
这里以patch指令为例,介绍打补丁的步骤。
将刚刚的两个diff文件改名,效果如下:
我们将项目的源码下载到本地,效果如下:
patch --verbose --dry-run --ignore-whitespace --fuzz 3 -p1 < patch的相对路径
用这条指令来打补丁,在解释为什么可以这样打补丁之前先插播一下patch的用法
patch的用法
patch的作用则是将diff记录的结果(即补丁)应用到相应文件(夹)上。最常见的用法为:
patch -pNUM <patchfile>
-p Num
忽略几层文件夹,随后详解。
-E
选项说明如果发现了空文件,那么就删除它
-R
取消打过的补丁。
-l or --ignore-whitespace
忽略修补数据与输入数据的跳格,空格字符
--verbose
详细显示指令的执行过程
--dry-run
尝试patch软件,并不真正改动软件
-F<行数> or -fuzz<行数>
非精确匹配的行数目
为了解释 -p 参数,需要看看如下patch文件片段:
--- old/modules/pcitable Mon Sep 27 11:03:56 1999
+++ new/modules/pcitable Tue Dec 19 20:05:41 2000
如果使用参数 -p0,那就表示从当前目录找一个叫做old的文件夹,再在它下面寻找 modules/pcitable 文件来执行patch操作。
而如果使用参数 -p1,那就表示忽略第一层目录(即不管old),从当前目录寻找 modules 的文件夹,再在它下面找pcitable。
理解了patch的用法再来看我们的指令。
打开diff文件,默认找a/src/camel/camel-stream-buffer.c文件(对应---那行的文件)
我们解压源码之后发现没有a目录,只有src目录(源码下载到本地效果图里有),所以p对应的num数为1。
所以切换到src上一级所在的目录,执行patch --verbose --dry-run --ignore-whitespace --fuzz 3 -p1 < patch的相对路径 即可。
当然,当前使用了--dry-run参数,如果patch成功应用,就可以把这个参数去掉了。
出现succeed即为成功。
为了深入理解patch的p参数,我们来换个目录试一下。
p参数代表忽略的目录层数,我们之前是忽略了一层,我们能不能忽略两层呢?
当然是可以的!
光看文字可能有点乱,我在这里加了个表格。
忽略层数对应目录0层a/src/camel/camel-stream-buffer.c1层src/camel/camel-stream-buffer.c2层camel/camel-stream-buffer.c
忽略两层的话,就要找camel目录了。
camel目录在哪里呢?src目录下,所以我们进入src目录下,执行atch --verbose --dry-run --ignore-whitespace --fuzz 3 -p2 < patch,即可成功应用补丁!
版权归原作者 银离子_kg 所有, 如有侵权,请联系我们删除。