This repository was archived by the owner on Aug 8, 2026. It is now read-only.
v4.9.1 #499
dknauss
started this conversation in
Show and tell
v4.9.1
#499
Replies: 1 comment
|
I appreciate the transparency about the remaining limitations and the clear warning that this is still a research prototype. Fixing the cache-related revocation and cleanup inconsistencies seems especially important given the risk of reporting a successful revoke when a session remains active. |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
A maintenance snapshot on top of 4.9.0. It corrects two ways the sudo session record and the cleanup that reads it could disagree, and finishes the documentation sweep 4.9.0 started. No migration; existing sudo sessions are unaffected.
If you are evaluating 4.9.0, prefer this snapshot. One of the fixes below is a silent failure in the revocation path.
Why this supersedes 4.9.0
"Revoke all sessions" could silently skip a live sudo session. Each user carries an expiry marker that must be at least as late as every sudo proof they hold, so anything enumerating on it cannot miss a user whose sudo is still enforcing. That marker was maintained by reading it back through the object cache, a few lines above a deliberately cache-bypassed read of the proofs themselves. A stale-low cached read could write a marker sitting beneath another browser's live proof — and because the bulk revoke selects on that marker in SQL, the operator's revoke skipped that user entirely. The per-user revoke was hidden on the Users list for the same reason.
The failure shape is the problem: it reported success, in the operator's favour, in the direction of believing the session was gone. A session that cannot be revoked is a worse outcome than one cleaned up too eagerly. The marker is now derived from the proof map the code already holds cache-bypassed, so a stale read can no longer lower it.
Site Health's cleanup deleted sessions that were still working. The stale-session sweep selected users one way and re-classified them another — a cached read against a cache-bypassed one — so a cache that fell out of step let it delete every valid browser proof for a user whose session was live. A second defect needed no cache failure at all: the sweep ignored the 120-second grace window that exists so a just-expired session can finish a form already in progress, deleting those proofs up to two minutes early on ordinary timing. Selection and classification now happen in one database query.
Operator-visible: cleanup of an expired session is now deferred by up to 120 seconds. During that window the sudo timer has expired but a cookie- and HMAC-bound proof is still accepted by gated paths — that is what the window is for, and the sweep was deleting proofs inside it.
Read this before evaluating
Browser-admin reauthentication is materially worse than before 4.9.0, and fixing it is the next priority.
Removing automatic replay closed a real vulnerability. The convenience cost is larger than the 4.9.0 notes conveyed, and is stated here rather than left to be discovered. Four faces, all tracked, none fixed in this snapshot:
options.criticalgates on the presence of a critical field rather than a change to it, so every Settings → General save raises a challenge even when nothing changed (#445).Combined, a routine settings save can mean: challenge, reauthenticate, lose the work, and read a notice that misdescribes what happened. The 4.9.0 notes said re-doing the action was "a re-click or a re-submit" — for a form it is a full retype, and that claim has been corrected.
A concurrency race remains open. The marker fix removes the object cache as a cause, not concurrency. The marker and the proof map are still two separate
update_user_meta()calls, so two browsers activating at the same instant can still interleave to produce a too-low marker (#475).Also in this snapshot
docs/llm-lies-log.mdrecording fabricated and unverified claims caught during this cycle — including three fabricated quotations in a draft of these very release notes, and one dangling citation created by the audit entry describing it.Scope
The tag is retained for reproducible demonstration and review. A release number, green CI, and extensive review do not imply production readiness.
See Project Status, the 4.9.1 changelog, and
docs/security-model.mdfor the threat model and its stated boundaries.What's Changed
Full Changelog: v4.9.0...v4.9.1
This discussion was created from the release v4.9.1.
All reactions