demo · v146

CSRF Attack Simulator

The drive-by router takeover. Walk through the attack chain on a vulnerable home router and watch where Chrome 146's local network access prompt severs it.

Educational simulation. All requests in this demo are simulated in-page — no real network access happens. The point is to visualise the steps of the classic CSRF chain that the Local Network Access permission interrupts.
Chrome 146 behaviour:
attacker page (public)
https://looks-legit.example/article

Innocuous-looking content. Hidden JS issues a request to the user's home router admin endpoint, riding on whatever cookies the router set when the user last visited 192.168.1.1.

target (private)
http://192.168.1.1/admin/dns?primary=6.6.6.6

A typical home-router admin endpoint that accepts authenticated GETs to change DNS. No CSRF token, no CORS preflight — and the auth cookie is still valid.

  1. User opens looks-legit.example in a tab.
  2. Page script calls fetch('http://192.168.1.1/admin/dns?primary=6.6.6.6').
  3. Browser checks: target is in private address space, request initiator is public.
  4. Local Network Access permission check.
  5. Request reaches the router. Auth cookie attached.
  6. Router accepts. DNS is set to attacker server.
Click "Run the attack" to step through the chain.

two permissions, not one

Chrome 145 split the restriction into two distinct permissions:

This matters because the two surfaces have different risk profiles: loopback is reachable only from the same machine (often dev servers and platform agents), private addresses are reachable across the LAN. Granting one doesn't grant the other.

see also