NautilusTrader 安全策略与供应链安全实践:从漏洞报告到发布验证的完整指南
【免费下载链接】nautilus_traderProduction-grade Rust-native trading engine with deterministic event-driven architecture项目地址: https://gitcode.com/GitHub_Trending/na/nautilus_trader
本指南以 NautilusTrader 官方安全策略(SECURITY.md)为骨架,结合仓库内的安全架构文档(docs/developer_guide/security.md)与真实安全配置(deny.toml、security-audit.toml、scripts/security-audit.py),系统讲解该项目的漏洞报告流程、响应承诺、分层安全基础设施、依赖治理与供应链防线,并给出 Python 构件与 Docker 镜像的可复现验证命令。读完本文,你将掌握 NautilusTrader 的安全边界在哪里、漏洞如何上报与处置、发布物如何独立核验,以及各道安全防线在仓库中的具体落点。
安全策略适用范围与边界
NautilusTrader 将安全视为优先事项,并在开发与发布生命周期中应用分层控制:带签名与证言的发布、持续的漏洞管理、透明的开发实践。官方安全策略覆盖:
- NautilusTrader 开源软件及官方仓库;
- Nautech Systems 官方网站(nautilustrader.io)。
明确排除在范围之外的包括第三方服务、交易所和数据提供商——即交易引擎对外连接的券商/交易所适配层不在本项目安全承诺范围内,使用者需要自行评估其密钥管理与网络边界。
漏洞报告渠道与响应时间线
如何上报漏洞
官方推荐的首要途径是 GitHub Security Advisories(私有披露),在公开修复之前完成私密协调;上报者会出现在安全公告与发布说明的致谢名单中。备选途径为邮件联系安全团队,涉及敏感内容时可申请 PGP 密钥进行加密通信。
上报时建议包含四要素:
- 漏洞描述;
- 复现步骤;
- 受影响版本;
- 可行的修复建议(如有)。
响应时间线承诺
| 阶段 | 承诺时限 |
|---|---|
| 初始响应 | 收到报告后 48 小时内 |
| 状态更新 | 7 天内给出初步评估 |
| 修复时间 | 严重漏洞 30 天内修复;其余问题 90 天内 |
| 公开披露 | 与上报者协商确定披露日期(协调披露) |
责任披露原则与版本支持
项目鼓励负责任披露,要求上报者:在修复可用前不公开漏洞;仅以证明漏洞所需的最小程度利用问题;不访问未授权数据、不破坏系统;遵守适用法律。除非上报者要求匿名,否则项目会在安全公告与发布说明中致谢。
版本支持策略:仅支持最新版本。使用旧版本时,相关漏洞可能已在后续版本修复——因此生产环境应始终升级到最新发布。目前项目没有正式漏洞赏金计划,但对帮助提升安全性的贡献会在公告中致谢。
安全基础设施:贯穿生命周期的分层防线
SECURITY.md 将安全基础设施按生命周期分层描述,逐层都有仓库内的真实配置对应。
公开姿态
- OpenSSF Scorecard:仓库对外发布 Scorecard 结果(badge 与 API),并将 SARIF 上传到 GitHub code scanning,作为仓库健康度的自动化信号,与人工评审、安全审计互补。
源码与评审控制
- CODEOWNERS:关键基础设施文件、依赖清单与锁文件在合并前必须经 Core 团队评审;
- 分支与标签规则集:受保护分支要求签名提交且通过 CI 检查;
v*发布标签创建后不可变; - 源码来源限制:Rust 包仅允许来自 crates.io。此项在 deny.toml 的
[sources]段落实:unknown-registry = "deny"、unknown-git = "deny",allow-registry仅放行 crates.io 官方索引。
依赖引入控制
这是供应链安全的重点,对应仓库中多处配置:
- 版本固定与锁文件:Rust 依赖在
Cargo.lock中以带密码学校验和的形式固定;Python 依赖在python/uv.lock中以完整性哈希固定;禁止通配符版本要求。Cargo.toml中[workspace.metadata.cooldown] days = 3即 Rust 侧冷却期配置。 - 依赖冷却期:Python 依赖解析通过 python/pyproject.toml 中
[tool.uv] exclude-newer = "7 days"排除近 7 天发布的包;Rust crate 更新受 3 天冷却期与 cargo-vet 评审约束。安全修复或关键缺陷修复经显式评审后可绕过冷却期。这些窗口给社区时间检测并隔离被攻陷的发布。 - 仅 wheel 安装:
[tool.uv] no-build-package列表枚举了python/uv.lock中锁定的每一个第三方包,禁止uv从源码构建它们。正常情况 uv 偏好 wheel,该设置是空操作;一旦某个上游停止为目标平台发布 wheel,uv lock会直接失败而不是静默从 sdist 构建。本地工作区包有意缺席此列表,因为它必须由工作区自己的构建后端(maturin)构建。check-no-build-packagespre-commit 钩子保证该列表与python/uv.lock每次提交时保持同步。 - 工具链固定:
python/pyproject.toml限制本地 uv 使用受支持的 minor 系列(required-version = ">=0.12,<0.13");.nautilus-engineering/tools.toml固定 CI、Docker、pre-commit 与项目安装命令使用的精确 uv 版本,以及共享发布与审计工具版本;仓库内 tools.toml 保留 NautilusTrader 专属固定项(如 nightly 工具链、miri、pypi-attestations 版本)。 - 许可证合规:自动化检查将 Rust 依赖校验在兼容 NautilusTrader
LGPL-3.0-only许可证的允许清单内。见 deny.toml 的[licenses]段:allow列出 MIT、Apache-2.0、BSD、MPL-2.0 等约 20 种兼容许可证,并对libfuzzer-sys(NCSA)、implied-vol、dydx-proto等给出显式例外与 clarify 说明。
合并前与定期扫描
- Pre-commit 安全:Gitleaks 凭据筛查、私钥检测、Zizmor GitHub Actions 审计、Unicode 控制字符检测在变更落地前执行;
- 依赖审计:Rust 侧用 cargo-audit、cargo-deny、cargo-vet、OSV Scanner,Python 侧用 pip-audit,GitHub Actions 用 Zizmor。统一入口是 scripts/security-audit.py,由 security-audit.toml 声明策略(
cargo.audit、cargo.deny、cargo.vet、python、osv各段)。 - 供应链溯源:cargo-vet 通过导入 Bytecode Alliance、Google、Mozilla、Embark Studios 等组织的受信审计数据验证 Rust 依赖来源。
Cargo.toml中[workspace.metadata.vet] store = { path = '.supply-chain' }指定审计数据仓库。 - 模糊测试:cargo-fuzz 目标覆盖选定的适配器与签名表面,包括 Derive 线协议/签名内部与 Lighter 密码学/签名内部(对应
crates/adapters/derive/fuzz/、crates/adapters/lighter/fuzz/)。 - 代码扫描:CodeQL 静态分析覆盖 PR 到
master、推送到nightly及手动触发的 Python 与 Rust 代码;定期安全审计还在令牌权限允许时上传 Zizmor SARIF 结果。
构建与发布控制
- 构建完整性:Python 发布构件使用 SLSA 构建溯源证言;GitHub 发布提供校验和清单;GitHub Actions 固定到 commit SHA;容器镜像固定 digest、经 Sigstore cosign 签名,生成 SPDX SBOM 并附加 Sigstore 证言;CI 运行器启用加固配置(网络出口限制在显式允许清单内)。
- 发布时序:稳定版本先创建 draft GitHub release 并附加 wheel 与 sdist 资产,再发布到包索引(
packages.nautechsystems.io、PyPI、crates.io)。CI 校验注册表、附加最终校验和与溯源资产,随后发布 GitHub release 并核验其发布证言——GitHub release 与校验和清单成为下游注册表验证的锚点,同时兼容 GitHub release 不可变性。 - 部署环境隔离:发布与包发布任务使用作用域化的 GitHub deployment environments(
release、r2-develop、r2-nightly),发布凭据与 OIDC trusted-publisher 身份与测试、lint、纯构建任务隔离。 - 发布认证:PyPI 与 crates.io 上传使用绑定到
releaseGitHub Environment 的 Trusted Publishing(OIDC),消除长期 API 令牌;每次发布铸造仅作用于特定仓库、工作流与环境的短时令牌。GHCR 推送使用工作流运行作用域的GITHUB_TOKEN而非长期个人访问令牌。 - 发布后验证:CI 核验 PyPI wheel/sdist 与 GitHub release 清单及预期发布者身份一致;核验 crates.io 条目由本仓库 trusted-publish;记录每个 crate 是否匹配发布 commit 或早已发布;核验最终 GitHub release 证言;发布后核验容器镜像签名与 SBOM 证言绑定到预期的 GitHub Actions 工作流身份。
运行时密码学选型
TLS 与多数运行时密码学使用aws-lc-rs(AWS-LC 的 Rust 绑定),Ed25519 签名使用ed25519-dalek。Cargo.toml中对应声明为aws-lc-rs = { version = "1.18.1", default-features = false, features = ["non-fips"] }与ed25519-dalek = "3.0.0",注释明确:AWS-LC 运行在非 FIPS 模式,因为 FIPS 140-3 模块(aws-lc-fips-sys)需要 Go 工具链作为构建依赖。所用原语(AES-GCM、SHA-2、ECDSA、ChaCha20-Poly1305)在两种模式下完全相同,FIPS 模块额外提供联邦认证所需的运行时自检与模块边界强制。
已知漏洞管理流程
当传递依赖存在已知公告且暂无可用修复时,项目将风险评估、背景与缓解措施记录在审计配置中。被接受的风险按严重程度、作用域(直接 vs. 传递、运行时 vs. 开发期)分类,并持续监控上游修复。以 deny.toml 的[advisories] ignore与 osv-scanner.toml 的[[IgnoredVulns]]为例:paste(经 alloy 传递)、unic-*系列(经 pyo3-stub-gen,仅开发工具)、capnp(经 hypersync-client,等待上游修复)、quick-xml(经 DataFusion 对齐的 object_store 0.13.2)等均附带书面理由,而非无解释地静默忽略。
发现新漏洞时的处置路径:
- nightly 安全审计自动标记公告;
- Core 团队在 NautilusTrader 语境下评估严重性与暴露面;
- 直接依赖中的严重漏洞 30 天内修复或缓解;
- 通过发布说明与安全公告通知用户。
值得注意:安全扫描不受依赖冷却期延迟。公告要求更新包版本时,经评审的修复可绕过适用冷却期。从源码构建或扩展依赖的用户,需要自行审计其依赖树——本策略的控制仅适用于官方发布与规范仓库。
已处理的第三方公告示例
- 1.227.0:
urllib3解压炸弹防护绕过(部分解压后经HTTPResponse.drain_conn(),以及 Brotli 解压后的第二次read(amt=N)/stream(amt=N)调用),升级至 v2.7.0;urllib3经ProxyManager.connection_from_url创建的连接池在跨主机重定向时未剥离Retry.remove_headers_on_redirect列出的头,升级至 v2.7.0。
验证发布:Python 构件与 Docker 镜像的独立核验
Python 发布构件与 Docker 镜像经 Sigstore 工作流签名/证言;Cargo crate 通过 crates.io Trusted Publishing 发布。发布验证器记录每个 crate 版本是由当前发布 commit 发布,还是早已由本仓库更早的 trusted-publish commit 发布。紧急令牌恢复需要显式CRATES_IO_MANUAL_PUBLISH_EXCEPTIONS的crate@version条目,恢复的版本在crates-manifest.json中记录release_status: "manual_token_publish"。使用者可在安装前独立验证构件。
验证 Python wheels 与 sdist
GitHub releases 附带生成的校验和表、聚合SHA256SUMS文件、每个资产的.sha256文件,以及面向 Python wheel 与 sdist 的机器可读dist-manifest.json。安装前请对照其中之一核验下载的构件。
每个 Python 构件还附带.sigstoreSigstore bundle 与.intoto.jsonlDSSE envelope 兄弟文件。GitHub CLI 默认从 GitHub API 获取证言;使用--bundle <artifact>.sigstore可改为核验下载的 Sigstore bundle。
从 PyPI 或 GitHub release 下载后,用 GitHub CLI 核验每个构件。--cert-identity-regex与--cert-oidc-issuer标志将核验绑定到build.yml发布工作流,而不只是仓库本身:
ISSUER=https://token.actions.githubusercontent.com IDENTITY='^https://github\.com/nautechsystems/nautilus_trader/\.github/workflows/build\.yml@refs/heads/(master|nightly)$' # `gh attestation verify` 一次只接受一个 subject,因此对 wheel 循环处理 for whl in nautilus_trader-*.whl; do gh attestation verify "$whl" \ --repo nautechsystems/nautilus_trader \ --cert-identity-regex "$IDENTITY" \ --cert-oidc-issuer "$ISSUER" done gh attestation verify nautilus_trader-*.tar.gz \ --repo nautechsystems/nautilus_trader \ --cert-identity-regex "$IDENTITY" \ --cert-oidc-issuer "$ISSUER"验证 Docker 镜像
先把可变 tag 解析为不可变 digest,确保每次检查、随后的docker pull与docker run都基于同一镜像:
# 用 crane(或 `docker buildx imagetools inspect <ref> --format '{{.Manifest.Digest}}'`) DIGEST=$(crane digest ghcr.io/nautechsystems/nautilus_trader:latest) IMAGE=ghcr.io/nautechsystems/nautilus_trader@${DIGEST} ISSUER=https://token.actions.githubusercontent.com IDENTITY='^https://github\.com/nautechsystems/nautilus_trader/\.github/workflows/docker\.yml@refs/heads/(master|nightly)$'核验 cosign 签名,证明镜像由 NautilusTrader CI 工作流产生:
cosign verify "$IMAGE" \ --certificate-identity-regexp "$IDENTITY" \ --certificate-oidc-issuer "$ISSUER"核验 SPDX SBOM 证言绑定到同一镜像 digest:
cosign verify-attestation --type https://spdx.dev/Document/v2.3 "$IMAGE" \ --certificate-identity-regexp "$IDENTITY" \ --certificate-oidc-issuer "$ISSUER"GitHub CLI 也能核验 SBOM 证言,但它不检查 cosign 镜像签名,所以应在上述cosign verify之外附加使用:
gh attestation verify "oci://${IMAGE}" \ --repo nautechsystems/nautilus_trader \ --predicate-type https://spdx.dev/Document/v2.3 \ --cert-identity-regex "$IDENTITY" \ --cert-oidc-issuer "$ISSUER"源码级的防线实现:审计脚本与配置如何落地
统一的供应链审计入口
scripts/security-audit.py 是仓库供应链检查的 typed 本地策略执行器,提供validate、check-tools、run三个子命令,并以 security-audit.toml 为策略源。从源码看,它的关键设计:
- 严格模式化解析:所有字段白名单校验、路径必须位于仓库内、advisory ID 与版本号格式正则校验(
ADVISORY_ID、STABLE_VERSION等),防止策略配置本身成为注入面; - 工具版本强校验:
_prepare_context根据启用审计段自动收集所需工具(cargo-audit、cargo-deny、cargo-vet、pip-audit、uv、osv-scanner),并从.nautilus-engineering/tools.toml(或本地tools.toml)读取精确版本,逐一比对实际--version输出,杜绝工具漂移; - 审计执行:cargo-audit 逐锁文件运行(
Cargo.lock与 fuzz 子项目锁文件),cargo-deny 以--all-features --locked检查 advisories/licenses/sources/bans,cargo-vet 以--locked运行并指向.supply-chainstore;Python 侧经uv export导出带哈希的 requirements 后由 pip-audit--require-hashes审计;OSV 扫描三个锁文件。
依赖健康度的三道闸门
- deny.toml 的
[advisories]设unused-ignored-advisory = "deny"——忽略列表若与实际不再相关会直接报错,防止忽略项失控;[bans]设multiple-versions = "deny"与wildcards = "deny",并显式 allowlist 已知的上游传递重复版本(含原因与复核日期)。 - osv-scanner.toml 与 deny.toml 的忽略项保持同步,覆盖 lockfile 扫描器可能遗漏的条目(如 derivative)。
- 版本固定链完整贯穿:Rust 工具链由 rust-toolchain.toml(
channel = "1.98.0")锁定,nightly/miri 由 tools.toml 固定,Python 构建后端 maturin 在 python/pyproject.toml 中精确固定为maturin==1.15.0。
威胁模型与信任根(安全架构文档的补充视角)
docs/developer_guide/security.md 进一步明确了发布管线的防御对象:被攻陷的可变第三方 Actions(以 commit SHA 固定)、错误工作流/分支/环境的意外发布(OIDC 发布者绑定到nautilus_trader、build.yml与release环境)、长期注册表令牌失窃(Trusted Publishing)、注册表传播滞后(幂等且可重试的发布脚本)、注册表替换或上传漂移(对照发布清单核验)、静默手动 crate 恢复(显式例外并记录)。同时坦承不防御的范围:能改发布工作流并批准发布的恶意维护者、GitHub/PyPI/crates.io/Sigstore 整体沦陷、被攻陷的终端用户机器、交易所/券商/数据提供方/用户策略的运行时失陷,以及 wheel/sdist 的逐位可复现重建(当前承诺是溯源与摘要核验,而非可复现构建)。信任根包括受保护分支与不可变v*tag、GitHub Actions OIDC issuer、release环境、PyPI/crates.io Trusted Publishing、Sigstore(Fulcio/Rekor/TUF)与 GitHub release 不可变性。
给使用者的安全建议
- 始终使用最新版本,因为项目仅支持最新版本,旧版本可能带有已修复漏洞;
- 安装 Python 构件或拉取 Docker 镜像前,按上文命令核验校验和、Sigstore 签名与 SBOM 证言;
- 若从源码构建或自行扩展依赖,请自行审计依赖树——官方防线仅覆盖官方发布与规范仓库;
- 交易所、数据提供商等第三方服务不在官方安全承诺范围内,相关 API 密钥与网络边界需自行防护;
- 发现漏洞时走私有披露通道,附上描述、复现步骤、受影响版本与修复建议,等待 48 小时初始响应即可获得安全团队的跟进。
【免费下载链接】nautilus_traderProduction-grade Rust-native trading engine with deterministic event-driven architecture项目地址: https://gitcode.com/GitHub_Trending/na/nautilus_trader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考