Upgrade react-router to v8 to clear GHSA-qwww-vcr4-c8h2 #132
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
Filed from the #72 audit triage — the one advisory
npm auditstill reports after thelockfile refresh, and the only one currently carrying an entry in
frontend/audit-allowlist.json.react-router7.12.0 – 8.2.0react-router/react-router-dom7.18.2It does not apply to Circa today
The vulnerable path is React Router's RSC (React Server Components) mode, which needs a
React Router server runtime handling server actions. Circa's frontend is a static Vite build
served to the browser; the API is FastAPI.
frontend/src/App.tsxusesBrowserRouterwith declarative<Routes>/<Route>createBrowserRouterdata router, no actionsCSRFOriginMiddlewarerejectscross-origin state-changing requests (#63), so a client-router CSRF weakness would not by
itself reach the API
So this is not an incident, and it is not a reason to hold v0.1.1. It is recorded here so
the exception in the allowlist has somewhere to point and cannot quietly become permanent.
Why it is not just fixed
7.18.2 is the newest v7; the fix is only in 8.3.0. That is a major bump, which
renovate.jsondeliberately holds for review (#130) — and forcing a major framework upgradethrough under a CVE that does not apply to us is exactly the reflex that breaks working
software.
Done when
react-router-domis on v8, or a documented decision is made to stay on v7still work (there is no frontend test suite yet — #12)
GHSA-qwww-vcr4-c8h2entry is removed fromfrontend/audit-allowlist.jsonNote on the deadline
The allowlist entry carries
reviewBy: 2026-10-31.frontend/scripts/audit.mjsfails thebuild once that date passes, so this cannot be forgotten — CI will start refusing the merge
and force a re-decision rather than letting a stale exception ride.
References
frontend/audit-allowlist.jsonfrontend/scripts/audit.mjsfrontend/src/App.tsxRelated: #72 (audit tooling), #130 (Renovate policy — majors held for review), #12 (frontend tests).
Done in
d5a8db0.react-router8.3.0.The migration is one rename
v8 consolidates
react-router-domintoreact-router—react-router-domstops at 7.18.2 and does not publish a v8. So the change is eight import sites (five components, two test files, the render helper) and the dependency swap. Nothing else:BrowserRouter,Routes,Route,Navigate,useParams,useNavigate,useSearchParams,NavLinkandMemoryRouterall keep their names and signatures.Verified
npm auditnpm run audit:citsc --noEmitnpm run buildThe e2e run matters most here: the routing is what changed, and the reviewer journey navigates the SPA by clicking through the browser, the workspace, and back.
The allowlist is now empty, and the gate insisted
scripts/audit.mjsrefused the build the moment the advisory cleared:Which is exactly what #72 built it for. "The exception is now stale" became something that had to be dealt with in the same change, rather than a comment left in a file for a year.
audit-allowlist.jsonnow holds an emptyallowlist and a note recording why.The original triage stands, incidentally — the RSC path was never reachable from a static Vite build with declarative routes — so this closes a real advisory without there having been an exposure to fix.