Ubuntu下漏洞的修复流程

最近需要修复cve漏洞,研究了如何在源码上修复漏洞,在这里记录一下。

目录

I. 介绍

漏洞和补丁

CVE漏洞

普通漏洞和CVE漏洞的区别

II. 获取补丁

III. 应用补丁

常见的打补丁工具

打补丁的步骤

patch的用法


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.c
1层src/camel/camel-stream-buffer.c
2层camel/camel-stream-buffer.c

忽略两层的话,就要找camel目录了。

camel目录在哪里呢?src目录下,所以我们进入src目录下,执行atch --verbose --dry-run --ignore-whitespace --fuzz 3 -p2 < patch,即可成功应用补丁!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值