Sbom Generator

Polar Sponsor
爱发电 赞助
.NET 9.0

使用 CycloneDX 或 SPDX 格式生成软件物料清单 (SBOM),列出所有依赖项、许可证、漏洞及供应链元数据。

SBOM 生成器 : 创建一份综合软件材料法案,列出每一种依赖性、版本、许可证和已知弱点

功能概述

SBOM 生成器 : 创建一份综合软件材料法案,列出每一种依赖性、版本、许可证和已知弱点是一项面向实际任务的技能,主要用于支持 Rigu 所需的 CypromotDX 和 SPDX 格式。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。

核心要点

  • 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
  • 该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。
  • 从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。

使用与执行

实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。

结果检查与注意事项

执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。

SBOM 生成器

生成一份全面的软件物料清单(Software Bill of Materials),完整列出所有依赖项、其版本号、许可证类型及已知漏洞。支持 CycloneDX 和 SPDX 格式,满足监管框架(FDA、欧盟《网络韧性法案》(Cyber Resilience Act)、NIST SSDF)的合规要求。

适用场景包括:“generate SBOM”、“software bill of materials”、“list all dependencies”、“license audit”、“supply chain inventory”、“compliance report”、“CycloneDX”、“SPDX”,或在安全/合规审计期间使用。

命令

1. generate — 生成完整 SBOM

扫描项目并输出完整的依赖项清单。

步骤 1:检测包管理器

echo "=== 包管理器检测 ==="

MANAGERS=""

# Node.js
[ -f "package-lock.json" ] && MANAGERS="$MANAGERS npm" && echo "✅ npm (package-lock.json)"
[ -f "yarn.lock" ] && MANAGERS="$MANAGERS yarn" && echo "✅ Yarn (yarn.lock)"
[ -f "pnpm-lock.yaml" ] && MANAGERS="$MANAGERS pnpm" && echo "✅ pnpm (pnpm-lock.yaml)"

# Python
[ -f "requirements.txt" ] && MANAGERS="$MANAGERS pip" && echo "✅ pip (requirements.txt)"
[ -f "Pipfile.lock" ] && MANAGERS="$MANAGERS pipenv" && echo "✅ Pipenv (Pipfile.lock)"
[ -f "poetry.lock" ] && MANAGERS="$MANAGERS poetry" && echo "✅ Poetry (poetry.lock)"
[ -f "pdm.lock" ] && MANAGERS="$MANAGERS pdm" && echo "✅ PDM (pdm.lock)"

# Go
[ -f "go.sum" ] && MANAGERS="$MANAGERS go" && echo "✅ Go (go.sum)"

# Rust
[ -f "Cargo.lock" ] && MANAGERS="$MANAGERS cargo" && echo "✅ Cargo (Cargo.lock)"

# Ruby
[ -f "Gemfile.lock" ] && MANAGERS="$MANAGERS bundler" && echo "✅ Bundler (Gemfile.lock)"

# PHP
[ -f "composer.lock" ] && MANAGERS="$MANAGERS composer" && echo "✅ Composer (composer.lock)"

# Java
[ -f "pom.xml" ] && MANAGERS="$MANAGERS maven" && echo "✅ Maven (pom.xml)"
[ -f "build.gradle" ] || [ -f "build.gradle.kts" ] && MANAGERS="$MANAGERS gradle" && echo "✅ Gradle"

# .NET
find . -name "*.csproj" -maxdepth 3 2>/dev/null | head -1 | grep -q . && MANAGERS="$MANAGERS nuget" && echo "✅ NuGet (.csproj)"

echo ""
echo "检测到的包管理器数量:$(echo $MANAGERS | wc -w)"

步骤 2:提取依赖项

echo ""
echo "=== 依赖项提取 ==="

# npm/Node.js
if [ -f "package-lock.json" ]; then
  echo "--- npm 依赖项 ---"
  python3 -c "
import json
lock = json.load(open('package-lock.json'))
packages = lock.get('packages', {})
count = 0
for name, info in sorted(packages.items()):
    if not name or name == '': continue
    clean_name = name.replace('node_modules/', '')
    version = info.get('version', '?')
    license = info.get('license', 'UNKNOWN')
    resolved = info.get('resolved', '')
    dev = info.get('dev', False)
    print(f'{clean_name}|{version}|{license}|{"dev" if dev else "prod"}')
    count += 1
