【openEuler开源社区】如何为社区修复CVE漏洞

前言CVE 的英文全称是“Common Vulnerabilities & Exposures”通用漏洞披露。CVE就好像是一个字典表,为广泛认同的信息安全漏洞或者已经暴露出来的弱点给出一个公共的名称。(来源:百度百科)

        在openEuler开源社区,这些CVE漏洞也会公开出来,以issue的形式发布到对应的仓库,作为开源开发者,如何修复这些CVE漏洞呢?下面让我们一起来看。

1.找到社区发布的CVE漏洞

        打开社区issue列表,选择标签CVE/UNFIXED,可以看到社区所有已发布的CVE漏洞。
任务 - src-openEuler - openEuler - Gitee.comhttps://gitee.com/organizations/src-openeuler/issues        如下图所示,这些CVE漏洞由openBrain开源漏洞感知系统自动发现并发布到对应的组件仓库,并且标注了风险等级,如主要、次要等。当然除了CVE/UNFIXED标签,大家可能注意到还有其他和CVE有关的标签,那些均为已完成或处于挂起状态的issue,会有对应的maintainer跟踪处理。

 2.选择一个CVE漏洞并查看它的issue信息

        我们选择一个待处理的CVE漏洞,来看一下他的issue详细信息,这里以我之前修复过的docker为例带大家一起看一下。

CVE-2022-24769 · Issue #I59QKW · src-openEuler/docker - Gitee.comhttps://gitee.com/src-openeuler/docker/issues/I59QKW

         在这个界面,首先我们可以看到漏洞的一些简要信息,如编号、归属的组件与版本、简述等。

         再接着往下看,可以看到漏洞详情参考链接,如下:

https://nvd.nist.gov/vuln/detail/CVE-2022-24769https://gitee.com/link?target=https%3A%2F%2Fnvd.nist.gov%2Fvuln%2Fdetail%2FCVE-2022-24769        这也是我们常用的参考网址,比较权威,在这里我们可以看到漏洞的详细信息,以及一些上游社区的修复详情,有很多链接后面标注了Patch标签,通过点击对应链接,可以找到修复该CVE漏洞的patch。

        不同的CVE漏洞,这里对应的链接也不一样,我所展示的CVE在这里直接给出了github的链接,但是有的CVE漏洞可能在这里只会展示一些上游社区的讨论,比如bugzilla等,需要我们通过看他们的一些评论,去找到对应的commit链接。比如下面这个,仅通过这个页面看不到有价值信息。

         看完这些上游社区的讨论/修复,你可能已经找到了你需要的patch,也可能你点进了一个又一个链接还没有找到合适/正确的patch,不要急,我们接着往下看完issue详情。

        如下图所示,也是issue结尾的部分,需要我们去评估一下对openEuler社区组件的影响并作以说明,openEuler评分是自动给出的,我们只需要复制这些内容,填写影响性分析说明、受影响版本排查、是否涉及abi变化即可。

         到这里,issue就结束了,我们剩下要做的工作就是把patch合入到仓库中,不过要注意,是所有受影响的版本分支都要合并哦,同时在提交的PR中关联该issue,等到所有的PR被社区合入,该issue才会自动关闭,也就意味着该CVE漏洞已修复完成。

        等等,如果我前面没有找到patch该怎么办呢?别急,在评论区回复/find-patch,会为你自动找到所需要的patch,不过这里给出的链接仅供参考,我建议大家最好还是亲自去找一下并验证修复的准确与权威性,确保修复工作万无一失。

3.生成patch文件

         经过前面一系列的分析,相信大家已经找到了正确的修复链接,但是我们最终需要的并不是这样的链接,而是一个.patch文件,直接复制显然是不对的,那么如何生成我们需要的patch文件呢,下面让我们一起来看。

        在gitlab等一些源代码托管网站,在修复该CVE漏洞的commit链接中,往往会有email patch这样的按钮,通过这个选项,可以直接把本次commit生成为一个patch后缀的文件,这种是比较方便的。

        在github中,我们会发现没有email patch这个选项,这时我们只需要在浏览器上方的链接最后添加.patch即可将本次commit转换为patch 的格式。

        可以看到页面已经显示了patch的详细内容,在这里我们不要全选复制,然后再粘贴出去,这样可能会因为空格等问题产生许多不可预期的错误。我们右键另存到文件,即可将patch保存到本地。

        除了上述这种直接的方法,当然你也可以将代码clone到本地手动生成patch,不过在大多数情况下我们不会这么做,除非。。。(我们后面会介绍)

4.正式开始修复CVE漏洞

        拿到我们所需要的patch文件,就可以着手修复该CVE漏洞了,说白了,也就是把patch打进去。下面是一般软件包的修复流程。

1. 将对应的仓库fork一份到自己名下,然后把自己名下的仓库clone到本地。

2. 将patch文件添加到仓库中,同时修改对应的spec文件

        2.1 在spec文件开头增加你的Patch并按顺序排列

         

         2.2 找到%prep阶段,在这里会解压源码包并将所有patch合入。如果在该阶段是%autosetup                 字段,那么你不用做任何修改,autosetup会接管所有的操作;如果是%setup字段解压                   的源码包,那么你需要增加%patch字段单独打一下你的patch了。

3. 新增一条release并仔细填写changelog。

4. 本地编译验证,确保编译成功,功能验证完整后,提交PR关联该issue,同时注意,所有受影响的分支都需要完成这一步骤。

5. 所有PR被合入后,这个CVE漏洞修复也就正式完成了。

5.手动制作patch

        实际操作中我们会发现,并不是所有打patch的动作都一帆风顺,有时候因为openEuler社区组件版本与上游修复的版本差异比较大,导致你所选择的那一次commit生成的patch,不能正确的对应社区版本。比如某组件patch修复的是3.0版本的某文件第10行,而社区中为2.0版本,对应的修复位置在第5行,等等诸如此类的情况,都会导致打patch失败,这时就需要我们手动制作patch了。

        通常来说制作patch的方法有两种,diff和git,diff的方法比较简单,适合一些简单的patch。但是这里更推荐大家使用git的方式制作patch,我认为这样的patch会更规范。

1.进入rpmbuild/SOURCE目录(需安装rpmdev-tools相关组件),将仓库中的所有文件拷贝至此。

2.运行以下指令,即进行软件包编译,但是只运行%prep阶段,将所有tar包解压,并把已存在的patch进行合入。

rpmbuild -bp *.spec --nodeps

3.进入rpmbuild/BUILD目录,然后进入对应软件包的文件夹中,依次执行以下指令,在你的本地生成一个git仓库。

git init ./
git add .
git commit -m "init"

这样,你就成功的把当前源码生成了一次git提交。

4.按照上游patch修复信息,手动修改对应文件。

5.修改完成后,执行以下指令,将你的修改生成一次commit提交。

git add .
git commit -m "CVE-2022-1234"

6.将你最新的一次提交生成patch文件

git format-patch -s -1

这时你会发现,你制作的patch已经生成了,与diff不同,在patch会有邮箱、作者、时间等信息。

7.拿着你自己制作的patch,重复前面步骤,去修复CVE漏洞吧~


为openEuler开源社区修复CVE漏洞的教程到这里就结束了,主要应用于社区的src-openeuler仓库,源码仓中如kernel等项目,提交patch方式与此有很大差距,不在这里讨论。

大家有什么问题,欢迎在评论区留言~

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值