审计资料¶
本文是英文版的参考译文,更新于 10/11/2026。如有出入,以英文版为准。标识符、命令和代码块保持原文,不作翻译。
这是对 DCP-AI 进行独立安全审查的入口。它说明要审查什么、如何复现仓库中的证据,以及这些证据能说明什么、不涵盖什么。它不是规范,不是认证,也不是审计报告:仓库中没有独立外部审计的报告,也不为仓库之外完成的工作提供认证。
审查基准¶
- 源码基准:
main上的提交45ac32f07f004e858e11dcc23ff72c3e5c7762b8(05/11/2026,#123)。它包含制品中列出的所有修复,以及同日对 VERIFICATION.md 步骤 V2-10 和 DCP-09 §3.5.2 的澄清。 - 之后的提交: 授权书链的差分测试工具和五个 SDK 的 bundle 比较(#124)在基准之后加入,本资料也是如此。文档无法指明它自己的最终提交:请记录你审查的确切提交,并把本资料当作通往该提交的指引,而不是关于它的证据。
- 基准之外: 容器镜像、部署和运营方配置。
试点验证冻结版(MP-06)¶
此后续快照与上述审查基线分开记录。源码:7dd8293d6f6c3d328fc0ff3906978200e55139db(PR #138);树 de40444aa1fc1bafef6ab7cf3b772664427b43dc。这是面向限定范围试点的内部验证,不是外部审计、部署或新的注册表发布。dcp-jcs-v1 和现有默认值保持不变。
范围包括 TypeScript、Python、Go 和 Rust 的混合证据验证、对责任主体的显式信任、严格准入、可选启用的委托准入,以及独立的授权确认记录。WASM 通过已安装的浏览器 API 提供验证和基础能力;不支持授权链、准入或激活。Express 和 FastAPI 是可选适配器。操作授权、租户配置、撤销信息新鲜度、TLS 和密钥保管仍由应用或运营方负责。运行限制与可选演练说明了这一边界。
证据与制品身份¶
冻结修订的 CI中选定的任务全部通过。因路径过滤而跳过的 SDK 和集成任务,复用已通过的 MP-03 修订 df2df0de103777bb9e28cf70cc64d52f8df7d4b4 的证据;生产代码子树及相关构建、测试输入完全相同。这些是复用的运行结果,不是新执行。本地安装的制品另行测试,包括 Python sdist 和浏览器中的 WASM tarball。每个完整 SDK 均通过八个公开目录;WASM 只通过其支持的六个目录。组合、确认记录、字节入口的专项测试,最初的 F1–F4 与责任主体信任回归测试,以及提供方证据,都保留与实际测试对象的对应关系。未改动的 MP-05 HTTP 演练(200/200 步)予以复用。
下列制品是未发布的本地字节,即使内部版本号与现有发布相同。TS、Express 和 Python 制品来自 b3d41bd0;其准备清单记录的全部 256 个源文件都与冻结修订一致。Go、Rust 和 WASM 从冻结导出构建。不要用版本号相同的注册表包替代它们。
| 制品 | 本地版本 | SHA-256 |
|---|---|---|
Go module zip |
v2.13.0 |
a2e113c663b791c3b0908e135f2a1e2433ffea1301b1be2540a2fa3539c6ca41 |
Rust .crate |
2.13.0 |
192d58c182e9c115b5fa7e6af17dd790eaa37a68a4501e4985dc11ae5b157d39 |
@dcp-ai/wasm tarball |
2.1.3 |
501d24d7ae9a2923931edf4e9e8df902f353a87ff911906901f34b33d1ac052d |
@dcp-ai/sdk tarball |
2.3.0 |
1e4b27bb82c70ab327227f5bb029eb2b01b0cdc643aeec206327bdaf5a94dd9c |
@dcp-ai/express tarball |
2.1.0 |
bf2b6de539b9e3687ffd272c7015d9ff0a6288fdd65f86ce7662838b50ead969 |
Python wheel |
2.10.2 |
e20473aecf6f75ff6e01db4a9ce12bd33ef59000607b9cba47f197b4b2e8d317 |
Python sdist |
2.10.2 |
ad0e17c7850916777a5df379c6217e16eb1fcc82b2b465b53624c9eb985919fa |
Go 通过不含 replace 的本地文件代理消费;Rust 通过指向已解压 .crate 的路径依赖消费;npm 和 Python 通过已安装包消费。Go 验证使用已修补的 1.26.10 工具链,未改变模块或依赖。试点应保留确切制品、依赖清单、命令和报告:哈希可以识别字节,却不会让临时制品变得可下载。重新构建后必须检查并重新测试;尚未确认 WASM 字节的可复现性。公开复现以符合性套件和演练说明为起点,并明确修订及已安装包路径。本页概述内部证据,并不声称每个本地探针都是已发布的测试工具。
限制与发布前剩余工作¶
- 冻结的 Express tarball 缺少
LICENSE,分发前须包含许可证。本地 WASM 二进制包含构建缓存路径;发布前须重映射路径并审查重建字节。此处不将这两项作为发布版本下载提供。 - 依赖审查是带日期的快照,而非保证。Rust 的可选 OTLP 依赖图选择了受 RUSTSEC-2026-0190 和 RUSTSEC-2026-0386 影响的
anyhow/tokio版本;默认和 WASM 构建不选择这些 crate。本次冻结验证不覆盖 OTLP,使用前须另行修复相关依赖。 - CodeQL #58/#59 在符合性自测中仍未关闭;分诊发现的是固定语料的十六进制哈希插值,而非已经证明的远程生产攻击路径。Dependabot 未报告开放告警。secret scanning API 不可用;这是覆盖缺失,不代表零发现。
- 本资料此前的排除范围继续有效:尚未解决的规范矛盾、可选扩展、运营方基础设施和未经测试的环境,不会因本次冻结而成为受支持范围。有限测试不能证明不存在漏洞。
- 发布基线之后的变更前,仍需完成打包修复、新版本安排、从注册表安装的验证,并取得明确发布授权。镜像和部署需要各自验证。合并文档不会发布包。
注(09/11/2026)。 上述各项描述的是 MP-06 快照及其本地制品,它们保持不变。对于 09/11/2026 发布的版本,WASM 路径重映射、CLI 的
LICENSE和 OTLP 最低版本都已就位;参见09/11/2026 的发布。@dcp-ai/express2.1.0 没有重新发布。
09/11/2026 的发布¶
来源: main 上的 cdb7099b8b6dc2a78b54928250752fd0bbd9c770(PR #140),树 af69307b663381ce776ad3115f76fe82f225a789,即候选版本经审查的导出所对应的树。该提交的 CI 已通过,重新构建并发布 PyPI 和 crates.io 文件的发布工作流也已成功;这些运行是项目自身的检查,不是外部审计。由此发布了六个版本:npm 上的 @dcp-ai/sdk 2.4.0、@dcp-ai/wasm 2.2.0 和 @dcp-ai/cli 2.2.0,PyPI 上的 dcp-ai 2.11.0,crates.io 上的 Rust dcp-ai 2.14.0,以及 Go 模块 v2.14.0。这是内部验证之后的注册表发布,不是外部审计或认证。@dcp-ai/express 2.1.0 和其他 npm 适配器没有重新发布。
| 注册表 | 版本 | 标识符 |
|---|---|---|
npm @dcp-ai/sdk |
2.4.0 | sha512-4IsY/ctFqLf5vvOS6bWUdN63NCbMoi6N0qnAceYG8AINnqm7+cRyG5stO+P4ZM8ROM2uyhI09AlcQDhdJVhIeQ== |
npm @dcp-ai/wasm |
2.2.0 | sha512-eu9NiNXl99hCKz/xpUPteaZGF+ea0+WTQ/6mZu2RIkuP2eTMsym0Bbp7gTbqB1LaaGMGuRFYAjK8wSVIGt/AAA== |
npm @dcp-ai/cli |
2.2.0 | sha512-/UR5K7/PctZX8Do6CULz1ua1eEwt19Jo/Q/adkMq806uRjZ2gh10W0FnfrzJVJPjskadK/tma2aXisU+z1Hx7Q== |
PyPI dcp-ai |
2.11.0 | wheel 2e7776e1c3675f9f4a3c088d6115b728d6e33c72c69a2e624b1771ab9fa45f53,sdist 9d4a545376e2a9a0afa61b0845ef5bf992b9c92ac5390da95a35333327397da7(SHA-256) |
crates.io dcp-ai |
2.14.0 | 704028282d977973fc84e6fbaa495159e43ecec5951cf2f1b5ea9d3e70515424(校验和) |
Go 模块 sdks/go/v2 |
v2.14.0 | 标签 sdks/go/v2.14.0,提交 cdb7099b8b6dc2a78b54928250752fd0bbd9c770,h1:9O4n7vn3YqOhKlyUg/cm0OnouQi4QbU7mHbIh1BM5Z8= |
- 与测试过的制品一致。 npm tarball 就是发布前测试过的文件,
sha512完整性相同。PyPI 的 wheel 和 sdist 以及 crate 由发布工作流从main重新构建,包含与测试过的制品相同的源文件;Python 文件只在元数据上不同(Metadata-Version 2.5 和 hatchling 1.33.0,之前为 2.4 和 1.27.0,并重新计算了 RECORD),crate 增加了指向main的.cargo_vcs_info.json。代理提供的 Go 模块与测试过的模块具有相同的 106 个文件和相同的h1;只有 zip 压缩不同。 - 从注册表安装。 全新的使用方按名称和版本安装了每个包,没有使用
file:、路径依赖、replace、[patch]或 overrides:PyPI 的 wheel 和 sdist(sdist 由 pip 构建)、启用默认和otlpfeature 的 crate、与@dcp-ai/express2.1.0 一起安装的 npm SDK、CLI 和 WASM(解析到同一个@dcp-ai/sdk2.4.0),以及在启用校验和数据库的情况下用 Go 1.26.10 通过proxy.golang.org获取的 Go 模块。组合、确认、入口和 P-ED-1 检查、CLI 测试套件以及 WASM 检查的结果与在测试过的制品上相同。 - 发布验证。 RELEASE_VALIDATION.md 介绍了重复执行这一从注册表安装的过程、并针对已安装的包运行外部目录的工具,并记录了10/11/2026 在本地 macOS 和 GitHub Ubuntu 24.04 上完成的完整验证。这是项目自身的检查,不是外部审计。
- MP-06 冻结中的打包事项。 对于这些版本,WASM 二进制文件在构建时不含本地构建路径,并由发布门禁检查打包的文件;
@dcp-ai/cli包含LICENSE;Rust 的otlpfeature 要求anyhow1.0.103 和tokio1.53.3 或更高版本,默认和wasm构建都不选择它们。添加到integrations/express的LICENSE仅存在于仓库中:已发布的@dcp-ai/express2.1.0 tarball 中仍然没有。 - 未覆盖。 上述 MP-06 冻结以及已知限制和排除项中的排除项仍然适用,但此处已为这些版本关闭的打包和依赖事项除外:WASM 构建路径、CLI 的
LICENSE和 OTLP 最低版本。上述 MP-06 快照按记录时的样子保留。有限的检查不能证明不存在漏洞。
复现¶
在所审查提交的检出目录中,使用 Node 22、Python 3.10+、Go(sdks/go/go.mod 中的版本)和稳定版 Rust 工具链(WASM 还需要 wasm32-unknown-unknown 和 wasm-pack)。安装在有已提交锁文件的地方使用锁文件。Python SDK 没有锁文件:pip install -e ".[dev]" 会解析安装时可用的版本。
在基准提交上:
(cd sdks/typescript && npm ci && npm run build && npm test) && npm ci --ignore-scripts
npm run conformance
(cd sdks/python && pip install -e ".[dev]" && pytest)
(cd sdks/go && go test ./...)
(cd sdks/rust && cargo test --locked)
(cd sdks/wasm && npm ci && npm run build && npm test)
node tools/conformance/wrappers/build.mjs all
node tools/conformance-external.js --catalog evidence --assessment verdict --report /tmp/evidence-ts.json -- node tools/conformance/wrappers/ts-sdk.mjs --sdk sdks/typescript/dist/index.js
node tools/conformance-external.js --catalog delegation --report /tmp/delegation-ts.json -- node tools/conformance/wrappers/ts-sdk.mjs --sdk sdks/typescript/dist/index.js
仅自 #124 起(这些命令在基准中不存在):
node tools/difffuzz/run.mjs --sdks five --iterations 60 --report /tmp/difffuzz-five.json
node tools/difffuzz/run-mandates.mjs --iterations 120 --report /tmp/mandates.json
- 通过说明什么。 一次运行只说明这些用例在所运行的 argv 下通过。
- WASM。
sdks/wasm中的npm test只编译 TypeScript 层,并需要npm run build生成的pkg/dcp_ai_bg.wasm。 - 其他命令。 一致性工具包列出所有目录和包装器;差分测试工具给出它的上限。
- 参考运行。 CI 在
.github/workflows/ci.yml和difffuzz.yml中运行相同的测试套件。
记录你运行了什么¶
- 源码。 确切的提交(
git rev-parse HEAD),以及工作树是否与之不同(git status --porcelain;如不同,附git diff)。 - 工具链和制品。 工具链版本,以及所运行制品的版本和哈希:TypeScript
dist、构建的二进制文件、WASM 包,以及解析出的 Python 包(python -m pip freeze)。一致性工具包和差分测试工具会在报告中记录其中大部分。 - 报告。 连同哈希一起保存报告文件。
- 来源。 包装器在报告中声明的
implementation名称和版本是包装器自己的声明,不是经过认证的来源。证据是你所构建并运行之物的哈希。
审查什么¶
| 层 | 路径 | 通过不能证明什么 |
|---|---|---|
| 协议核心和配置文件 | spec/、schemas/;规范化 dcp-jcs-v1 |
规范性文本。dcp-jcs-v2 是实验性的、需显式启用,从不是默认值 |
| SDK 验证器 | sdks/typescript、sdks/python、sdks/go、sdks/rust、sdks/wasm |
已验证的 bundle 不等于委托人信任、准入或授权,它们是各自独立的 API(ADMISSION.md) |
| 一致性与差分工具 | tools/conformance、tools/difffuzz、tests/ |
测试基础设施,不属于协议 |
| 参考服务 | server/、services/(锚定、透明日志、撤销) |
部署选择,不具规范性;验证器不依赖它们即可工作 |
| 适配器和项目脚手架 | integrations/、packages/、Python SDK 中的 FastAPI 集成 |
可选;部分已发布版本受影响(SECURITY.md) |
| 运营方 | 密钥、信任锚、准入配置、服务令牌、部署 | 仓库对这些不作任何保证 |
要求与测试¶
| 领域 | 对应关系所在 |
|---|---|
| V2 验证,V2-1 至 V2-14 | V2 验证图及其模式边界 |
| 验证者策略,包括 V2-10 的澄清 | 验证者策略样例 |
| 结构规则 | 结构样例 |
准入与 strict-v1 |
准入图 |
| DCP-09 授权书链 | 委托图 |
| SDK 之间的一致 | 差分样例 |
| 算法 | tests/nist-kat:Ed25519 使用 RFC 8032 向量;ML-DSA-65 使用大小、往返、错误密钥和跨 SDK 测试,以及 204 个上下文为空的验证用例(NIST ACVP tc39 和 203 个 C2SP Wycheproof 用例,后者不是 NIST 来源),在四个 SDK 和 wasm32 上运行;ML-KEM-768 和 SLH-DSA-192f 使用 NIST ACVP 向量,并附源文件的 SHA-256。通过这些测试不等于密码模块的 NIST 验证 |
制品¶
以下三者是不同的东西,不要把其中一个当作另一个来读:
| 制品 | 版本 | 包含 |
|---|---|---|
| 所审查的源码 | 基准处的 main |
下列所有修复 |
| 已发布(09/11/2026) | @dcp-ai/sdk 2.4.0、@dcp-ai/wasm 2.2.0、@dcp-ai/cli 2.2.0、dcp-ai 2.11.0(PyPI)、Go v2.14.0、Rust dcp-ai 2.14.0 |
下列所有 SDK 变更,以及 P-ED-1 和显式启用的委托准入 API(09/11/2026 的发布) |
| 已发布(05/11/2026) | @dcp-ai/sdk 2.3.0、@dcp-ai/wasm 2.1.3、dcp-ai 2.10.2(PyPI)、Go v2.13.0、Rust dcp-ai 2.13.0 |
下列所有 SDK 更改 |
| 30/10/2026 准备(#114),从未发布,已被取代 | Go v2.12.0、Rust dcp-ai 2.12.0、@dcp-ai/wasm 2.1.2 |
#106(WASM)、#107、#112;不含 #103 和 #116 至 #119 |
| 此前发布(28/10/2026) | @dcp-ai/sdk 2.2.1、@dcp-ai/wasm 2.1.1、@dcp-ai/cli 2.1.1、dcp-ai 2.10.1(PyPI)、Go v2.11.1、Rust dcp-ai 2.11.1 |
26/10/2026 的验证器修复和 28/10/2026 的二级 SHA3-256 检查;不含下列任何修复 |
仅凭版本号无法确定制品。main 上的清单文件带有 09/11/2026 发布的版本号;30/10/2026 的候选版本针对较少的更改使用了 Go 和 Rust 2.12.0 以及 @dcp-ai/wasm 2.1.2,这些版本号不再使用。请使用下面的注册表标识符,或你所构建之物的哈希。对于 05/11/2026 的版本,npm tarball 就是发布前测试过的文件;PyPI 文件和 crate 是从 main 重新构建的,包含与测试过的制品相同的文件,唯一例外是 crate 的 .cargo_vcs_info.json,它指向 main。发布之后,于 05/11/2026 通过普通 TLS 再次读取了公开注册表:最新版本即上文所列,标识符如下:
| 注册表 | 版本 | 标识符 |
|---|---|---|
npm @dcp-ai/sdk |
2.3.0 | sha512-5IsrDMKE3NM8e5jVLFIaigNFHIni/aIzD9Q4zNYZu6sTLfsPk/zqRxi9ccjtGSTiaftTba3LD/1JA4Gi0uS1bw== |
npm @dcp-ai/wasm |
2.1.3 | sha512-ToL7ZE+8mEvKJCO5DXxJm+GS2nrQ2tInHYJn+cWqLWxT+eMss9ka9MVp30LNmopO+MTqgwBs1hmAy6TOI5wDIA== |
npm @dcp-ai/cli |
2.1.1 | sha512-Qmuq5FiT+TUW3nZ4HCp/DUXdF6JVYB6vaCmNZL/qK8EWiSpP5gzgesSwK0zzlOQL20SJJditRR0h5YIQ7gxIMw== |
PyPI dcp-ai |
2.10.2 | wheel 825de9d6dce5ec2737d38534e7c3d357edbded437912605a549cde75518f198b, sdist 6005f342a0a24bee331c30be2fb2bc89a1306a21de399051cd1cef3cc96297e4 (SHA-256) |
crates.io dcp-ai |
2.13.0 | 579f070ad23c531147ef91287d610c6dc317bef997e2791a24a5070a4c0c13a1 (checksum) |
Go module sdks/go/v2 |
v2.13.0 | tag sdks/go/v2.13.0, commit 46b142bd7e42601acd912f156bbfcd9f5204a4be (05/11/2026), h1:bRkqSUWHQ/qTywPmKWRdzg2bBWI0RG1ZZAlb6IafnyU= |
28/10/2026 版本之后的 SDK 更改(于 05/11/2026 发布):
| 更改 | 提交 | SDK | 发布 |
|---|---|---|---|
VerificationCache 的键和隔离(#103) |
e711179a |
TypeScript | 已发布,05/11/2026 |
WASM dualMerkleRoot 遵循 V2-11(#106) |
cac0a5f6 |
Rust(wasm 特性)、WASM |
已发布,05/11/2026(30/10/2026 已准备) |
VerifyPayloadHash 检查规范的带前缀哈希(#107) |
24e70d56 |
Go | 已发布,05/11/2026(30/10/2026 已准备) |
RawAuditEventV2 保留收到的审计条目(#112) |
6dc97d59 |
Go、Rust | 已发布,05/11/2026(30/10/2026 已准备) |
| 每个 V2 验证器内部的 V2-2 模式校验(#116) | 0ebd2849 |
TypeScript、Python、Go、Rust、WASM | 已发布,05/11/2026 |
| 统一的授权书有效性辅助函数(#117) | 614b1c56 |
TypeScript、Python、Go、Rust | 已发布,05/11/2026 |
| 统一的授权书链时间检查(#118) | 7619ff95 |
TypeScript、Python、Go、Rust | 已发布,05/11/2026 |
| 拒绝单个根授权书中重复的域(#119) | c154192f |
TypeScript、Python、Go、Rust | 已发布,05/11/2026 |
28/10/2026 版本之后的其他更改:
- 参考透明日志。 #120(
c59ce5ba)把 gossip 告警绑定到所见证日志的身份;#122(d45c5a7b)轮询运行时加入的对等节点。该服务不以软件包形式分发。 - 规范和一致性工具包。 #121(
0dcbd8dc)加入委托目录。#123(45ac32f0)加入 V2-10 和 DCP-09 §3.5.2 的澄清、策略目录 2.0 和委托目录 2.0.0;没有 SDK 更改。 - 注册表用户。 上表中的 SDK 更改随 05/11/2026 的版本到达用户;更早的版本保留此处列出的限制。透明日志、规范和一致性套件不属于这些软件包,需从仓库使用。
已知限制与排除项¶
- 审计记录。 AUDIT-v2.0-FINAL.md 是日期为 26/02/2026 的内部历史记录,附有当前的背景说明;它不是外部审计。
- 没有 HSM 提供者。 模拟的
HsmCryptoProvider已于 06/11/2026 从 TypeScript 源码中移除;没有任何 SDK 提供 HSM 提供者,参考服务器声明hsm_provider: false,dcp audit gaps始终把第 11 号缺口报告为未关闭(NIST_CONFORMITY.md)。 - 密钥恢复。 份额不使用混合 KEM 加密。
- 参考服务器。 它检查公告签名的结构,而不是签名本身(server/README.md)。
- WASM。 不提供授权书链验证。
- Rust。 缺少 A2A 的 AES-256-GCM 会话加密及其重放窗口(RUST_RELEASE.md)。
- 05/11/2026 之前发布的版本。 不包含制品中列出的更改。
- 09/11/2026 之前发布的版本。 不包含 P-ED-1(Python SDK 所用的官方 PyNaCl 构建原本就拒绝这些签名的情况除外),也不包含显式启用的委托准入 API。
- 差分和模糊测试活动。 它们是有限的,并非穷尽;契约
/4无法传给所有 SDK 的输入另行测量(差分测试工具)。 - 性能。 未检查任何速度要求;性能基准和有界工作负载的规模变化是在基准提交之后加入的、关于方法的本地测量;两者都不是审计结果。
- 未涵盖。 容器镜像、部署、服务令牌和运营方配置。
报告¶
请按照 SECURITY.md 的说明报告安全问题。其中列出联系方式、范围(包括有上限的本地资源耗尽复现)和奖励政策:奖励逐案决定,没有保证的或固定的金额。