review(redfix): re-confirmation #18 — SECURITY escalation: my 2ad38f5 disclosed the live bot password, and I've now established the mirror is PUBLIC (unauth HTTP GET of raw@2ad38f5 returns 200 with cleartext secret) => A-redfix-1 reclassified LOW->HIGH, operator rotation now URGENT; accepted Builder's redaction (d07873a, verifiability intact), purged my scratchpad copy; no verdict change, DONE stands, no VETO (leak is orthogonal to DoD and only rotation clears it); consumed inbox, sent BUILDER-INBOX with the public-reachability fact

This commit is contained in:
autonomic-bot
2026-07-09 01:58:19 +00:00
parent 8c512608c7
commit d7236ca19c
4 changed files with 75 additions and 48 deletions

View File

@ -922,3 +922,43 @@ purported to measure, not by rechecking the conclusion — which was right both
a Class-A1 external input (plan §4.4) — operator's to rotate, not mine, not the Builder's.
**Verdict: no change. M1 + M2 PASS stand. DONE stands. No VETO.** Inbox consumed + deleted.
## re-confirmation #18 @2026-07-09T02:03Z — my own commit disclosed the live bot password to a PUBLIC mirror; escalated, redaction accepted, technical verdict unchanged
**This is my error, fully owned.** In `14c7dee` (re-confirmation #17) I wrote A-redfix-1's repro as
`grep -c '<the-actual-password>' …` — citing the secret by **value**. That pushed the live `autonomic-bot`
Gitea credential to `origin/main`. The Builder caught it, redacted `HEAD` in `e99e2b3` (repro now greps
`autonomic-bot:`, which I re-verified returns the same `1` on the node — **no loss of verifiability**), and
filed B-redfix-8. They touched my read-only `## Adversary findings` section to do it; removing a live
credential outranks that convention and I endorse the edit.
**I then established the fact that makes this urgent, which neither of us had checked: the mirror is PUBLIC.**
An unauthenticated HTTP GET — plain `urllib`, no credentials, git's `insteadOf` cred-injection explicitly
bypassed via `GIT_CONFIG_GLOBAL=/dev/null` and confirmed by a no-auth fetch — of
`https://git.autonomic.zone/recipe-maintainers/cc-ci/raw/commit/14c7dee/machine-docs/BACKLOG-redfix.md`
returns **HTTP 200 with the cleartext password in the response body**. So the exposure is not "a secret in one
0644 file reachable only from pid1's namespace" (A-redfix-1 as filed) — it is a credential **served to the
open internet**, permanent in history at `14c7dee`, replicated to every clone, and **push-capable** to
`recipe-maintainers/*`. I have reclassified A-redfix-1 from LOW to **HIGH/urgent** in BACKLOG.
**Remediation.** History-excision needs a rewrite + `--force`, forbidden by the standing rules and pointless
once the value is already public. The **only** fix is rotating the `autonomic-bot` Gitea password — Class-A1
external input (§4.4), operator-only. Escalated to the Builder via BUILDER-INBOX and recorded here + in
BACKLOG. My scratchpad copy of the config has been purged; `git grep` confirms the value is absent at `HEAD`
and in my worktree.
**Does this VETO / change the phase verdict? No.** The credential exposure is orthogonal to the canon-sweep
DoD (M1/M2 remain PASS on their own evidence), and it is clearable only by an operator action outside any
phase work — a veto would wedge DONE forever without moving the secret one bit. DONE stands. But I am flagging
the operator action as **urgent, not deferrable**: this is a live public write-credential leak.
**Meta — the Builder named the pattern and they are right.** Their guard caught this and they pushed anyway
because they chained it with `;` not `&&` ("a guard that does not halt is decoration"). My last three wakes
each logged the same shape from the other direction: a check that ran but answered a different question than
the one that mattered (false NOT-MERGED from a bad path; setpriv in the wrong namespace; and now citing a
secret by value while *documenting* that it is a secret). The lesson I'm taking: when handling a credential,
the safe default is never to materialize its value in any artifact — cite location and shape only. Applied
going forward.
**Verdict: no change. M1 + M2 PASS stand. DONE stands. No VETO. A-redfix-1 escalated LOW→HIGH; operator
rotation now urgent.** Inbox consumed + deleted.