print(f'Total npm packages: {count}', file=__import__('sys').stderr)
" 2>/dev/null | head -50
fi

# Python
if [ -f "requirements.txt" ]; then
  echo "--- Python 依赖项 ---"
  python3 -c "
import re
with open('requirements.txt') as f:
    for line in f:
        line = line.strip()
        if not line or line.startswith('#') or line.startswith('-'): continue
        match = re.match(r'([a-zA-Z0-9_.-]+)s*([=<>!~]+s*S+)?', line)
        if match:
            name = match.group(1)
            version = match.group(2) or 'any'
            print(f'{name}|{version.strip()}|UNKNOWN|prod')
" 2>/dev/null
fi

# Go
if [ -f "go.sum" ]; then
  echo "--- Go 依赖项 ---"
  python3 -c "
import re
seen = set()
with open('go.sum') as f:
    for line in f:
        parts = line.strip().split()
        if len(parts) >= 2:
            name = parts[0]
            version = parts[1].split('/')[0]
            key = f'{name}@{version}'
            if key not in seen:
                seen.add(key)
                print(f'{name}|{version}|UNKNOWN|prod')
" 2>/dev/null | head -50
fi

# Rust
if [ -f "Cargo.lock" ]; then
  echo "--- Rust 依赖项 ---"
  python3 -c "
import re
with open('Cargo.lock') as f:
    content = f.read()
for match in re.finditer(r'name = "([^"]+)"nversion = "([^"]+)"', content):
    print(f'{match.group(1)}|{match.group(2)}|UNKNOWN|prod')
" 2>/dev/null | head -50
fi

步骤 3:许可证识别

echo ""
echo "=== 许可证分析 ==="

# 对于 npm:许可证信息位于 package-lock.json 和 package.json 中
if [ -f "package-lock.json" ]; then
  python3 -c "
import json
from collections import Counter

lock = json.load(open('package-lock.json'))
licenses = Counter()
unknown = []

for name, info in lock.get('packages', {}).items():
    if not name: continue
    lic = info.get('license', 'UNKNOWN')
    if isinstance(lic, dict):
        lic = lic.get('type', 'UNKNOWN')
    licenses[lic] += 1
    if lic == 'UNKNOWN':
        unknown.append(name.replace('node_modules/', ''))

print('许可证分布情况:')
for lic, count in licenses.most_common():
    print(f'  {lic}: {count}')

if unknown:
    print(f'n未知许可证(共 {len(unknown)} 个):')
    for pkg in unknown[:10]:
        print(f'  {pkg}')

# 标记 Copyleft 类许可证
copyleft = ['GPL-2.0', 'GPL-3.0', 'AGPL-3.0', 'LGPL-2.1', 'LGPL-3.0', 'MPL-2.0', 'EUPL-1.2', 'SSPL-1.0']
risky = {l: c for l, c in licenses.items() if any(l.startswith(cp) for cp in copyleft)}
if risky:
    print('n⚠️  检测到 Copyleft 类许可证(可能限制分发):')
    for lic, count in risky.items():
        print(f'  {lic}: {count}')
" 2>/dev/null
fi

步骤 4:漏洞检查

echo ""
echo "=== 漏洞扫描 ==="

# npm audit
if [ -f "package-lock.json" ]; then
  npm audit --json 2>/dev/null | python3 -c "
import json, sys
try:
    d = json.load(sys.stdin)
    vulns = d.get('metadata', {}).get('vulnerabilities', {})
    total = sum(vulns.values())
    print(f'npm 漏洞数量:{total}')
    for severity in ['critical', 'high', 'moderate', 'low']:
        count = vulns.get(severity, 0)
        if count > 0:
            icon = '❌' if severity in ['critical', 'high'] else '⚠️'
            print(f'  {icon} {severity}: {count}')
    if total == 0:
        print('  ✅ 未发现已知漏洞')
except:
    print('  无法解析 npm audit 输出')
" 2>/dev/null
fi

# pip-audit
if [ -f "requirements.txt" ] && command -v pip-audit &>/dev/null; then
  pip-audit -r requirements.txt 2>/dev/null | head -20
fi

