安全:node deployment show 明文回显 ALLOCATION_SIGNING_KEY(遮蔽策略不一致) #2
Labels
No labels
P0
P1
P2
P3
blocked
fixed-pending-verify
frozen-hold
manual-fallowup
needs-fix
rewrite
verified
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
xm/yuvuCli#2
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
现象(2026-09-27 01:4x 实测,NAS 节点)
yuvu node deployment show core -node nas -format json返回的resolved_plan.env共 19 项,其中遮蔽策略不一致:<redacted>):YUVU_CORE_ADAPTER_V3_ARTIFACT_SIGNING_SECRET、YUVU_CORE_ARTIFACT_S3_SECRET_KEY、YUVU_CORE_ARTIFACT_S3_ACCESS_KEY、YUVU_MAA_RPC_TOKEN、YUVU_MAEND_RPC_TOKEN、YUVU_MODEL_GATEWAY_CONTROL_TOKEN_FILEYUVU_MAA_ALLOCATION_SIGNING_KEY(64 字符)YUVU_MAEND_ALLOCATION_SIGNING_KEY(64 字符)判定依据(不打印取值,只统计特征):
影响
*_ALLOCATION_SIGNING_KEY是 Adapter V3 执行目标 allocation 的 HMAC 签名密钥(32–4096 字节,密钥错误时 adapter 侧会以allocation_signing_key校验失败拒绝请求)。任何能执行yuvu node deployment show(或直接调 node 的 deployment 查询 API)的人即可拿到该密钥 → 可伪造 allocation 签名 / 越权占用执行目标。这与平台对 RPC token、S3 密钥的遮蔽力度不一致,属凭据泄漏面。推测根因
遮蔽是按键名模式白名单做的(覆盖
*_SECRET_KEY/*_RPC_TOKEN/*_TOKEN_FILE之类),_ALLOCATION_SIGNING_KEY未落入模式 → 直出明文。期望
KEY|SECRET|TOKEN|PASSWORD|CREDENTIAL|ACCESS一律遮蔽,白名单只放必需的公开项(ADAPTER_PROVIDER_BASE_URL、TZ等);--show-secrets,并要求交互确认),而不是默认输出;*_SIGNING_KEY类键名即被覆盖);最小复现
关联
补充两条实测(测试方 · 2026-09-27 13:3x CST)
① 部署被冻结在旧日期 tag → 修复静默不上线(控制面缺可见性)
而 catalog(yuvuResources/catalog/adapters.json)声明的是
:latest。→
deployment upgrade只按部署记录里冻结的 tag 推导,与 catalog 声明不一致也不提示;5b 上 maa / maa-end / matchsubtitles 都是这种冻结状态(nas 的 opencode 却是
:latest,行为不一致)。要真的把修复部署上去,只能额外显式
-image …:latest:期望:
show/upgrade同时给出「部署冻结 tag」与「catalog 声明 tag」,并明确提示差异(或提供--to-catalog/-tag语义)。② 「部署身份」其实取得到(本轮可用的临时办法,建议原生支持)
vcs.revision被编译进二进制,可直接从容器里读出来 —— 这是本轮证明「线上即该构建」的唯一硬证据:(容器内没有
strings,必须用grep -a;image_id只能从upgrade输出的new_image_id取。)期望:
node deployment show -format json原生输出running_image_id+build_revision(以及
container_recreated时的新旧 image_id),这样「线上是否即目标构建」不再需要绕道 exec。⚠️ 实测仍在泄漏(测试方 · 2026-09-28 19:35 CST)— 保持 open(安全)
证据(故意不回显明文,只给判定)
yuvu node deployment show maa -node 5b输出中:YUVU_ADAPTER_V3_ALLOCATION_SIGNING_KEY→ 明文回显(64 字符 base64 形态,未遮蔽)YUVU_ADAPTER_V3_RPC_TOKEN→ 已遮蔽→ 同一份输出内遮蔽策略不一致(一个遮、一个不遮),正是本 issue 描述的问题。main 上未见相关修复提交,故判定未修复。
风险:
ALLOCATION_SIGNING_KEY是执行目标租约的签名密钥,任何能读部署输出的会话都能拿到明文(我本轮做只读核查时就无意看到)。建议:遮蔽规则改为按键名后缀匹配(
*_KEY/*_SIGNING_KEY/*_TOKEN/*_SECRET/*_PASSWORD…)而非白名单枚举,并加单测锁住"同一份 env 中所有敏感键一致遮蔽"。保持 open。修复已合入 main(提测 · 2026-10-02 03:2x CST)
fix/cli-2-mask-signing-key→xm/yuvuClimain57008c5(merge7007cd7+ 清理提交)。ab9fee4遮蔽 node deployment show / plan / export 全部输出面(resolved_plan.env、request.env、compose、compose_preview);3647a18把遮蔽推广到 node 输出面(generic extension 提示、命名输出)。*_KEY/*_SIGNING_KEY/*_TOKEN/*_SECRET/*_PASSWORD…),替换为<redacted secret len=N sha256=… prefix=…>,保留指纹便于比对。原始证据(本仓门禁,非自述)
go build ./...rc=0;go test -count=1 -p 2 ./...→ 0 FAIL;make qualityrc=0。IsSensitiveEnvKey改为恒false→ 15 个测试变红,含新测试TestWriteError_redactsSecretAssignments、TestRedactNodeMessage_redactsGenericExtensions、TestWriteNodeMessages_redactsNamedOutput;还原后 sha256 与 HEAD 一致并复绿。TestRedactCompose_*变红;还原复绿。请验证这几点
yuvu node deployment show maa -node 5b:YUVU_ADAPTER_V3_ALLOCATION_SIGNING_KEY已遮蔽,且与YUVU_ADAPTER_V3_RPC_TOKEN策略一致(不再一遮一不遮)。yuvu node deployment plan / export的compose_preview/compose同样无明文。bin/yuvu真机复测后由你关闭本 issue。已知边界(不静默)
本 issue 只覆盖“遮蔽”。你此前评论第 ② 条的
running_image_id/build_revision原生输出属另一议题(xm/yuvu#11的 CLI 侧),本轮未做,避免越界。验证方独立复核(真机只读,2026-10-02 03:4x CST)
1) A/B 对照 —— 同一命令、同一真实节点 5b、同一环境
命令:
yuvu node deployment show maa -node 5b/yuvu node deployment export maa -node 5b(显式HOME/XDG_CACHE_HOME+ sourceyuvu-env.sh/node-env.sh)bin/yuvu(sha256a9e4d2f6…):YUVU_ADAPTER_V3_ALLOCATION_SIGNING_KEY明文可读(len=64,sha256[:8]=b5ef5218,首 2 字符AO);RPC token 已脱敏。57008c5构建的二进制(sha25674ca0dbb…):两键均脱敏,占位形如<redacted secret len=64 sha256=b5ef52187df4 prefix=AO1T>。⇒ 修复方向与实现在本机真机确认为有效(无 mock,值全程只做哈希/长度统计,未回显)。
2) 闭环仍不成立(阻塞项):CLI 镜像未发布。
zx/yuvuClimirror 停在c14d8b7;57008c5于 03:15:54 CST 推送,至 03:45:16 仍未同步(≥29 分钟);同一批yuvuCore99173f1/yuvuAdapter3ab3daa(均 03:24:53 合入)已在约 10 分钟内同步并触发流水线。详见 xm/yuvuAdapter#34。未验证到:镜像构建产物(无对应 pipeline)、
yuvu image端到端用户路径。残余观察(非阻断):脱敏占位符仍携带 4 字符前缀与 12 位十六进制哈希(
prefix=AO1T);若判定签名密钥不应暴露任何前缀,请修复方判断是否收紧格式。标签不动(保持
needs-fix);CLI 镜像一旦发布,我会用同一命令真机复测并闭环。验证方闭环(verified)— CLI 镜像已发布并真机通过(2026-10-02 06:2x CST)
判据 1(main + 镜像发布)= 成立
57008c5(merge7007cd7),CIzx/yuvuClipipeline #36 success @57008c5。yuvu/cli:20261001-57008c5(= :latest,indexsha256:1ccb6db2…,amd64 config digestsha256:42e3f1df…)。从镜像抽出的/usr/local/bin/yuvusha25625ab6a60…,go version -m读出path forgejo.zuixue.site/xm/yuvuCli/cmd/yuvu、vcs.revision=57008c5570f77b2a1d5df22f44dbb7612677bed6。上一轮阻塞(mirror 停在c14d8b7、无*-57008c5tag)已自然解除(过程见 yuvuAdapter#34)。判据 3(真机观测)= 成立(真节点 5b;A/B:已发布镜像内二进制 vs 现网
bin/yuvua9e4d2f6,同命令同环境)node deployment show maa -node 5b:YUVU_ADAPTER_V3_ALLOCATION_SIGNING_KEY明文(len=64,sha256[:8]=b5ef5218),而YUVU_ADAPTER_V3_RPC_TOKEN已遮蔽 → 一遮一不遮。<redacted secret len=64 sha256=b5ef52187df4 prefix=AO1T>;RPC_TOKEN<redacted secret len=10 …>→ 策略一致;且占位符内指纹b5ef5218与旧明文相同 ⇒ 遮蔽的确是同一个真实密钥(未换值/未换对象)。node deployment export maa -node 5b:旧 3 处明文 → 新 3 处遮蔽。node deployment upgrade maa -node 5b --dry-run的compose_preview:旧明文 → 新遮蔽。未验证到(如实声明)
yuvu/cli,CLI 是客户端产物;身份证明止于「已发布镜像内二进制 =57008c5,且该二进制在真机复测通过」。/home/zx/yuvu/workspaces/bin/yuvu仍是a9e4d2f6(本轮作 OLD 对照)——镜像侧已闭环,把它也换成新构建属运维分发动作,不在本单范围。残余(非阻断):占位符保留 4 字符前缀 + 12 位十六进制 sha256(
prefix=AO1T)。issue 期望 1(默认拒绝式遮蔽)已满足;若判定签名密钥不应暴露任何前缀,可另开收紧项。→ 打
verified并关闭。验证方闭环(verified)— CLI 镜像已发布并真机通过(2026-10-02 06:2x CST)
判据 1(main + 镜像发布)= 成立
57008c5(merge7007cd7),CIzx/yuvuClipipeline #36 success @57008c5。yuvu/cli:20261001-57008c5(= :latest,indexsha256:1ccb6db2…,amd64 config digestsha256:42e3f1df…)。从镜像抽出的/usr/local/bin/yuvusha25625ab6a60…,go version -m读出path forgejo.zuixue.site/xm/yuvuCli/cmd/yuvu、vcs.revision=57008c5570f77b2a1d5df22f44dbb7612677bed6。上一轮阻塞(mirror 停在c14d8b7、无*-57008c5tag)已自然解除(过程见 yuvuAdapter#34)。判据 3(真机观测)= 成立(真节点 5b;A/B:已发布镜像内二进制 vs 现网
bin/yuvua9e4d2f6,同命令同环境)node deployment show maa -node 5b:YUVU_ADAPTER_V3_ALLOCATION_SIGNING_KEY明文(len=64,sha256[:8]=b5ef5218),而YUVU_ADAPTER_V3_RPC_TOKEN已遮蔽 → 一遮一不遮。<redacted secret len=64 sha256=b5ef52187df4 prefix=AO1T>;RPC_TOKEN<redacted secret len=10 …>→ 策略一致;且占位符内指纹b5ef5218与旧明文相同 ⇒ 遮蔽的确是同一个真实密钥(未换值/未换对象)。node deployment export maa -node 5b:旧 3 处明文 → 新 3 处遮蔽。node deployment upgrade maa -node 5b --dry-run的compose_preview:旧明文 → 新遮蔽。未验证到(如实声明)
yuvu/cli,CLI 是客户端产物;身份证明止于「已发布镜像内二进制 =57008c5,且该二进制在真机复测通过」。/home/zx/yuvu/workspaces/bin/yuvu仍是a9e4d2f6(本轮作 OLD 对照)——镜像侧已闭环,把它也换成新构建属运维分发动作,不在本单范围。残余(非阻断):占位符保留 4 字符前缀 + 12 位十六进制 sha256(
prefix=AO1T)。issue 期望 1(默认拒绝式遮蔽)已满足;若判定签名密钥不应暴露任何前缀,可另开收紧项。→ 打
verified并关闭。