WARDEN-WP-0026 T03: masking display filter (defense-in-depth)
- warden/mask.py: fingerprint()/mask_value() — presence, length, 8-char sha256 prefix; never the value. - proxy.proxy_fetch_fingerprint + `warden access --fingerprint`: masked status view (presence/length/hash) that emits no value, so it bypasses the T02 stdout guard. Lets two parties compare sha256 prefixes to confirm a shared value without seeing it (e.g. rotation landed). - documented as defense-in-depth (raw bao bypasses it) in OperatorAccessAssist.md and the module docstring. - tests: tests/test_mask.py + CLI fingerprint test. 299 pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
04c8b2ab1d
commit
fc0f18aa5c
7 changed files with 150 additions and 3 deletions
|
|
@ -301,6 +301,22 @@ def proxy_fetch_wrapped(resolved: ResolvedFetch) -> str:
|
|||
return str(token)
|
||||
|
||||
|
||||
def proxy_fetch_fingerprint(resolved: ResolvedFetch):
|
||||
"""Fetch the value and return a masked fingerprint — never the value (T03).
|
||||
|
||||
Defense-in-depth status view: lets an operator confirm presence/length and
|
||||
compare a short non-reversible hash without disclosing the secret. The value
|
||||
transits warden's memory only to be hashed, and is scrubbed immediately.
|
||||
"""
|
||||
from warden.mask import fingerprint
|
||||
|
||||
value = _capture_value(resolved)
|
||||
try:
|
||||
return fingerprint(value)
|
||||
finally:
|
||||
value = "" # noqa: F841 — best-effort scrub
|
||||
|
||||
|
||||
def proxy_exec(resolved: ResolvedFetch, *, env_var: str, child_argv: List[str]) -> int:
|
||||
"""Fetch the value and inject it into a child command's environment only.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue