自去年以来,针对万千开发人员所用开源代码库的攻击呈指数级增长。
网络罪犯盯上开源软件包,试图通过软件供应链投放恶意代码。安全提供商Sonatype在2021年录得1.2万起网络安全事件,该公司的数据表明,这种所谓的软件供应链攻击今年增长了650%。正如本周Log4j漏洞所昭示的,企业必须审慎处理开源代码了。
软件供应链攻击是什么?
开源软件包通常存储在在线代码库中。波恩大学、Fraunhofer FKIE研究所和法国SAP实验室的研究人员称,由于某些代码包广泛存在于各种应用中,这些代码库几乎相当于一种“可靠的大范围恶意软件投放渠道”。
2021年针对开源软件的供应链攻击暴增650%
图1:年度软件供应链攻击总数
(来源:2021年Sonatype《软件供应链状况报告》)
Sonatype发布的《软件供应链状况》报告中指出,软件供应链攻击主要有三种形式。最常见的两种形式是依赖混淆和错字抢注,这两种形式都有赖于一个事实:依赖管理器等软件开发工具会在应用中自动下载并实现开源代码。
在依赖混淆攻击中,攻击者会创建有漏洞的程序包并标上更新的版本号,这样就可以让软件开发工具自动实现有缺陷的程序包了。这种形式是2021年最常见的软件供应链攻击类型。而在错字抢注攻击中,攻击者会给自己创建的程序包取一个跟流行程序包非常相近的名字(绝大多数时候只有一个字母与之不同),期望开发人员会敲错包名下错包。
恶意代码注入则是往开源软件包中添加新的代码,任何运行了该软件包的人都会中招。Sonatype表示,可能是由于开源代码库加强了自身安全防护,此类攻击今年有所下降。
波恩大学的研究发现,Node.js(npm)和Python(PyPi)代码库是供应链攻击的主要目标,原因可能是恶意代码在程序包安装期间很容易被触发。
开源软件安全状况
Sonatype的报告评估了常见开源软件包中的漏洞数量。报告发现,Maven Central Java程序包代码库中存在漏洞的组件数量最多,超过35万个组件含有关键漏洞,攻击者可以很轻易地利用这些漏洞获得root级别的权限。含漏洞组件的数量排第二位的是nmp JavaScript程序包代码库,其中有25万个组件带有关键漏洞。
常见开源代码库中检测出关键漏洞
图2:各开源代码库中存在漏洞的开源程序包组件总数
(蓝色代表至少存在一个已知漏洞的组件数量;红色代表存在关键漏洞的组件数量。)
Sonatype发现,带有漏洞的程序包在代码库所容纳的所有程序包中所占的比例并不大。比如说,Maven Central代码库中仅4.9%的程序包含有关键漏洞。而在PyPi代码库中,这一比例更是小到仅0.4%。
即便如此,这些程序包的下载频次意味着,其所含漏洞能够快速大范围散播。2021年,JavaScript开发人员的开源程序包下载数量为1.5万亿次,Python程序包的下载数量则是1270亿次。
2021年JavaScript开发人员开源程序包下载数量达1.5万亿次
图3:各编程语言的开源程序包下载数量(单位:10亿次)
Sonatype执行副总裁Matt Howard表示:“今年的报告再次表明了开源的双刃剑属性,开源既是数字创新的重要推进力,同时也是软件供应链攻击的诱人目标。这一严峻的现实凸显出了重要的责任和机遇,即工程主管必须接受智能自动化,这样他们才能标准化最佳开源供应商,同时采用最佳版本帮助开发人员保持第三方库更新。”
波恩大学的研究人员所提交的报告指出,很多开源项目都引入了双因素身份验证机制,并且禁用了会自动安装额外程序包的脚本。他们写道,开源生态圈应当推广采用这些措施。“尽管利益相关者的安全意识普遍有所上升,但这些应对之策应当尽可能地进一步推开,并且默认强制实施,这样才能够防止开源软件供应链攻击。”
本月,Java应用开源日志工具Log4j中发现的关键漏洞再次引爆了围绕开源软件安全的讨论。专家称,Log4j由没有报酬的志愿者维护,广泛存在于大量应用中,实现这些应用的企业往往并不知道它的存在,导致企业可能需花费数月时间才能找到并修复所有存在漏洞的实例。