11 | 插件漏洞:我的代码看起来很安全,为什么还会出现漏洞?
了解插件
你所使用的所有插件的版本是什么?(包括前端和后端,直接引用和间接引用)
你所使用的这些插件,是否存在漏洞,是否不被维护了,是否被废弃了?
你所使用的这些插件,会在哪些地方发布更新信息和漏洞信息?
你所使用的这些插件,是否会定期更新?
你是否会对更新插件进行完整的测试?
你所使用的这些插件,在安全方面,有哪些配置需要关注?
为什么要重视插件漏洞?
0day漏洞,即在插件发布修复漏洞的安全补丁之前,黑客就已经知道漏洞,也就是只有黑客知晓的未公开漏洞
例如脏牛漏洞
心脏滴血漏洞。加解密插件OpenSSL中的漏洞,OpenSSL曾为所有HTTPS网站提供数据加密保护。
总之,对于应用来说,不止代码本身会产生漏洞,除了代码之外的一切都有可能出现漏洞。
如何建立插件漏洞的防护体系?
整理插件,剔除无用插件
如果使用 Maven 作为插件管理工具的话,你一定会先通过 POM 文件去找到自己所使用的插件(即所有的 Dependency)。但是,Dependency 只是你的应用中直接使用的插件,这些插件本身也会引用很多其他插件。所以大部分应用的插件依赖树十分复杂,那你该如何整理全部的插件呢? 首先,你可以通过Maven Dependency Plugin帮助自己自动分析插件依赖树。除了展示出当前 Maven 工程中所有的使用插件,Maven Dependency Plugin 还会对插件的使用情况做进一步的分析,帮你找出在 POM 中却没在代码中使用的插件。这样,你就可以对这一类无用的插件引用及时剔除,自然也就能够减少插件漏洞出现的可能性。
管理插件补丁更新
一旦某个插件出现漏洞,通常插件的运维方都会尽快推出补丁。有的公司还会设立专门的部门和人员进行补丁管理的工作。一旦出现漏洞和补丁,公司会先评估漏洞的严重性,然后设定打补丁的优先级,推动研发人员进行更新操作。 所以,建立插件防护体系的第二步,就是要知道你有哪些插件需要更新。但是,在实际工作中一个应用随便就依赖几十个插件,你当然没办法一个一个去查询插件的更新状态了。那Version Maven Plugin就是用来帮你检查版本更新的一个工具。你可以看到,在下面的分析结果中,通过mvn version:display-dependency-updates这个命令,我们就能发现 JUnit 有一个新的 4.11 版本。
那使用了补丁管理工具之后,我们就可以完全放心了吗?当然不是。补丁管理中依旧存在一些问题,我这里从 3 个方面帮你梳理了一下,你可以作为了解。
补丁可用性:并不是所有的插件漏洞,都能有最新的补丁进行及时的更新和维护。很多时候,运维人员会面临一个已知的漏洞,但无补丁“可打”的窘迫局面。
覆盖面不全:实际上,并不是所有语言都能够很好地进行插件分析工作,这也就导致运维人员无法掌控公司内所使用的所有插件。这个时候,必然会产生一定的漏洞疏忽。
更新时间延迟:为了提高打补丁的效率,补丁管理一般会按月或者按季度进行集中的打补丁工作。而在这个期间,公司的应用就会处于无保护的状态。
为了解决这些问题,虚拟补丁的概念就被提出了。所谓虚拟补丁,就是在不对应用插件进行升级的情况下,有效阻止攻击流量。实现的原理也很简单,即在前置的网络或系统中,对针对插件漏洞的攻击流量进行检测和拦截即可,大部分防火墙、IPS 等安全防御工具,都会提供虚拟补丁的功能。比如,2017 年,永恒之蓝肆虐的时候,防火墙会直接封禁 445 端口请求,就相当于给所有的 Windows 系统,打上了虚拟补丁。然后,只需要等到所有 Windows 都真正更新补丁之后,再放开对 445 端口的限制即可。
使用公开漏洞库
每当漏洞库中新曝出一个漏洞时,你需要分析这个漏洞所涉及的插件:是否在公司中有被使用;公司中使用的,是否是受影响的版本;这个漏洞会产生哪些危害等等。这样,你才能够尽快地修复各类已知的插件漏洞,降低应用被黑客攻击的可能。
那实际工作中,我们其实也可以借助工具,自动化地完成匹配公开漏洞库的工作。OWASP Dependency-Check是一款专门进行插件漏洞检测的工具。它会将工程内的插件和公开的漏洞库进行比对。最终,会生成一个网页形式的报告,使你对工程中的插件漏洞一目了然了。下图就展示了,如何通过 OWASP Dependency-Check 发现一个 3.2.1 版本的 Commons-Collections 的高危漏洞。
同理,在其他语言中,也会存在类似的插件管理工具。比如对于 JavaScript 中的插件,我们可以使用Retire.js进行整理。
总结
我们在建立插件漏洞的防护体系时,会使用这些自动化管理工具完成这样三件事情:
统计你的应用中引用了哪些插件
管理这些插件中是否有版本更新
检测这些插件是否存在已知的漏洞
提高版本更新的效率、避免插件漏洞,主要可以分三个步骤:首先我们可以使用插件分析工具,来了解应用中包括了哪些插件;然后,可以通过补丁管理制度和虚拟补丁,来推进对插件漏洞的管理和修复工作;最后,我们可以对比公开漏洞库(比如 CVE 等)中的最新漏洞,及时修复漏洞,降低被黑客攻击的可能。