Skip to content

[Decision] secrets: should a read of a datasource's definition keep serving external.credentialsRef to every reader that can read the definition? (item 3 of #27818, the maintainer's) #27884

Open

Description

@objectstack-fleet

domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia

Ruled: 6522945866 · letter B · 2026-10-30T12:39Z
Ruling-ref: 6522945866

Filing gate: ③ maintainer decision split out of a card that is closing (security, rule level only).

From: #27818 item 3. Triage (6512259730) classed it as a security boundary and raised it with the maintainer directly. PR #27860 closes #27818's items 1 and 2, so this card keeps item 3 open. Rule-level text only; mechanism goes to the maintainer off GitHub.

The question

Today a read of a datasource's definition through the metadata read doors serves its external.credentialsRef to every caller that can read the definition. After #27762 and #27818 a reference can no longer be written through any non-system door unless it is the row's own. Should the read doors still serve it?

  • Option A, keep serving it. The GET → edit → PUT round trip keeps working unchanged, and the write doors hold the rule.
  • Option B, withhold it from readers below datasource administration (redacted the way the read decorations strip other server-held values). The save door then treats an omitted key as "keep the stored reference" for those callers.

Business reason

The reference is a handle to a stored secret. The write doors are now closed, so this is defence in depth: who needs to see it at all?

Reader: the maintainer. No seat acts on it until it carries a Ruled: line.

Links: #27722, #27762, #27818, #27582.

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 真挡得住的权限 | none | P②

    Triage: p1 · domain:server · area:auth · decision · 2026-10-30T02:58Z

    ⛔ Not a claim. This is the maintainer's decision on a security boundary, split from #27818 item 3. Rule-level text only.

    • Triage's lean, already given to the maintainer directly: B, withhold the reference from readers below datasource administration, with an omitted key read as "keep".
    • No seat acts on it until a Ruled: line appears.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    director#1 · os-bill · session_01Utp6CbQLcy8yg6vhJVXXi8

    Brief-claimed-by: session_01Utp6CbQLcy8yg6vhJVXXi8 · batch #430 · 2026-10-30T03:07Z

    Director seat, summon #54 continuation 1 (ledger objectstack#12708, opening mark 6493929869). Presented to the maintainer in batch #430 as item 1 of 2 — a security-boundary rule split from #27818 item 3; rule-level text only on GitHub, as the card and triage 6513852880 keep it.

    Seat increment (re-read at origin/main ded67bfb, 2026-10-30T03:07Z):

    Prior rulings read: credentialsRef, own-reference, read door, redaction → #27582, #27695, #27722, #27762, #27818; thread: 6513852880; repo: objectstack-ai/objectstack

  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    director#1 · os-bill · session_01Utp6CbQLcy8yg6vhJVXXi8

    Ruling: batch #430 item 1 · letter B · maintainer 「27884 B」 2026-10-30T12:33Z

    Director seat, summon #54 continuation 1 (ledger objectstack#12708, opening mark 6493929869, brief 6513971173). The maintainer answered in the summon chat, verbatim: 「27884 B」.

    What the ruling binds (letter B, rule level): a read of a datasource's definition through the metadata read doors withholds external.credentialsRef from callers below datasource administration, through the read path's existing per-type redaction seam (the one that already strips other server-held values); callers at datasource administration keep seeing it. The save door treats a key omitted by such a caller as "keep the stored reference", so the GET → edit → PUT round trip keeps working for them, and it still refuses any reference that is not the row's own (#27762 / #27818's rule, unchanged). Not taken: A (serving a secret handle to every reader of the definition after the write side was closed to them). Mechanism details stay off GitHub per the security discipline triage 6513852880 keeps; the dev receives them through the lane's channel.

    Governing text: #27582 / #27695 (a reference is a handle to a stored secret; own-reference rule), #27722, #27762, #27818 (write and restore doors), triage 6513852880. Premises re-read at origin/main ded67bfb (brief 6513971173).

    Workload of the letter: domain:server · 1 PR · S (one redaction arm, one save-door reading, two pins: a non-admin read lacks the key; a non-admin PUT without the key keeps the stored reference) · Clause-②: no (narrowing) of the served read shape for non-admin callers ⇒ one contract-review-tier review before the queue · Metadata-protocol: none.

    Execution: needs-user-decision → pm:queue in this act with triage's grade applied (domain:server, priority:p1, area:auth; security stays); the server lane dispatches with Ruling-ref: naming this comment.

    os-decision-facets
    ① 长远:写侧已关闭的值不被永远写不了它的人读回;复用既有脱敏缝,不加第二套机制
    ② 拉动:本周连续裁定的密钥硬化线(#27582 → #27722 → #27762 → #27818)的读侧收口
    ③ 防错:密钥把手是侦察信息,隐去是结构性的;「省略即保留」让编辑数据源的作者不会误清空引用
    ④ 不扩散:不加键不加门禁;一条脱敏臂加一条保存门读法

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions