• 开源软件存在漏洞导致系统崩溃


    背景

    某个项目的预演环境总是过一段时间就宕机,所有服务都响应超时。经过排查发现是kafka停止运行导致网关卡死,从而所有请求都无法被处理。然后谷歌查了一下发现,这是因为kafka运行在windows平台的一个漏洞,因为未能正常关闭打开的日志文件导致的。网上也有关于这个漏洞的报告以及解决漏洞的合入记录。修改方法也很简单,先下载当前使用的kafka版本源码,根据合入记录把源码修改一下,然后重新打包放到服务器上面,替换掉之前的包再运行即可。但有个问题,我这么操作合规么?

    第三方开源软件

    项目中肯定会使用很多开源软件,大多情况下都是使用maven进行依赖管理,也有些情况会直接把开源软件的源码复制到项目中,和项目一起编译。少部分情况下会将开源软件源码下载下来,然后编译成包,然后再和项目一起运行。

    识别漏洞是否有影响

    如果某个时间,官方发布了一个CVE漏洞,那如何确定此漏洞是否会对项目产生影响?针对上述三种情况,识别出风险的难易程度是不同的。

    首先是对于使用maven管理jar包的情况,可以非常简单的知道当前使用的版本,再和漏洞影响版本做对比即可确定是否对当前系统有影响。如果是把源代码直接放在项目中的这种使用情况,这就非常棘手了。因为不太容易确定使用的开源软件版本,甚至如果当时的开发走了,都无法确定系统中使用了哪些开源软件,哪些代码是自研的,哪些是第三方的代码。

    侵入式修改和整包引用

    对于直接把第三方源码下载下来在自研代码中使用的行为,一般定义为侵入式修改。而与之对应的,把开源代码包下载下来(或源码编译成包),不做修改,通过接口调用方式来使用的行为,一般定义为整包引用。一般来说,更推荐整包引用的方式来使用第三方项目。

    整包引用有如下优点:

    1.可以非常明确地知道当前系统中使用了哪些第三方代码,方便判断系统中是否存在第三方漏洞;

    2.如果需要修改第三方代码,可以使用补丁方式进行修改,能较好地进行第三方代码以及补丁的维护工作;如果需要升级第三方代码,只需要把自研补丁进行适配即可,而侵入式修改可就难升级了。

    3.可以更清晰地知道哪些代码因为使用了第三方代码需要被动开源,减少法务风险。

    当然整包引用的缺点就是开发成本高,本来可以复制粘贴解决的问题,现在需要将整个代码包引入。并且,如果需要对第三方代码进行修改,还要使用补丁方式,很大程度上降低了代码可读性。

    第三方代码侵入式修改清理

    如果不是整包引用的方式使用第三方代码,就会存在我上面说到的很多问题,特别是漏洞识别和法务风险。业界有很多工具可以进行代码扫描,从而检测系统中是否有对第三方代码的片段引用,如fossid和fossbot。一般扫描完成后,我们需要将确定是使用了第三方代码的代码段进行清理,改为整包引用第三方代码包的方式来使用。如果引用的代码段较少,直接将引用的代码重新写一份,替换掉原来的第三方代码也可以。

    结尾

    幸运的是,我使用的kafka框架发布了一个修改了我这次遇到的这个bug的一个版本,我可以直接用这个版本的包,编译之后就可以使用了。但是我可以这样做是因为公司没有限制使用此软件的版本,正常来说,公司会对所有用到的第三方软件版本进行限制。如果限制了使用版本,那么我则需要把kafka的源码下载下来,然后使用补丁将此漏洞自行修复,然后再编译成包在系统中使用。

  • 相关阅读:
    Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round)(A-C题解)
    最小生成树
    并查集
    字符串的匹配算法
    CTU Open Contest 2019 AB题
    Codeforces Round #624 (Div. 3)(题解)
    Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)
    Lyft Level 5 Challenge 2018
    终于在博客写完第一篇题解啦
    Codeforces Round #519 by Botan Investments(前五题题解)
  • 原文地址:https://www.cnblogs.com/etoumao/p/13449742.html
Copyright © 2020-2023  润新知