# 供应链安全:依赖与构建链风险入门 > 核心一句话:**软件供应链 = 代码从编写 → 依赖引入 → 构建打包 → 分发交付 → 客户部署的全链路;风险不只是自己写的代码,更多来自第三方依赖、构建流水线、制品仓库。** > 适用:DevSecOps、开源组件治理、SBOM、CI/CD安全、软件物料清单。 ## 一、基础概念 ### 1. 软件供应链包含两大块 1. **依赖链(第三方组件)** 项目引入的开源库、SDK、jar/npm/pip/go模块,直接下载的二进制包。 你写的业务代码只是一小部分,**绝大部分代码来自第三方依赖**。 风险点:依赖存在漏洞、投毒、后门、维护停更。 2. **构建链(CI/CD流水线)** 代码提交 → 拉取依赖 → 编译构建 → 生成镜像/安装包 → 制品仓库存储 → 发布上线。 风险点:流水线被劫持、构建节点被入侵、制品被篡改、凭证泄露。 ### 2. SBOM(软件物料清单) SBOM = 软件的“配料表”,记录所有组件名称、版本、许可证、供应商、CVE。 作用:快速定位哪些资产包含有漏洞的依赖,漏洞爆发时快速影响面排查。 常见标准:SPDX、CycloneDX。 ## 二、依赖链风险(开源组件风险) ### 风险类型 1. **已知CVE漏洞** 依赖库存在公开漏洞(如Log4j、Spring4Shell),业务直接继承该漏洞。 > 坑:很多项目只扫描直接依赖,忽略**传递依赖(间接依赖)**。A库依赖B库,B有漏洞,你同样受影响。 2. **依赖投毒(Supply Chain Compromise)** - 名称混淆攻击(typosquatting):发布名字拼写近似的恶意包(`requests-sec` 冒充 `requests`) - 劫持维护账号:接管开源项目账号,发布带后门新版本 - 上游仓库被入侵,官方包植入恶意代码 3. **废弃组件(孤儿组件)** 组件作者停止维护,漏洞长期不修复,持续留在项目中。 4. **许可证风险** 开源协议冲突(GPL强传染协议),引发知识产权合规问题。 ### 依赖治理手段 1. 依赖锁定:`package-lock.json`、`requirements.txt`、`pom.lock`,固定版本 2. SCA 软件成分分析工具:扫描项目,识别所有依赖、CVE、许可证(Snyk、Dependabot、OWASP Dependency-check) 3. 私有制品镜像仓库:内部镜像代理,不直接公网拉包,缓存+扫描 4. 最小依赖原则:不引入无用开源包,精简依赖树 ## 三、构建链风险(CI/CD流水线风险) 攻击者目标:**在构建环节注入后门,最终产出带恶意代码的软件制品** 典型攻击面: 1. 代码仓库劫持:Gitee/GitHub账号泄露,提交恶意代码 2. CI runner/构建服务器被攻陷:在构建节点植入后门,编译阶段篡改产物 3. 流水线凭证泄露:仓库密钥、云AK、制品仓库token硬编码在代码/流水线配置 4. 构建时动态拉取外部脚本:`curl xxx | bash`,外部脚本一旦被篡改,构建即中毒 5. 制品仓库被篡改:镜像/安装包上传后被替换,上线的不是你构建的包 ### 构建链防护措施 1. 最小权限:CI账号只拥有构建上传制品权限,禁止生产高权限 2. 流水线不可变:不允许构建时动态拉取远程脚本,所有代码/脚本纳入版本管理 3. 制品签名:构建完成对镜像/二进制签名;部署前校验签名(SLSA) 4. 隔离构建节点:一次性ephemeral(临时销毁)构建容器,每次构建环境重置 5. 日志审计:CI全流程日志留存,记录每次构建的输入代码、依赖版本、输出制品哈希 ## 四、SLSA 软件供应链安全等级(快速理解) SLSA(Supply-chain Levels for Software Artifacts),Google推出,国内等保、政企采购越来越多引用 - L1:基础,有版本控制,基本记录 - L2:可信构建,源码托管,独立CI构建 - L3:强化,源码与构建隔离,证明来源,审计日志 - L4:最高,端到端强完整性,多方验证,一次性构建环境,防止构建劫持 ## 五、实战工作流(依赖+构建链安全) 1. 开发阶段:IDE集成SCA,提交前扫描依赖漏洞 2. 代码提交:代码门禁,MR/PR合并触发SCA扫描,高危漏洞阻断合并 3. CI构建: - 拉取锁定版本依赖,禁止模糊版本`^latest` - 生成SBOM,自动上传SBOM到平台 - 扫描镜像/制品漏洞 - 制品签名,记录制品哈希 4. 制品仓库:存储SBOM、漏洞报告、签名信息 5. 部署阶段:校验制品签名、哈希,校验SBOM,不部署未通过扫描的制品 6. 持续监控:持续监控上游依赖新增CVE,定期扫描存量项目 ## 六、典型误区分点 1. ❌ 只扫描业务代码,不扫描传递依赖:绝大多数供应链漏洞藏在间接依赖 2. ❌ 一次扫描永久安全:上游依赖不断爆出新CVE,需要持续监测 3. ❌ 认为只要源码安全就没问题:CI流水线被劫持,干净源码也能产出恶意制品 4. ❌ 依赖直接从公网拉取:公网包源污染风险高,无缓存、无审计 5. ❌ SBOM一次性导出不再更新:代码版本迭代,SBOM需要跟着更新 ## 七、工具清单入门 - SCA:OWASP Dependency-Check、Snyk、Trivy - SBOM生成:CycloneDX、syft - 镜像扫描:Trivy、Aqua、Harbor镜像扫描 - 制品签名:cosign - 源码仓库:Gitea/GitLab,配置保护分支、MR审核 ## 速记口诀 **依赖看SCA,构建守CI;SBOM做配料,制品验签名。**