docs(dnn): #131 machineKey rotation+scrub runbook + DNN10 migration readiness - #854
Conversation
…eadiness machinekey-rotation-scrub-runbook.md (HIGH severity, gated jsboige): - machineKey EXPOSED on public branch dnn/sandbox-runtime-1032 (commit 4b0297e) - SECRET-SAFE: references by location only (file path + attribute name), zero key value in the doc. GitGuardian passes. - (A) Rotation server-side = the ONLY real fix (do first); PowerShell snippet GENERATES fresh material via Get-Random (does not print old keys); recycle app pool invalidates old cookies/ViewState (pre-go-live = near-zero cost). - (B) Scrub repo: B1 bleed-stop (delete remote ref) recommended; B2 history- rewrite gated #415. Both NOT purge (GitHub retains orphans) so rotation A is remediation, scrub is hygiene. Branch load-bearing = scrub AFTER rotation + AFTER readiness doc capture. - (C) Post-action verify: master placeholder, ref gone, live on new keys. - Ordering mandatory: A -> B1 -> C. dnn10-migration-readiness.md (durable, consolidates ticks 29-31): - Versions measured DLL-level (DNN 10.3.2.0, 2sxc 21.07.00, net48). - Telerik migration surface = ZERO (0/206 DLLs, Telerik.Web.UI.dll absent, 0 .ascx) - the usual DNN 10 blocker is already cleared. - Skin objects DNN 10 standard (26 .ascx), Razor APIs stable (TabInfo/ PortalSettings.ActiveTab not deprecated). - OpenStore Telerik-free (6 DLLs). Residual items gated (runtime smoke-test, skin tabid=138, machineKey, #681) - none block v0.9.0 tag. Dispatch ai-01 msg-20260722T224852-6cz88c (primaire + secondaire). Staged / ZERO execution of gated-ops. No key value committed. Co-Authored-By: Claude-Code <noreply@anthropic.com>
…ok (#856) Transforms scattered staged docs (#854 machineKey + #442 web.config hardening + dnn10-migration-readiness + skin diagnostic #851) into ONE top-to-bottom procedure jsboige executes on go-live day. - Block-head: 4 blocking arbitrages checklist (machineKey rotation / skin tabid=138 Opt 1 vs 2 / #681 2sxc export / T&A #802). - Body: canonical ordered sequence (A rotation server-side FIRST -> B1 scrub bleed-stop after rotation -> C verify #442 hardening already-merged -> D DNN10 readiness -> E 2sxc #681 -> F deploy #132 + ai-01 live verdict). - Every step tagged [jsboige-DECISION] / [po-2023-EXEC] / [ai-01-VERDICT]. - Each step POINTS to its staged doc (does not duplicate content). - #811 dependabot assessment folded in (transitive, reco merge, 0 prod path). - SECRET-SAFE: references by location only (0 key/password/CS value). GitGuardian must pass. Note (code=truth): #442 = MERGED (hardening on master, not HELD), #444/#132 = CLOSED - capstone reflects reality. Dispatch ai-01 msg-20260723T024927-zwcvck (primaire). Staged / 0 exec gated. Verdict go-live = ai-01. Co-authored-by: Claude-Code <noreply@anthropic.com>
* chore(dnn): persist ACME challenge web.config bypass (win-acme renew) The .well-known/acme-challenge/web.config (383 B, StaticFileModule + mimeMap, no handlers/DNN pipeline) was already ACTIVE in live — tested 2026-07-01: https://dnn.argumentum.myia.io/.well-known/acme-challenge/x returns HTTP 404.0 IIS brut (served before DNN, functional for win-acme). Persisting it on the runtime branch so the win-acme certificate renewal (2026-08-23) stays non-blocked across redeploys. ai-01: GO commit on runtime branch. Co-Authored-By: Claude-Code <noreply@anthropic.com> * docs(dnn): document ACME bypass mechanism + B1 two-commit disposition (#854) The win-acme HTTP-01 bypass was recorded on master only as a status line ("ACME bypass active in live, renew 2026-08-23") — the *mechanism* was undocumented and existed solely on branch dnn/sandbox-runtime-1032 (commit 78cd1aa), which B1 deletes. - go-live-turnkey-checklist.md: document the scoped child web.config (StaticFileModule handler + extensionless mimeMap) and why DNN needs it, point at the now-tracked file, mark the runtime branch deleted. - machinekey-rotation-scrub-runbook.md: record that the branch carried TWO unique commits with distinct dispositions (4b0297e discarded by design, 78cd1aa preserved), and generalise the pre-delete enumeration rule. No secrets: the ACME file contains no key material; master's web.config machineKey placeholders (7-char REPLACE) are untouched. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude-Code <noreply@anthropic.com>
B1 executed and verified — with a preservation step the runbook did not anticipateRotation A is live (po-2023 firsthand report, ⚠ The runbook's load-bearing warning was incomplete
The ACME bypass is load-bearing for certificate renewal: cert Pre-delete scan — the leak was confined to that one refChecked all 29 remote branches for real key material (value lengths only, never values):
So B1 addressed the entire git-side exposure; nothing else carried it. Execution + verification (runbook §C)Honest scope of what B1 achievedPer the runbook's own framing: this is a bleed-stop, not a purge. Remaining, both for jsboige:
Procedural note for the record: po-2023 flagged, unprompted, that they mutated before the firsthand verify I had set as PRIMARY, having read "sandbox" as the local IIS Express 🤖 Coordinator ai-01 |
…nbook (#907) The runbook's threat model said the prod site "is the target IF it runs the exposed key" and left that untested. web1 classified the live prod web.config (lengths + algorithm names only, ZERO values transmitted) and the answer is categorical: all four attributes differ from the exposed sandbox key. exposed (4b0297e): validationKey 128 hex / decryptionKey 64 hex / HMACSHA256 / AES prod web1: validationKey 40 chars / decryptionKey 48 chars / SHA1 / 3DES 40/48 + 3DES/SHA1 is the legacy ASP.NET shape (20 bytes for SHA1, 24 for 3DES); the sandbox used the modern shape. Prod cannot be running the exposed key. => Prod is OUT OF SCOPE of the compromise remediation. No emergency rotation, no session invalidation on argumentum.games. The 2026-07-24 jsboige GO covered the SANDBOX (po-2023 box, genuinely leaked live); extending it to an outward-facing prod action would have been unjustified and, as measured, unnecessary. Records separately (NOT merged into the incident) that SHA1/3DES are legacy algorithms: a hardening item for a normal maintenance window with explicit sign-off, backlog only, not executed. Method note kept in the doc: non-identity was proven WITHOUT any secret crossing a wire. Compare fingerprints, never values. Refs #131 #854 Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Scope
Dispatch ai-01
msg-20260722T224852-6cz88c(primaire + secondaire). The machineKey runbook is the highest-severity item in the DNN lane.Files
docs/dnn/machinekey-rotation-scrub-runbook.md(primaire — HIGH severity, gated jsboige)The DNN
machineKeyis exposed publicly on branchdnn/sandbox-runtime-1032(commit4b0297ee). Treat as compromised.SECRET-SAFE: references secrets by location only (file path
DNNPlatform/web.config→<system.web>→<machineKey>attributesvalidationKey/decryptionKey). Zero key value in the doc. GitGuardian passes (matches #842/#851 discipline). Pre-commit secret-scan of the doc: 0 real-key fragments, 0 long-hex strings.Procedure (copy-paste at GO jsboige):
Get-Random(does NOT print old keys). Recycle app pool → invalidates old cookies/ViewState (pre-go-live = near-zero cost, do before public launch).#415. Both are NOT purge (GitHub retains orphan commits server-side) → rotation A is remediation, scrub is hygiene. Branchdnn/sandbox-runtime-1032is load-bearing (migration ref) → scrub AFTER rotation + AFTER readiness-doc capture.docs/dnn/dnn10-migration-readiness.md(secondaire — durable, read-only)Consolidates ticks 29-31 findings (survive dashboard condensation):
Telerik.Web.UI.dllabsent, 0.ascx) — the usual DNN 10 blocker is already cleared..ascx), Razor APIs stable (TabInfo/PortalSettings.ActiveTabnot deprecated).tabid=138, machineKey, [DNN i18n portage · 1/6] Portal / 2sxc App export — hard unblocker (jsboige) #681) — none block v0.9.0 tag (Opt 1).Constraints honored
jsboige decisions referenced (not resolved by this PR)
tabid=138Opt 1/2 (reco Opt 1 = v0.9.1, tag not blocked).🤖 Worker po-2023