当前位置:首页 > 科研成果库

我蹲了3个月的厂商漏洞报告,才搞懂软件供应链安全到底坑在哪

2026-10-18 20:12:01小研科研成果库90

上周帮一个做跨境电商的朋友查线上系统的告警,翻了三小时日志才发现——根本不是他自己写的业务代码出问题,是他去年图省事从开源仓库拉的一个12KB大小的日期格式化工具包,被人塞了偷用户支付信息的后门。我当时盯着那个包的代码,后背直冒冷汗。这玩意他全线上跑了8个节点,300多万用户的支付数据都从这走。

说实话,我之前一直觉得软件供应链安全是互联网大厂才需要操心的"高大上"议题——毕竟大厂有钱有团队,天天防着各种攻击,像我们这种小团队,写的代码没几个人用,谁会费力气来攻你?直到那次查完朋友的系统漏洞,我特意翻了近3个月各个厂商、科研机构发的漏洞报告,才发现之前的想法有多天真。

你根本不知道自己用的开源包是谁塞的私货

2024年ISC(互联网安全大会)上发布的开源组件安全报告里有个数据挺扎心:近4成被发现的恶意开源包,根本不是靠仿冒React、Vue这种大家都熟的头部库,专挑那种下载量在几千到几万的小众工具下手。

没人审。

就没人审。

真的没人逐行看你拉下来的那堆几千个依赖包的代码。很多团队现在做开发流程优化,追求的是把需求从提交到上线的周期压到3天以内,谁会停下来花半小时把每个第三方依赖的代码拉下来逐行读?大家都默认"开源社区的东西是公开透明的,有问题早就被人揪出来了",但现实是,90%的小众开源包,从发布到现在,除了原作者自己,根本没第二个人完整看过它的全部代码。

举个真实的例子,有个做Markdown转PDF的小工具,原作者因为工作忙停更了两年,有人在开源仓库注册了一模一样的包名,往上塞了偷偷连境外挖矿服务器的代码,半年时间被下载了17万次,其中6成是国内的中小创业团队。等安全厂商发现这个恶意包的时候,已经有近3万台服务器在偷偷给攻击者算比特币了。

开源npm仓库恶意包仿冒截图开源npm仓库恶意包仿冒截图

我之前跟一个做前端开发的小姑娘聊天,她还说自己之前写项目,遇到要做个手机号格式校验的需求,直接从开源仓库拉了个几十行代码的工具包,连这个包的作者是谁都不知道,就直接用到了上线的项目里。你说这心大不大?

连流水线本身都能成后门的通道

之前看到中科院信工所2024年发的CI/CD供应链攻击研究报告,里面说现在有超过6成的供应链攻击,根本不是针对最终交付给用户的软件安装包,是在构建环节就动了手脚。

去年闹得挺大的那个攻击事件,攻击者根本没费力气去破企业的边界防火墙,只是黑进了一个知名开源项目维护者的GitHub账号,没有改项目本身的业务代码,只是在项目的GitHub Actions配置文件里加了一行命令——只要有人拉这个项目跑CI构建,那台机器上存的SSH密钥、云服务访问密钥,就会被偷偷发到攻击者的服务器。

我当时看到这个研究结果的时候,真的想拍桌子。之前大家做安全,总想着把边界做厚,防火墙、WAF、EDR堆了一堆,结果人家根本不碰你边界,就钻你流水线里那行没人仔细看的配置文件。更气人的是,很多团队现在为了追求开发效率,CI/CD平台的权限开得贼大——比如给个刚入职的普通开发的账号,就能改生产环境的构建脚本,能直接拉取存在平台里的生产环境密钥。你说这能不出事?

CI/CD流水线供应链攻击路径示意图CI/CD流水线供应链攻击路径示意图

上次跟一个做DevOps的朋友聊天,他说他们公司之前为了赶版本,把原来需要多层审批的构建流程给关了,就为了让前端同事能自己发版,结果半个月后就出问题了:有个外包开发在自己本地的项目依赖里塞了个偷偷收集用户设备信息的脚本,直接跟着版本上了生产,被监管部门罚了20多万。他说当时复盘的时候,全公司的人都在找业务代码的问题,翻了整整两天,根本没人想到去翻那个已经上线了的、大家都觉得"没问题"的依赖列表。

别上来就买几十万的安全产品,先把这3件小事做了

很多人一提软件供应链安全,第一反应是要花大价钱买商业扫描工具,要招专门的安全团队,要搞一套复杂的治理流程。其实根本不是那么回事。我翻了这么多案例,发现80%的供应链安全事故,根本不是因为企业的安全投入不够,是连最基础的小事都没做到位。

第一件事,先把你项目里所有超过180天没更新的依赖包列出来。别觉得停更的包就安全——停更的包恰恰是攻击者最喜欢的目标,因为没人维护,出了漏洞没人补,你用的越久,暴露的风险就越大。真的。我见过太多项目,用的一个依赖包原作者都注销账号了,还在当宝贝用。

第二件事,给你的CI/CD流水线加个最基础的权限隔离。别让普通开发能直接改生产环境的构建配置,别把生产环境的密钥存在构建脚本的明文里,哪怕你加个最基础的开源密钥管理工具,都比你把密钥写在配置文件里强。之前看到很多团队的CI配置文件里,明晃晃写着生产数据库的密码,连个加密都没有。你说这不是给攻击者送机会吗?

第三件事,别为了省几行代码,就随便从不知名的仓库拉工具包。很多开发者写代码的时候,遇到个小需求,比如要做个图片压缩,要做个字符串校验,第一反应是去网上搜个现成的工具包,拉下来直接用,连这个包是谁发的,有没有人维护都不看。说实话,这种小功能,你花10分钟自己写个简单的实现,都比你随便拉个不知道来源的包安全。我自己写项目的时候,遇到个要计算文件MD5的需求,本来想拉个现成的包,结果翻了一圈那个包的提交记录,发现最近一次提交是个陌生账号,加了三行跟MD5计算完全没关系的网络请求代码,我当时直接就把页面关了,花了20分钟用标准库写了个,顺顺当当的,也没多花多少时间。

不过话说回来,也别走到另一个极端,觉得所有开源组件都是洪水猛兽。开源本身是个好东西,能让大家少写很多重复的代码,提高开发效率。只是之前大家太把开源的东西当"理所当然的安全"了,总觉得公开的代码就没人敢搞鬼,就像你平时走大马路,总觉得没人会在马路上放钉子,结果真有人蹲在那放,你没注意就扎了轮胎。

前几天看到某安全厂商发的2025年的预测,说今年软件供应链安全的攻击量会比去年涨60%。我倒不觉得这是啥耸人听闻的事。毕竟现在大家写代码的方式早就变了——你写的业务代码可能只占整个项目代码量的20%,剩下80%都是你从各个地方拉过来的第三方组件、构建脚本、配置文件。你对这80%的内容都不了解,出问题是迟早的事。