0Pricing
Cloud & IT Cert Prep · 课时

依赖项安全与软件组成分析

使用 SCA 工具审计第三方库,强制固定依赖项版本,并将自动漏洞警报集成到 CI/CD 流水线中。

依赖项安全与软件组成分析 是 CoddyKit 上的免费 Cloud & IT Cert Prep 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cloud & IT Cert Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cloud & IT Cert Prep 课程共包含 4 节课。

The 开源依赖项风险

现代 Application 大多由第三方开源库和框架组成。典型的 Node.js Application 可能拥有 1,000 多个传递依赖项;Java 项目可能会引入数百个 Maven 构件。每个依赖项都可能成为攻击面。Log4j 库中的 Log4Shell 漏洞(CVE-2021-44228)表明,单个依赖项就可能使全球数百万个 Application 在漏洞披露后的几天内立即变得可被利用。

什么是软件组成分析?

软件组成分析(SCA)工具会自动清点 Application 中的所有开源组件,包括传递依赖项(您的依赖项所依赖的依赖项),并持续将其与漏洞数据库进行比对,以检查已知 CVE。SCA 会生成列出每个组件及其版本的软件物料清单(SBOM),从而在披露新漏洞时快速识别受影响的系统。

# SCA tool usage examples:

# npm audit (Node.js):
# npm audit
# -> Reports vulnerabilities in package.json dependencies
# -> Shows severity, CVE ID, affected package, fix version

# OWASP Dependency-Check (Java/Python/etc.):
# dependency-check --project 'MyApp' --scan ./lib/
# -> Generates HTML/XML report with CVE findings

# Snyk scan:
# snyk test
# -> Reports vulns + 'snyk fix' applies patches automatically

传递依赖项:隐藏的风险

传递依赖项是您的直接依赖项所依赖的库,而这些库并非由您明确选择。您可能直接依赖 Package A,而 Package A 依赖 Package B(版本 1.2),Package B 又依赖 Package C(版本 3.0——存在漏洞的版本)。您并不了解 Package C,但您的 Application 会执行它。SCA 工具会遍历完整的依赖关系树,暴露这些开发人员无法直接了解的隐藏漏洞。

# Dependency tree example:
# Your package.json:
#   'express': '^4.18.0'     (direct dependency)
#   'lodash':  '^4.17.21'   (direct dependency)

# Transitive dependencies (you didn't choose these):
#   express -> 'qs' 6.11.0       (URL parsing)
#   express -> 'body-parser' 1.20 -> 'qs' 6.11.0
#   lodash (self-contained in this case)

# If 'qs' 6.10.x had a prototype pollution CVE,
# you are vulnerable via express even though
# you never directly imported 'qs'.

软件物料清单(SBOM)

软件物料清单(SBOM)是软件产品中所有组件的正式、机器可读清单,类似于食品配料表。SBOM 格式包括 SPDX(Linux Foundation)和 CycloneDX(OWASP)。美国第 14028 号行政命令(2021 年)规定,出售给联邦政府的软件必须提供 SBOM。有了 SBOM,安全团队可以立即查询:“我们的哪些产品包含 Log4j?”并在几分钟内得到答案,而不必花费数天手动搜索。

# Generate SBOM with syft:
# syft packages . -o spdx-json > sbom.spdx.json

# SBOM content example (SPDX JSON):
# {
#   'packages': [
#     { 'name': 'express',  'version': '4.18.2', 'license': 'MIT' },
#     { 'name': 'lodash',   'version': '4.17.21','license': 'MIT' },
#     { 'name': 'log4j-core','version': '2.14.0','license': 'Apache-2.0'}
#   ]
# }

# When Log4Shell announced, query SBOM:
# grep -i 'log4j-core' sbom.spdx.json -> FOUND in 3 projects

依赖项固定与锁定文件

依赖项固定会指定依赖项的确切版本,而不是使用灵活的版本范围(^1.2.3 或 *)。锁定文件(package-lock.json、yarn.lock、Pipfile.lock、Gemfile.lock)会记录安装时每个依赖项最终解析出的确切版本。这些文件应提交到源代码控制系统,确保每位团队成员和 CI/CD 流水线使用完全相同的依赖项版本,防止攻击者在两次安装之间污染软件包版本,发动供应链攻击。

# Version range vs pinned versions:

# FLEXIBLE (can pull different versions each install):
# 'express': '^4.0.0'   -> installs latest 4.x.x
# 'lodash': '*'         -> installs any version!

# PINNED (always same version):
# 'express': '4.18.2'   -> always exactly 4.18.2

# Lock file (package-lock.json):
# Records EXACT resolved version of every transitive dep.
# Commit this file! It ensures reproducible builds.
# Never .gitignore lock files (security anti-pattern).

供应链攻击:typosquatting 与依赖项混淆

供应链攻击的目标是依赖项生态系统。Typosquatting指发布名称类似于热门软件包的恶意软件包(例如,用 lodahs 冒充 lodash),诱使开发人员因拼写错误而输入错误名称。依赖项混淆攻击利用软件包管理器搜索 registry 的顺序:攻击者发布一个与内部私有软件包同名但版本号更高的恶意软件包,使软件包管理器改为安装该恶意公共版本。

# Dependency Confusion Attack (Alex Birsan 2021):
# Company uses internal package 'company-utils' v1.0.0
# Hosted on: internal.registry.company.com

# Attacker publishes 'company-utils' v9.9.9 to npmjs.com
# (public registry with higher version number)

