上周整理完某头部云厂商参与复盘的一起开源库污染事件的内部手里还攥着当时留存的30多页应急日志文档——这事儿是近年软件供应链领域最具样本性的案例之一,别觉得夸张,事件触发于2023年第三季度某热门Java开源工具库的第三方分支仓库被植入恶意代码,上万家依赖该库的企业级应用被悄悄植入了挖矿木马和用户数据窃取插件,整个应急响应过程踩的坑,足够给所有做安全和供应链管理的团队写一本实打实的《避坑指南》。当时应急响应组从收到第一例企业的挖矿告警,到初步完成流量截断,足足花了26小时,比行业平均响应时间慢了近三倍,核心原因就是对供应链节点的认知盲区。
先还原下事件的核心脉络,省得有人觉得这是遥远的“别人的事儿”:事件的起点是那个开源库的第三方代维护团队,这个团队本身还为不少中小开发者提供“开源组件适配咨询+分支托管”服务——说白了就是帮小团队维护他们改了定制化需求的开源分支,这部分服务是很多企业做数字化时会用到的灰色地带,没人把它算进“软件供应链”里。代维护团队因为人手不足,没给托管的分支开基础的代码安全扫描,一个别有用心的内部成员在提交代码时,偷偷加了反调试逻辑和HTTP请求上报脚本,正好赶上依赖该分支的企业应用没做子依赖的自动扫描,恶意代码自然就埋进了企业的核心业务系统里。
应急响应的复盘会我全程参与了,最大的吐槽点就是“节点漏算”——当时我们只把开源包管理器、直接依赖的组件库、自己的开发团队算进供应链安全台账,甚至连间接依赖都没完全梳理全,更别说那个提供代维护服务的第三方团队了。这直接导致事件初期的排查方向完全错了:一开始我们把锅甩给了依赖扫描工具,后来才顺着日志摸到代码提交的IP,又顺着IP查到那个代维护团队的分支仓库,前后花了快10小时才找到根源。更糟的是,给企业客户发安全预警时,我们只列了“卸载该开源库”,没提“检查代维护分支的恶意代码”,不少企业到第二天才发现数据泄露的痕迹,这波背刺完全是供应链节点认知不足导致的。
这就绕到了复盘时所有人都在问的核心问题:提供软件服务算供应链的一部分吗?之前我也以为,软件供应链就是“买组件→用组件→打包软件→交付客户”的那条线,直到这次事件才明白,行业里对供应链的定义早就拓展了。从广义软件供应链的角度,所有“可能影响软件完整性、可用性、保密性”的服务节点,都属于供应链的范畴。就拿这次的案例来说,那个代维护团队提供的“开源分支托管和维护服务”,直接影响了开源组件的安全性,进而影响了上万企业的软件,所以它必然是供应链的一部分。换个场景,如果一家企业找第三方服务商做代码审计、SaaS托管、甚至是API接口的适配服务,只要这些服务涉及到软件的修改、部署、运维,那这个服务提供商就是供应链的一环——2022年Log4j漏洞事件里,很多企业就是因为忽略了第三方运维服务商的代码修改,才没能及时修复漏洞,和这次的问题本质上是一样的。
不过这里也不能一概而论,比如如果只是一家公司给另一家公司提供办公用品、云存储这类不直接影响软件本身的服务,那不算。但只要服务涉及到软件的“开发、定制、托管、运维、安全适配”这些环节,就必须纳入供应链安全的评估范围。复盘时我们达成的共识是:软件供应链的边界应该以“是否会成为软件安全的薄弱点”为判断标准,而不是只盯着代码仓库、组件包这些显式的环节。
那这次复盘给企业的实际指导是什么?首先得先做全节点的供应链梳理,别只盯着直接依赖,要把所有间接组件的提供者,以及为组件提供维护、托管、适配服务的第三方都列进来,甚至要查这些第三方的安全资质。然后要建立代维护分支的定期审计机制,哪怕是自己用的定制分支,也要加基础的代码扫描和访问控制,这次事件里那个代维护团队如果有这个机制,恶意代码根本提交不上去。还有应急响应流程要加“服务关联风险排查”的步骤,收到安全告警后,除了排查自己的代码,还要查提供服务的第三方节点的安全记录,这次要是早想到查代维护团队的仓库,排查时间能缩短一半。
说句实在的,之前很多企业把软件供应链安全当成“大公司的事儿”,直到这次事件里有个做电商的客户,因为依赖了那个开源库,被挖矿木马拖垮了服务器,单天损失几十万才慌了神。这次复盘完我们给很多中小客户提了一个小建议:哪怕是依赖开源组件,也要把组件的所有服务提供者算进安全台账里,别让“提供软件服务的第三方”成了供应链里的隐形炸弹。现在那个代维护团队已经被开源社区除名了,而上万中招的企业也完成了系统的清毒,但这次事件留下的教训,应该是所有做软件和用软件的人都该记住的——软件供应链里,从来没有“无关紧要的节点”。(全文约1578字)