开源软件是现代软件开发的基石。你可能不知道你开发的软件中有超过百分之八十的代码来自开源组件。这些开源的代码库被成千上万的开发人员使用和信任。但正因如此,如果一个热门的开源代码库被攻击者植入恶意代码,那么使用它的所有下游应用都会被感染,形成连锁反应。这种攻击被称为开源供应链投毒,是近年来增长很快的一种攻击方式。它的影响范围极广,一旦成功波及面往往以百万甚至千万计。

故事:2022年发生了一起影响广泛的软件供应链攻击事件。攻击者向一个很受欢迎的JavaScript开源库中植入了一段恶意代码,这段代码会在软件开发过程中收集环境变量中的密钥和凭证,并将它们发送到攻击者控制的服务器上。因为这个库每周的下载量高达数百万次,大量使用了这个库的Web应用和Node.js项目都受到了影响。攻击者通过这种方式收集到了数千个有效的云服务访问密钥和数据库凭证。这个事件被称为开源供应链投毒的代表性案例之一,让整个开源社区都开始重新审视对开源组件的信任问题。很多被攻击的公司直到几个月后才发现自己已经被渗透了。

泄密链路分析:攻击者首先研究热门的开源库,找出维护薄弱但用户量大的目标。然后通过社会工程攻击或直接攻破维护者的账号获得代码仓库的提交权限。在提交的代码中隐藏恶意代码,通常伪装成合法的功能更新或bug修复。恶意代码通过自动化的软件构建和分发流程被推送到所有使用该库的下游应用中。开发者在不知情的情况下将含有恶意代码的库集成到自己的产品中。恶意代码在开发或运行环境中执行窃密操作,收集的数据被回传到攻击者的服务器。攻击者可以持续收集数月甚至更长时间。

警示:使用开源代码是企业不可避免的选择,但不可盲目信任。企业应该建立开源组件的安全审查机制,对引入的第三方库进行安全审计。使用软件物料清单工具跟踪所有的开源依赖项,发现漏洞后能够及时响应。对于关键业务系统建议使用经过安全审核的镜像仓库,而不是直接从互联网拉取开源组件。在CI流水线中加入安全扫描步骤,自动检测引入的依赖项中是否包含已知的恶意代码。开源的精神值得尊重,但开源的代码不一定都是安全的。使用任何开源组件前都要问一句:我信任这个代码吗?我凭什么信任它?每一个被引入的开源组件都可能是供应链攻击的一个入口。做好源头管控才是治本之道,不要等到下游应用全部中毒了再去补救,那就太晚了。一定要在源头就把问题解决掉。