# npm install resolves: 'find highest version across ALL registries'
# -> Installs v9.9.9 from public npm (attacker's malicious package!)
# -> Instead of v1.0.0 from internal registry

# Defense: use namespace scoping (@company/utils)
# or configure npm to ONLY use internal registry for private packages

市场上的 SCA 工具

业界广泛使用多种 SCA 工具。Snyk 提供面向开发人员的依赖项扫描,并自动创建修复 PR。OWASP Dependency-Check 是一款免费且广泛采用的工具,适用于 Java、.NET、Python 和 Ruby。GitHub Dependabot 会自动创建拉取请求,更新 GitHub 存储库中的易受攻击依赖项。JFrog Xray 和 Sonatype Nexus IQ 将 SCA 集成到构件存储库中,阻止存在漏洞的构建进入生产环境。

将 SCA 集成到 CI/CD 流水线

将 SCA 集成为CI/CD 流水线中的质量门禁时,其效果最好。在每个拉取请求和每次构建时,流水线都会运行 SCA 工具;如果依赖项中发现严重或高危的 CVE,构建就会失败。这种“左移”方式可以在存在漏洞的依赖项进入生产环境之前发现它们,而不是在数月后的人工安全审查中,或在发生泄露后才发现。团队应明确规定漏洞严重性阈值,区分哪些漏洞会阻止部署,哪些漏洞只会生成警告。

# GitHub Actions SCA pipeline step:
# - name: Run Snyk SCA scan
#   uses: snyk/actions/node@master
#   env:
#     SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
#   with:
#     args: --severity-threshold=high
#             --fail-on=upgradable
# # Build fails if any HIGH or CRITICAL vuln found
# # that has an available fix (--fail-on=upgradable)
# # No fix available? Generates warning, doesn't block
# # (acknowledging risk explicitly is better than blocking forever)

评估开源软件包的健康状况

在添加依赖项之前,请结合多种信号评估其安全状况。维护活动:项目是否在积极维护?上次提交和发布是什么时候?已知漏洞历史:它曾出现过多少个 CVE,修复速度有多快?下载量:使用广泛的软件包会受到更多安全审查。依赖项数量:依赖项较少的软件包引入的传递风险更低。OpenSSF Scorecard 可以自动评估开源项目的安全实践。

漏洞修复策略

当 SCA 识别出存在漏洞的依赖项时,可以采用多种修复策略。升级到已修复的版本——如果可行,这是首选方案。准备升级期间,可以通过 WAF 规则进行虚拟修补,缓解已知的利用路径。如果不再需要该依赖项,则将其移除。如果漏洞在特定使用场景中无法被利用(例如,客户端库中的服务器端漏洞),可以在记录理由后接受风险。对于严重漏洞,绝不能在没有记录风险接受决定的情况下置之不理。

依赖项中的许可证合规

SCA 工具有双重用途:它们既能识别安全漏洞,也能标记开源依赖项中的许可证合规问题。常见的问题许可证包括 GPL v2/v3(copyleft——如果您分发产品,则要求您的产品也必须开源)、AGPL(将 GPL 的要求扩展到网络服务)和 SSPL。在没有商业许可证的情况下,将 GPL 许可的库用于专有商业软件,可能造成严重的法律责任。FOSSA、Black Duck 和 WhiteSource 等 SCA 工具会在检测漏洞的同时自动扫描许可证,确保履行开源义务。

# License compliance risk levels:
# PERMISSIVE (low risk for commercial use):
#   MIT, Apache 2.0, BSD 2/3-Clause
#   -> Can use in proprietary code, just keep attribution

# WEAK COPYLEFT (medium risk - check usage):
#   LGPL -> can link dynamically without open-sourcing your code
#   MPL 2.0 -> modifications to MPL files must be open-sourced

# STRONG COPYLEFT (high risk for proprietary products):
#   GPL v2, GPL v3 -> if you distribute code using GPL library,
#                     your entire product must also be GPL
#   AGPL -> extends GPL to SaaS/network services

# SCA policy: block AGPL/GPL in commercial product
# -> Review any exception requests manually

快速检查

测试您对本课 CompTIA Security+(SY0-701)概念的理解。

课程回顾

在本课中,您学到了:SCA 工具会扫描完整的依赖关系树,包括传递依赖项,以查找已知 CVE;SBOM 提供机器可读的清单,能够在披露新漏洞时快速响应;将 SCA 集成为 CI/CD 质量门禁,可以在存在漏洞的依赖项进入生产环境之前发现它们。接下来,我们将学习 DevSecOps,以及如何将安全控制左移到完整的 CI/CD 流水线中。

常见问题解答

「依赖项安全与软件组成分析」课时是免费的吗?

是的 — 「依赖项安全与软件组成分析」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cloud & IT Cert Prep 课程的其余内容,请升级到 CoddyKit PRO。 Cloud & IT Cert Prep 课程共包含 4 节课。

「依赖项安全与软件组成分析」这节课中我会学到什么?

使用 SCA 工具审计第三方库,强制固定依赖项版本,并将自动漏洞警报集成到 CI/CD 流水线中。 你通过在浏览器中直接运行的动手代码来练习 Cloud & IT Cert Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Cloud & IT Cert Prep 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Cloud & IT Cert Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「依赖项安全与软件组成分析」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Cloud & IT Cert Prep 课中编写并运行代码吗?

能。每节 Cloud & IT Cert Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 输入验证与输出编码
  2. 安全机密管理与环境变量
  3. 依赖项安全与软件组成分析
  4. DevSecOps:将安全左移到流水线中
← 返回 Cloud & IT Cert Prep