Skip to content

[security] datasource credential in a nested config position is served in cleartext on read — redaction is top-level-key-only #13405

Description

@baozhoutao

Existence (reproduction withheld pending maintainer)

A datasource credential placed in a nested config position (not the top-level credential key) is accepted at the runtime admin door and then served in cleartext through the datasource read doors (GET /api/v1/datasources/:name and GET /api/v1/meta/datasource), with hasSecret:false / redactedConfigKeys:[]. The equivalent credential at the top-level key is correctly refused at publish and redacted on read — so the redactor is top-level-key-only and does not descend into nested config objects. Observed across all three replicas of a live multi-node deployment; the meta-registry entry propagates cluster-wide at create time.

Per the maintainer disclosure ruling (2026-08-18, #9387) and RUNNER protocol rule 2's carve-out, the reproduction, the exact nested position, and the request bodies are NOT published here or anywhere on GitHub. They are held in the QA runner session and available to the maintainer directly. Existence published, recipe withheld, is a complete and actionable report.

Why this is distinct from prior art

Verification

Independently reproduced twice by two separate QA agents (original run + a dedicated rule-7 verify-pass), each from its own fixtures, with the top-level position as the negative control (correctly refused). No cross-tenant read was involved — the exposure is on the authoring tenant's own read path. All planted secrets were scrubbed after each run (verified absent from every door on every replica).

Suggested direction

Make the read-side redactor (and the publish-time inline-credential refusal) recurse into nested config objects, so the nested position is treated identically to the top-level key it mirrors. A second-order cleanup gap was also seen: datasource DELETE clears the admin/detail-door registry but does not evict the /api/v1/meta/datasource in-memory metadata registry cluster-wide (create broadcasts, delete does not mirror), which prolonged the exposure until the entry was scrubbed.

QA-source: #13404 · integration-system.datasource-credential-refusal-matrix · clauses 1,3

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions