背景
某个项目的预演环境总是过一段时间就宕机,所有服务都响应超时。经过排查发现是kafka停止运行导致网关卡死,从而所有请求都无法被处理。然后谷歌查了一下发现,这是因为kafka运行在windows平台的一个漏洞,因为未能正常关闭打开的日志文件导致的。网上也有关于这个漏洞的报告以及解决漏洞的合入记录。修改方法也很简单,先下载当前使用的kafka版本源码,根据合入记录把源码修改一下,然后重新打包放到服务器上面,替换掉之前的包再运行即可。但有个问题,我这么操作合规么?
第三方开源软件
项目中肯定会使用很多开源软件,大多情况下都是使用maven进行依赖管理,也有些情况会直接把开源软件的源码复制到项目中,和项目一起编译。少部分情况下会将开源软件源码下载下来,然后编译成包,然后再和项目一起运行。
识别漏洞是否有影响
如果某个时间,官方发布了一个CVE漏洞,那如何确定此漏洞是否会对项目产生影响?针对上述三种情况,识别出风险的难易程度是不同的。
首先是对于使用maven管理jar包的情况,可以非常简单的知道当前使用的版本,再和漏洞影响版本做对比即可确定是否对当前系统有影响。如果是把源代码直接放在项目中的这种使用情况,这就非常棘手了。因为不太容易确定使用的开源软件版本,甚至如果当时的开发走了,都无法确定系统中使用了哪些开源软件,哪些代码是自研的,哪些是第三方的代码。
侵入式修改和整包引用
对于直接把第三方源码下载下来在自研代码中使用的行为,一般定义为侵入式修改。而与之对应的,把开源代码包下载下来(或源码编译成包),不做修改,通过接口调用方式来使用的行为,一般定义为整包引用。一般来说,更推荐整包引用的方式来使用第三方项目。
整包引用有如下优点:
1.可以非常明确地知道当前系统中使用了哪些第三方代码,方便判断系统中是否存在第三方漏洞;
2.如果需要修改第三方代码,可以使用补丁方式进行修改,能较好地进行第三方代码以及补丁的维护工作;如果需要升级第三方代码,只需要把自研补丁进行适配即可,而侵入式修改可就难升级了。
3.可以更清晰地知道哪些代码因为使用了第三方代码需要被动开源,减少法务风险。
当然整包引用的缺点就是开发成本高,本来可以复制粘贴解决的问题,现在需要将整个代码包引入。并且,如果需要对第三方代码进行修改,还要使用补丁方式,很大程度上降低了代码可读性。
第三方代码侵入式修改清理
如果不是整包引用的方式使用第三方代码,就会存在我上面说到的很多问题,特别是漏洞识别和法务风险。业界有很多工具可以进行代码扫描,从而检测系统中是否有对第三方代码的片段引用,如fossid和fossbot。一般扫描完成后,我们需要将确定是使用了第三方代码的代码段进行清理,改为整包引用第三方代码包的方式来使用。如果引用的代码段较少,直接将引用的代码重新写一份,替换掉原来的第三方代码也可以。
结尾
幸运的是,我使用的kafka框架发布了一个修改了我这次遇到的这个bug的一个版本,我可以直接用这个版本的包,编译之后就可以使用了。但是我可以这样做是因为公司没有限制使用此软件的版本,正常来说,公司会对所有用到的第三方软件版本进行限制。如果限制了使用版本,那么我则需要把kafka的源码下载下来,然后使用补丁将此漏洞自行修复,然后再编译成包在系统中使用。