Cosigner 安全模型

任何单一方都无法独自转移资金:Fystack 不行,你的宿主机不行,中间的任何环节也不行。

谁控制什么

你 Fystack
Cosigner 宿主机、存储、网络 Apex:配对、身份、吊销
存储密钥:密码或 KMS 策略 Orchestrator:会话
回调服务器、策略和密钥 Gateway:数据流认证和中继
备份、导出、升级 MPCium 节点和工作区策略

签名控制

每个签名都必须通过以下所有检查:

  1. Apex 中的 工作区策略 和审批组。
  2. 发起方签名:Orchestrator 只接受由 Apex 签名的请求。
  3. 委员会锁定:参与方和门限必须与密钥生成时一致。
  4. Orchestrator 签名:Cosigner 使用配对时锁定的密钥对其进行验证。
  5. 审批者签名:设有审批者的钱包必须提供。
  6. 你的回调:必须返回已签名的 approve。
  7. 门限:必须有你的 Cosigner 的分片参与。

即使 Fystack 被完全攻破,第 1 到 5 项可能失效,但第 6 项依然有效:它运行在你的基础设施上,使用 Fystack 从未见过的密钥,并针对待签名的原始字节进行检查。

身份认证

Cosigner 身份:Ed25519 密钥。存储在 state/cosigner.key(0600)。通过配对令牌向 Apex 注册一次。它用于签署 Gateway JWT、每个会话事件和对等消息,以及审计条目。

Cosigner → Fystack:每个数据流使用一个 EdDSA JWT。

Gateway JWT claims

{
  "iss": "<cosigner_id>",
  "sub": "<cosigner_id>",
  "aud": "cosigner-gateway",
  "ctx": "cosigner-gateway-auth-v1",
  "jti": "<random>",
  "iat": 1791794400,
  "exp": 1791794460
}

Gateway 只接受 EdDSA,会检查 audience 和过期时间(允许 30 秒偏差),并在 2 分钟内拒绝重复使用的 jti。吊销会立即断开正在运行的数据流。

Fystack → Cosigner:Orchestrator 密钥及其指纹在配对时锁定。每条控制消息都必须由该密钥签名,并带有递增的序列号。结果签名使用单独的前缀,因此无法被当作控制消息重放。

参与方 ↔ 参与方:对等方密钥通过已签名的 session_start 传递。使用已签名的 X25519 交换、按方向区分的 HKDF 密钥以及 ChaCha20-Poly1305。Gateway 和 Orchestrator 只能看到密文。

静态数据加密

密码或 AWS KMS 解封存储 KEK,HKDF 派生出四个作用域密钥,每一行均采用 AES-256-GCM 加密
Click to open the full-size diagram
  • 存储密钥:32 字节,启动时通过密码(Argon2id t=3,64 MiB)或 AWS KMS 解封。仅保存在内存中,使用后清零。
  • 作用域密钥:HKDF-SHA256 为 shares、preparams、checkpoints、metadata 分别派生独立的密钥。
  • 数据行:AES-256-GCM,随机 12 字节 nonce,与作用域和行键绑定。被移动的行将无法解密。
  • 明文分片不会外泄:会从事件中剥离。导出内容使用 RSA-OAEP + AES-GCM 或口令进行封装。

密码解锁:cosigner-cli 绝不会将密码放入环境变量或命令参数中。它会打开一个一次性的本地 socket;容器通过 HMAC 证明一个 32 字节令牌,然后接收经 AES-GCM 加密的密码。

运行时加固

  • 基于 distroless、非 root 运行的镜像,并按摘要锁定。
  • 只读根文件系统;/tmp 和 /run/cosigner 使用 tmpfs。
  • 移除所有 capability,启用 no-new-privileges。
  • 配置和密钥以只读方式挂载。
  • 限制:控制消息 128 KiB,每分钟 20 次启动和 10 次中止,5 个并发会话。

审计日志

仅追加的 JSONL。每个条目都经过签名并包含前一条目的哈希,因此任何修改和删除都可被检测到。请将其传输到宿主机之外保存。

供应链验证

二进制文件、安装程序和镜像均由 GitHub Actions 发布工作流构建,并使用 Sigstore 签名。证书中注明了确切的工作流和标签。运行时流水线还会执行 go mod verify、竞态测试、可复现性检查、govulncheck 和 gosec,并附带 SBOM 和来源证明。

cosigner-cli 会在每次执行 up、update 和 doctor 时进行验证。如需手动检查:

验证发布产物

cosign verify ghcr.io/fystack/cosigner@sha256:<digest> \
  --certificate-identity https://github.com/fystack/cosigner/.github/workflows/release.yml@refs/tags/<version> \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com

摘要和校验和:cosigner.fystack.io。如发现不匹配,请报告至 security@fystack.io。

剩余风险

  • 常规模式即宿主机托管。 拥有宿主机 root 或 Docker 权限的人可以读取内存。Nitro Enclave 支持(即将推出)将消除这一风险。
  • 回调质量。 不解码交易就批准的回调毫无意义。请默认拒绝。
  • 可用性。 恶意宿主机可以阻断流量,或删除、回滚数据行。加密能检测修改,但无法检测删除。请保留备份。
  • 重复运行。 切勿在两台宿主机上运行同一个 Cosigner。
  • 恢复材料。 备份密码和导出口令可以解锁你的分片。请将它们分开存放。

在投入真实资金之前:测试恢复、重启、故障和 IAM 吊销,并进行独立审查。