# Go 漏洞检查
if [ -f "go.sum" ] && command -v govulncheck &>/dev/null; then
  govulncheck ./... 2>/dev/null | head -20
fi

2. cyclonedx — 生成 CycloneDX 格式 SBOM

输出 CycloneDX 1.5 JSON 格式:

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.5",
  "serialNumber": "urn:uuid:",
  "version": 1,
  "metadata": {
    "timestamp": "",
    "tools": [{"name": "sbom-generator", "version": "1.0.0"}],
    "component": {
      "type": "application",
      "name": "",
      "version": ""
    }
  },
  "components": [
    {
      "type": "library",
      "name": "",
      "version": "",
      "purl": "pkg:npm/@",
      "licenses": [{"license": {"id": ""}}],
      "scope": "required"
    }
  ]
}

3. spdx — 生成 SPDX 格式 SBOM

输出 SPDX 2.3 JSON 格式。

4. licenses — 许可证合规报告

仅聚焦于许可证分析:

  • 按许可证类型统计分布
  • Copyleft 类许可证检测(GPL、AGPL、SSPL)
  • 许可证兼容性矩阵
  • 未知/缺失许可证列表
  • 合规性建议
## 许可证合规报告

### 概要
- 总依赖数:247
- 宽松型许可证(MIT、Apache-2.0、BSD):231(93.5%)
- Copyleft 类许可证(GPL、LGPL、MPL):8(3.2%)
- 未知许可证:8(3.2%)

### 待处理事项
1. ❌ 3 个包采用 GPL-3.0 —— 可能需公开源代码
2. ⚠️  8 个包许可证未知 —— 需人工核查
3. ✅ 231 个包采用宽松型许可证 —— 无分发限制

5. diff — 版本间 SBOM 差异比对

对比两个 SBOM,识别变更内容:

新增依赖项:
  + @tanstack/react-query 5.0.0 (MIT)
  + zod 3.22.0 (MIT)

移除依赖项:
  - react-query 3.39.0 (MIT)
  - yup 1.2.0 (MIT)

版本变更:
  ~ react 18.2.0 → 18.3.0
  ~ typescript 5.2.0 → 5.3.0

许可证变更:
  ~ some-package: MIT → Apache-2.0

6. policy — 基于许可证策略校验

在 .sbom-policy.json 中定义允许/禁止的许可证:

{
  "allowed": ["MIT", "Apache-2.0", "BSD-2-Clause", "BSD-3-Clause", "ISC", "0BSD", "Unlicense", "CC0-1.0"],
  "denied": ["GPL-3.0", "AGPL-3.0", "SSPL-1.0"],
  "review_required": ["GPL-2.0", "LGPL-2.1", "LGPL-3.0", "MPL-2.0", "EUPL-1.2"],
  "allow_unknown": false
}

退出码说明:

  • 0:所有依赖均符合策略
  • 1:发现被禁止的许可证
  • 2:存在未知许可证且 allow_unknown 为 false

输出格式

  • text(默认):人类可读的依赖清单
  • json:CycloneDX 1.5 或 SPDX 2.3 格式(通过 --format cyclonedx 或 --format spdx 指定)
  • csv:适用于电子表格的字段格式:name,version,license,scope,purl
  • markdown:含表格结构的文档化报告

合规标准

本能力支持以下合规要求:

  • 欧盟《网络韧性法案》(CRA):面向欧盟市场销售的软件产品须提供 SBOM
  • 美国第 14028 号行政令:联邦政府软件采购要求提供 SBOM
  • FDA:医疗器械软件必须包含 SBOM
  • NIST SSDF:建议将 SBOM 生成纳入安全开发生命周期
  • PCI DSS 4.0:软件资产清点相关要求

注意事项

  • 从 lock 文件(而非 manifest 文件)中提取依赖信息,确保结果准确且可复现
  • 许可证识别优先采用 SPDX 标准标识符
  • 漏洞扫描需联网访问(如 npm audit、pip-audit、govulncheck)
  • 如使用私有仓库,请确保已正确配置身份认证
  • PURL(Package URL)格式严格遵循 PURL 规范,实现跨生态统一标识
  • 建议在 CI 流程中集成,每次发布时自动生成 SBOM 并存档至制品库或注册中心

相关专题

更多
Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

0

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

0

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

0

10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

0

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

0

12

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

2026.11.04

0

16

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习