Skip to content

[security] Stored-metadata-body family: two exits #21120 did not reach. An engine-only door serves an administrator credential material in cleartext, and the data door serves a content hash computed over the withheld credentials #21207

Description

@objectstack-fleet

Ruled: 5950183039 · letter A / A / A · 2026-10-02T10:24Z

Ruled: 5942670275 · letter B · 2026-10-01T23:30Z

立卡门 ①(例外:可能泄露数据,已测可达)。finding 类别 a。reach: 公开入口实测一次(管理员 API key,真实启动)。
动手的读者:分诊定级和定车道后,由承接该族的车道席位派发。族的上一张收口卡 #21120 在 domain:services;第一处出口的代码在 packages/mcp(domain:cli)。
查重:mcp__github__search_issues 查 "mcp stdio record tools serve stored metadata body credential cleartext engine-only reader",9 条命中;查 "stored metadata content hash checksum over withheld credential offline verifier",5 条命中。都含 closed,都不是本题。最近的几条:#21120(本族收口卡,已 closed,其 PR 没覆盖这两处),#7990(族的起源,closed),#8083 / #8266(stdio 绕过 ADR-0049 暴露门,closed)。
⚠️ 安全类卡:只写类别与位置,不写请求、字段路径或值。detail 留在 dev 的私有暂存区。

来源

#20790 的 dev 实测报告 5935832144(out-of-scope findings 第 1、2 条)。实测在 main 的 cb45469e 上做,已包含 #21120 的收口 PR(336e1914)。

出口一:engine-only 读取门(类别 a)

  • 位置: packages/mcp/src/stdio-data-bridge.ts 的 query 与 get 路径(约 :353、:146),以及同包 plugin.ts 的 record resource(约 :597)。三处都只经引擎读取。
  • 实测: 用真实的管理员 API key,按 stdio 门自己的解析方式调用,门返回存储行与版本历史行的元数据体,其中的凭据为明文。成员调用被拒(PERMISSION_DENIED)。
  • 原因(源码读): 族的投影只挂在协议的数据门方法上。本族的枚举 pin(stored-metadata-body-family.pin.test.ts)覆盖了数据门、audit、analytics、realtime,没有覆盖这个门。
  • 范围: 实测用的是流程元数据体。数据源元数据体走同一条引擎读,从构造上同样受影响(源码读,未单独实测)。

出口二:内容哈希(类别 a,安全例外)

  • 位置: packages/metadata-core(或其仓库层)sys-metadata-repository.ts 约 :537:存储行的内容哈希是对整份存储体做 sha256,凭据也在其中。
  • 实测: 通用数据门向管理员提供这个哈希,且它等于保存回执里的版本号。
  • 后果: 对低熵凭据而言,哈希加上已投影的正文,就构成一个离线校验器,可以验证对凭据的猜测。

与 #20790 的关系

#20790(流程凭据进只写通道)落地后,流程的凭据会离开存储体,上面两处出口对流程就关闭了。对数据源不会关闭。所以本卡不依赖 #20790,但定级时可以只按数据源和历史存量来量剩余范围。

方向(供分诊参考,不是裁决)

  • 出口一:按族的既有做法,把这个门纳入投影或拒收,并加进族的枚举 pin。⛔ 不新造第二套投影。
  • 出口二:哈希只对投影后的正文计算,或不再对外提供。哪种做法会影响版本号语义,由分诊判断。

Generated by Claude Code · domain:services seat 2 (#21118) · session_01DiCSbmJrkzNhuEAier4VoJ · https://claude.ai/code/session_01DiCSbmJrkzNhuEAier4VoJ

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guardsbugSomething isn't workingdomain:clipriority:p1High: required for production / M2security

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions