
编程语言语言运行时标准库编译器并发编程【免费下载链接】otpErlang/OTP项目地址https://gitcode.com/gh_mirrors/ot/otp点击查看免费下载Erlang/OTP 使用 OpenVEX 规范统一披露自身与第三方依赖的漏洞信息将哪个 CVE 影响哪个 OTP 版本、哪个 OTP 应用以机器可读的结构化声明发布出来供安全扫描器与开发者直接消费。本文以仓库中的官方文档 vulnerabilities.md 为主线结合当前仓库OTP_VERSION 标记为 30.0-rc0的源码实证完整讲解 VEX 声明的获取方式、双重版本标识、vendored 第三方依赖的审计边界以及如何据此制定升级策略。为什么 Erlang/OTP 需要一套漏洞披露规范Erlang/OTP 并不是一个单体二进制而是由erts、kernel、stdlib、ssl、ssh、crypto等数十个应用组成的发行版同时运行时还内嵌vendor了 pcre2、zlib、zstd 等一批第三方 C/C 库。这带来两个安全追踪难题一个 CVE 到底影响哪些 OTP 版本同一漏洞可能只存在于某个 OTP release 的某个应用版本中且应用版本可以独立于 release 单独升级第三方库的 CVE 是否波及 Erlang/OTP内嵌的第三方源码副本与构建时链接的系统库是两回事不能混为一谈。为此Erlang/OTP 采用OpenVEX 规范来回答这些问题。OpenVEX 的核心产物是结构化的声明statement每个声明描述一个漏洞如CVE-2025-48038、受影响/已修复/不受影响的软件产品集合如pkg:github/erlang/otpOTP-28.0以及对应的状态affected/fixed/not_affected。这种统一格式让 CVE 与具体版本之间的对应关系可以被工具自动解析而不是散落在各条公告邮件里。获取 VEX 声明发布位置与文件命名Erlang/OTP 为当前仍受维护的 OTP release持续发布 OpenVEX 声明统一存放在官方下载站的download/vex/目录下。文件名遵循固定模式otp-release.openvex.json其中release对应 OTP 版本号例如otp-28.openvex.json。每个受维护的 release 拥有一个独立文件安全团队可以直接把对应版本号的 JSON 文件接入扫描流水线无需人工解析公告。Erlang/OTP 第一方 CVE 声明为何采用双重版本标识release 与应用版本双维度寻址由于 OTP 应用如ssh可以独立于整个 release 发布补丁版本单一维度无法精确表达影响范围。因此 OpenVEX 声明中的products同时使用两类 purlPackage URL标识release 级pkg:github/erlang/otpOTP-28.0指向整个 OTP 发行版应用级pkg:otp/ssh5.3指向某个 OTP 应用pkg:otp命名空间下的应用名应用版本。这种双维度设计正是为了应对单独升级某个应用即可修复漏洞而不必等待整个 release 升级的现实场景。affected 声明示例下面是从otp-28.openvex.json中截取的实际声明以CVE-2025-48038为例完整保留原始字段{ vulnerability: { name: CVE-2025-48038 }, timestamp: 2025-09-16T08:22:13.223967395Z, products: [ { id: pkg:github/erlang/otpOTP-28.0 }, { id: pkg:github/erlang/otpOTP-28.0.1 }, { id: pkg:github/erlang/otpOTP-28.0.2 }, { id: pkg:otp/ssh5.3 }, { id: pkg:otp/ssh5.3.1 }, { id: pkg:otp/ssh5.3.2 } ], status: affected, action_statement: Update to any of the following versions: pkg:otp/ssh5.3.3, action_statement_timestamp: 2025-09-16T08:22:13.223967395Z }逐字段解读vulnerability.name漏洞标识即 CVE 编号timestamp声明的发布时间RFC 3339 格式 UTCproducts受影响的完整版本清单同时列出 releaseOTP-28.0、28.0.1、28.0.2与应用ssh5.3、5.3.1、5.3.2statusaffected表示这些版本确实存在该漏洞action_statement可选字段给出规避或修复动作这里明确指引升级到ssh5.3.3action_statement_timestamp该动作建议的时间戳。fixed 声明示例同一份文档中会为同一 CVE 再生成一条fixed声明指向首个不再受该漏洞影响的版本。继续以CVE-2025-48038为例{ vulnerability: { name: CVE-2025-48038 }, timestamp: 2025-09-16T08:22:13.241103494Z, products: [ { id: pkg:github/erlang/otpOTP-28.0.4 }, { id: pkg:github/erlang/otpOTP-28.0.3 }, { id: pkg:otp/ssh5.3.3 } ], status: fixed }可见修复落在OTP-28.0.3以及包含该修复的28.0.4与ssh5.3.3上。对使用者而言最直接的判断依据就是应用级版本只要ssh升级到5.3.3及以上即不再受影响无需关心整个 release 是否升级。第三方依赖的 VEX 声明vendored 代码的审计边界vendoring 与范围界定Erlang/OTP 以vendor方式将部分第三方库的源码副本直接纳入发行版例如仓库中 erts/emulator/pcre、erts/emulator/zlib、erts/emulator/zstd 等目录。因此第三方 VEX 声明覆盖任何作为源码包含在 Erlang/OTP release 中、且确实易受攻击的代码。文档同时划出了一条重要边界构建过程中动态或静态链接的库不在此声明范围内。例如任何涉及安全的 Erlang 应用都会依赖构建时动态/静态链接的 OpenSSL cryptolib 版本。换言之OpenVEX 声明只对 Erlang/OTP内置的源码副本负责绝不代表链接了系统 OpenSSL 的自有部署也安全。为什么用 commit SHA1 标识版本与第一方声明使用语义化版本号不同第三方声明以上游仓库的 commit SHA1标识受影响/已修复的版本。原因在于这些依赖是 C/C 代码业界漏洞扫描器如 OSV惯于按 SHA1 提交区间报告漏洞范围语义化 tag 无法精确到代码快照。not_affected 声明示例以 OpenSSL 为例Erlang/OTP 对CVE-2023-6129发布如下声明{ vulnerability: { name: CVE-2023-6129 }, timestamp: 2025-06-18T12:18:16.4724783302:00, products: [ { id: pkg:github/openssl/openssl01d5e2318405362b4de5e670c90d9b40a351d053 } ], status: not_affected, justification: vulnerable_code_not_present }解读要点products中的pkg:github/openssl/openssl01d5e2318405362b4de5e670c90d9b40a351d053表示 Erlang/OTP 内置的 OpenSSL 代码取自上游仓库该 commit文档注明对应 OpenSSL 3.1.4的源码副本status为not_affectedjustification为vulnerable_code_not_present即声明该 commit 的源码中不存在此漏洞对应的易受攻击代码该声明针对的是Erlang/OTP 内包含的这份源码。文档明确提醒如果你自己构建 Erlang/OTP 并在构建过程中链接任意版本的 OpenSSL如 3.5.2 甚至同为 3.1.4你的项目就产生了新的构建与运行依赖完全可能受CVE-2023-6129影响——内置副本的not_affected保护不了外部链接。注上述 OpenSSL 示例来自 vulnerabilities.md 原文其中给出的内置路径为lib/erl_interface/src/openssl/与erts/emulator/openssl/。从当前仓库30.0-rc0的源码结构看erts/emulator下实际保留的 vendored 目录为 pcre、zlib、zstd、ryu、asmjit 等示例旨在说明声明机制而非当前版本的目录清单。仓库实证vendored 依赖清单与 vendor.info当前仓库用vendor.info文件精确记录每个内嵌第三方库的版本、来源与 commit SHA这正是第三方 VEX 声明得以生成的基础。以下均可在仓库中直接核对库版本信息记录文件pcre210.47shaf454e231fe5006dd7ff8f4693fd2b8eb94333429vendor.infozlib1.3.2shada607da739fa6047df13e66a2af6b8bec7c2a498vendor.infozstdv1.5.7shaf8745da6ff1ad1e7bab384bd1f9d742439278e99vendor.inforyu含 STL to_charssha4c0618b0e44f7ef027ebae05d2cc7812048f7c8f/37d575ede5ade50ad95b857f22ed7f1be4b1f2dfvendor.infoasmjitsha5fe1940275d04432da841896bac0a66cc2375551vendor.info以 pcre2 为例vendor.info 记录了downloadLocation上游仓库、versionInfo10.47、sha上游 commit、purlpkg:github/PCRE2Project/pcre2等字段并标注annotation: Vendor package modified in Erlang/OTP说明这不是一次无改动的拷贝。更新流程如何沉淀 SHA第三方库升级时SHA 与版本号由仓库中的更新脚本自动写入vendor.info。以 erts/emulator/zstd/update.sh 为例脚本会通过 GitHub API 获取上游最新 release tagVSNgit clone对应 tag 的源码并执行git rev-parse --verify HEAD记录 commit SHA将lib/{common,compress,decompress}等目录复制进erts/emulator/zstd并把公开头文件重命名为erl_zstd.h等以避免与系统头文件冲突对应代码见 erl_zstd.h用 jq 改写vendor.info的versionInfo与sha字段。这套版本 SHA purl的记录机制与 OpenVEX 第三方声明按 commit SHA1 寻址的做法完全对齐——扫描器拿到vendor.info中的 SHA就能与 VEX 声明中的products精确匹配。vendored 代码不是简单拷贝以 PCRE2 为例值得强调的是Erlang/OTP 对 vendored 库往往有深度定制。仓库中的 erts/emulator/pcre/README.pcre_update.md 详细记录了 PCRE2 集成的三处关键改造可中断/可重启的正则匹配修改pcre2_match主执行循环把递归所需的局部变量改为堆上分配的栈帧结构PcreExecContext配合COST_CHK、COST宏与LOOP_COUNT注释实现 reduction 计数与 trap使超长正则匹配不会阻塞 Erlang 调度器符号隐藏以-fvisibilityhidden编译全部 PCRE2 文件避免与 NIF/driver 链接的真实 PCRE2 库产生符号冲突功能裁剪移除 UTF16、JIT、DFA 执行等无关功能仅保留 VM 所需部分。这种深度耦合意味着第三方库的上游 CVE 是否影响 Erlang/OTP不能仅凭版本号是否在影响区间判断必须结合 Erlang/OTP 对源码的具体裁剪与修补——这正是 OpenVEX 声明中not_affected/justification存在的意义也解释了为何第三方声明必须针对Erlang/OTP 内置的那份源码逐一断言。Windows 二进制文件按 vulnerabilities.md 的说明目前 Erlang/OTP 的 Windows 二进制文件不纳入 OpenVEX 规范的报告范围。也就是说Windows 二进制形态的产物暂时没有对应的机器可读 VEX 声明。对于 Windows 部署可以推断更稳妥的做法是结合对应 OTP 版本号的otp-release.openvex.json源码级声明、官方发行说明以及 Windows 构建方式的差异例如第三方库的链接方式来综合评估而不要假设源码声明可直接平移给 Windows 二进制。安全团队与开发者的落地建议综合文档与仓库实现可将 VEX 机制用于以下实战场景接入扫描流水线按otp-release.openvex.json模式拉取当前所用 OTP 版本对应的声明文件解析statusaffected/fixed/not_affected与justification自动生成漏洞清单按应用版本制定升级计划第一方声明同时给出 release 与应用两个维度优先把受影响应用如ssh升级到声明中fixed指向的应用版本如ssh5.3.3即可在不等整个 release 的前提下消除漏洞警惕not_affected的边界该状态只对 Erlang/OTP 内置的第三方源码副本成立。凡是自建构建并链接外部库尤其是 OpenSSL的场景都必须把外部链接版本单独纳入自己的漏洞管理不能引用 Erlang/OTP 的声明充当安全背书核对 vendored 清单以仓库中各 vendor.info 记录的sha/versionInfo/purl为基准与扫描器如 OSV的 SHA1 区间报告交叉匹配快速确认某个第三方 CVE 是否落入内置副本的范围延伸审计资料仓库还提供 SBOM.md 等软件物料清单相关文档可与 VEX 声明配合形成完整的依赖清单 漏洞声明审计闭环。小结Erlang/OTP 的漏洞披露体系以 OpenVEX 为统一载体第一方声明用pkg:github/erlang/otpOTP-x.y与pkg:otp/appver双重寻址覆盖应用可独立升级的实际场景第三方声明以 commit SHA1 定位内置源码副本并严格限定于 vendored 代码明确排除构建期动态/静态链接的库。理解这两套声明的语义边界是准确评估自身 Erlang/OTP 部署安全状态、快速制定修复动作的前提。当前仓库中 vulnerabilities.md 为官方权威说明各 vendor.info 文件为可逐条核对的实证依据建议安全与运维团队将二者一并纳入日常审计。赞分享编程语言语言运行时标准库编译器并发编程【免费下载链接】otpErlang/OTP项目地址https://gitcode.com/gh_mirrors/ot/otp点击查看免费下载相关推荐Fleet 开源项目安全披露与漏洞治理实践从漏洞报告到 OpenVEX 追踪的完整指南Fleet 开源项目安全披露与漏洞治理实践从漏洞报告到 OpenVEX 追踪的完整指南 FleetOpen device management作为一款开源后端前端企业应用运维网络安全上一篇终极指南llm-attacks如何塑造AI安全研究的未来趋势与核心挑战下一篇推荐文章BCFtools - 高效的变异调用与VCF/BCF文件处理工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考