Summary
Five open security PRs target v1/main and were the last items still sitting on
project board #11 as PR cards. Board #11 is issues-only (see AGENTS.md →
Issue-driven Work Style), and the umbrella they each reference — #1819,
"go-live 7/9: triage and bulk-close the v1 PR backlog" — is closed, so
removing those cards would have left this work with no board tracking at all.
This issue is that tracking. The PR cards were removed from #11; each PR
below is reachable from here.
Decisions — 4 of 5 resolved
Each PR was put through repeated Copilot review rounds until clean, then given
an explicit call. The governing rule: v1/main is deprecated and ships fixes
for high-severity vulnerabilities only — not general hardening,
defense-in-depth, or hygiene work, however sound.
Notes carried out of the review
Found during review and not addressed, since none is v1-shippable:
Contributors' branches keep the commits pushed during review; nothing was merged.
Summary
Five open security PRs target
v1/mainand were the last items still sitting onproject board #11 as PR cards. Board #11 is issues-only (see
AGENTS.md→Issue-driven Work Style), and the umbrella they each reference — #1819,
"go-live 7/9: triage and bulk-close the v1 PR backlog" — is closed, so
removing those cards would have left this work with no board tracking at all.
This issue is that tracking. The PR cards were removed from #11; each PR
below is reachable from here.
Decisions — 4 of 5 resolved
Each PR was put through repeated Copilot review rounds until clean, then given
an explicit call. The governing rule:
v1/mainis deprecated and ships fixesfor high-severity vulnerabilities only — not general hardening,
defense-in-depth, or hygiene work, however sound.
stateparameter #1189 — closed (closed-v1-deprecated). Not a vulnerability. v1 alreadyimplements PKCE (
saveCodeVerifier/codeVerifier+ SDK 1.25.2 sendingcode_challenge), which defeats code injection; the unvalidatedstateis ahalf-built mechanism (
state()generates and sends a token that is thendiscarded), so completing it is hardening. v2 reached the same conclusion
independently and does a shape check only.
window.openwith_blank#1190 — closed (closed-v1-deprecated). Finding is real — the implicitnoopenerbrowsers apply to<a target="_blank">does not extend towindow.open()— but it is bounded by a hostile-server-plus-user-clickprecondition and yields tab navigation, not code execution or data access.
v2 is unaffected; nothing to forward-port.
closed-v1-deprecated). Legitimate finding, and the reviewrounds sharpened it from a name-pattern denylist into unconditional
redaction. But the exposure is local — the user's own console — so it is
hygiene, not a remotely exploitable vulnerability.
closed-v1-security-declined). Reviewed and declined on themerits: every origin-validated route also requires the session token, so
missing-
Originis not an unauthenticated bypass, and rejecting it breaksnon-browser callers (curl/CI) while putting v1 at odds with v2's documented
posture.
TOCTOU in
safeProxyFetchis an SSRF-guard bypass reachable at the cloudmetadata service (
169.254.169.254) — the threat model being a hostile MCPapp inducing
/fetch, not a token-holding attacker. Closing it under a"high-severity only" rationale would contradict itself. Needs a merge call.
Notes carried out of the review
Found during review and not addressed, since none is v1-shippable:
command=/args=logged verbatim and the SSE
url=, which can carry embedded credentials. Worthan issue against v2.
client/src/components/OAuthFlowProgress.tsx:381has the same barewindow.openas Security: Potential reverse tabnabbing via
window.openwith_blank#1190 (its sibling at :251 is already hardened). v1 only.gh pr checks→ "no checksreported"), so nothing on
v1/mainis verified by the repo's own gates. Thatmaterially raises the risk of any change here and is part of why the bar is high.
stateparameter #1189's contributor commits carry a DCO name/email mismatch that would need aforce-push rewrite to repair. Moot now that it's closed.
Contributors' branches keep the commits pushed during review; nothing was merged.