Skip to content

fix(config): the rotation watcher now fingerprints SOAP body_secret_value_<i> (BACKLOG #1009) - #246

Open
wshallwshall wants to merge 2 commits into
mainfrom
fix-1009-soap-secret-fp
Open

fix(config): the rotation watcher now fingerprints SOAP body_secret_value_<i> (BACKLOG #1009)#246
wshallwshall wants to merge 2 commits into
mainfrom
fix-1009-soap-secret-fp

Conversation

@wshallwshall

Copy link
Copy Markdown
Collaborator

Fixes BACKLOG #1009. config/wiring.py.

SOAP body_secret_value_<i> settings were not recognised by _is_secret_setting, so the rotation
watcher did not fingerprint them -- a rotated SOAP body secret would not be detected as changed.
They are now fingerprinted like every other secret setting.

Verified in-lane: plan -> build -> 3-lens adversarial verify -> remediate. Banner gate OK.

…_value class (BACKLOG #1009)

connector_secret_env_values, the ASVS 13.3.4 runtime rotation fingerprinter,
filtered connector settings on bare _SECRET_SETTING_KEYS membership. The SOAP
body_secret_value_<i> settings reach secrecy only through the prefix branch of
_is_secret_setting, so they fell through the filter: a rotation of a SOAP injected
body secret would not be fingerprinted on first deployment, while every sibling
connector credential is tracked.

Fix (config/wiring.py): filter through _is_secret_setting, not the bare frozenset,
so the prefix-only body_secret_value_<i> class is covered. The change is additive --
body_secret_value_<i> is not in _NON_ROTATABLE_SECRET_SETTING_KEYS and each is a bare
EnvRef the isinstance guard already accepts -- so it enrols the class and moves
nothing else.

Reverse gate (tests/test_secret_rotation_inventory.py): the forward gate
(test_secret_setting_keys_are_registered) proves every _SECRET_SETTING_KEYS member is
registered but is blind to the other direction -- a registered connector secret that
does not resolve through the fingerprinter. body_secret_value entered CRITICAL_SECRETS
by hand without passing through _SECRET_SETTING_KEYS, exactly the direction the old
comment wrongly promised "can never disagree". The new
test_registered_connector_secrets_are_reachable_by_the_fingerprinter builds a probe
outbound per registered connector secret and asserts its env key is returned, so a
future hand-added registry entry cannot silently fall through again.

Regression test (tests/test_secret_rotation_watcher.py): a real Soap(body_secrets=...)
outbound exercising factory -> _hoist_body_secrets -> body_secret_value_0 -> fingerprint
end to end. It fails on the pre-fix predicate and passes after.

Deliberately out of scope, flagged for a separate follow-up item: the JWS signing-key
passphrase is emitted as the connector setting sign_private_key_password
(transports/signing.py), which is in neither _SECRET_SETTING_KEYS nor _is_secret_setting,
so it falls through the same way. CRITICAL_SECRETS registers it under the SigningConfig
field names private_key / private_key_password instead of the emitted sign_-prefixed
names. That is a separate redaction-plus-fingerprint gap, not folded into this
one-predicate fix; private_key_password is excused in the reverse gate with that reason.

ASVS 13.3.4 stays partial. Cites ADR 0015 for the body-secret class (the wiring
citation to an internal-ledger #236 does not resolve in public docs/BACKLOG.md).
The body_secret_value rotation-fingerprint fix landed (config/wiring.py filters
through _is_secret_setting, plus the reverse gate and the SOAP regression test),
so #1009's banner flips from not-started to built.

Banner line only. The ranked table, the four census distribution lines, and every
other item's banner are untouched. The census was NOT recomputed.
@wshallwshall
wshallwshall enabled auto-merge (squash) August 6, 2026 14:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant