9router

Ecosystem: npm

Downloads: 235.02 K

Vulnerabilities from the last (months)
  • 5CriticalAffects 5 versions
  • 9HighAffects 9 versions
  • 0MediumAffects 0 versions
  • 3ModerateAffects 3 versions
  • 0LowAffects 0 versions
Severity distribution (all time)
17vulnerabilities
  • Critical5 (29.4%)
  • High9 (52.9%)
  • Medium0 (0.0%)
  • Moderate3 (17.6%)
  • Low0 (0.0%)

Monthly breakdown

  • Critical
  • High
  • Medium
  • Moderate
  • Low
  • 6 vulnerabilities
    • Critical: 0
    • High: 4
    • Medium: 0
    • Moderate: 2
    • Low: 0
  • 3 vulnerabilities
    • Critical: 0
    • High: 3
    • Medium: 0
    • Moderate: 0
    • Low: 0
  • 6 vulnerabilities
    • Critical: 4
    • High: 2
    • Medium: 0
    • Moderate: 0
    • Low: 0
  • 1 vulnerabilities
    • Critical: 1
    • High: 0
    • Medium: 0
    • Moderate: 0
    • Low: 0
  • 1 vulnerabilities
    • Critical: 0
    • High: 0
    • Medium: 0
    • Moderate: 1
    • Low: 0

Vulnerabilities (17)

Known vulnerabilities affecting 9router, based on data from OSV.

Vulnerabilities affecting 9router
IDSeveritySummaryAffected versionsPublishedSource
GHSA-6mwv-4mrm-5p3mModerate9router: Kiro region injection allows authenticated SSRF with Authorization header forwarding### Summary The Kiro API-key validation endpoint builds an upstream URL using a user-controlled `region` value. By supplying a crafted region such as `kiro-canary.local:8443#`, an authenticated attacker can cause 9router to send the Kiro validation request to an attacker-controlled host under the constructed `codewhisperer.<region>` hostname. The request forwards the submitted Kiro API key as an `Authorization: Bearer` header. ### Details - **Affected version / commit:** 9router v0.5.2 @ `5da508a`. - **Endpoint:** `POST /api/oauth/kiro/api-key`. - **Correct runtime payload:** `region: "kiro
  • < 0.5.6
GitHub (opens in a new tab)
GHSA-cmhj-wh2f-9cgxHigh9router: Image prefetch DNS rebinding allows SSRF to internal services## Summary 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). ## Details - **Affected version / commit:** 9router `v0.4.80` @ `b282f05`. - **Reachable through** `/v1/chat/completions` with a **vision-capable model** and an `image_url` content part. A vision-capable model name i
  • < 0.5.2
GitHub (opens in a new tab)
GHSA-vmjq-hvgq-2wv4High9router: Mass assignment in PATCH /api/settings allows authenticated authorization downgrade### Summary The `PATCH /api/settings` endpoint writes the entire request body to persistent settings without a field whitelist. An authenticated user can set security-critical fields that are not meant to be modifiable here — notably `requireLogin`. Setting `requireLogin: false` disables authentication for the whole application, exposing all protected routes (e.g. `/api/keys`, `/api/providers`) to unauthenticated access. ### Details Root cause is unfiltered mass assignment (CWE-915): - `src/app/api/settings/route.js` (PATCH handler) parses the body and passes it to `updateSettings(body)`, wi
  • < 0.5.4
GitHub (opens in a new tab)
GHSA-x5c9-v98j-722rHigh9router /v1 APIs has unauthenticated access via reverse proxy locality collapse## Summary 9router treats local loopback requests as trusted and allows access to `/v1/*` without an API key. In a documented/common reverse-proxy deployment where nginx forwards public traffic to the backend via `127.0.0.1`, external non-`Origin` requests are misclassified as local. This allows unauthenticated access to `/v1` APIs such as `/v1/models`, and may allow abuse of configured upstream provider credentials depending on the enabled providers. ## Details - **Affected version / commit:** 9router `v0.4.80` @ `b282f05`. - **Deployment precondition:** a same-host reverse proxy (e.g. ngi
  • < 0.5.2
GitHub (opens in a new tab)
GHSA-32gc-64m7-hj7vModerate9Router has a Login Brute-Force Lockout Bypass via Spoofable X-9r-Real-Ip Header# Summary 9router enforces a progressive login lockout (5 failed attempts → temporary 30s+ lock) keyed on the client IP. The client IP used for this limiter is taken from the X-9r-Real-Ip request header, which is intended to be set only by the bundled custom-server.js layer from the unspoofable TCP socket address. In deployment modes where requests reach Next.js directly, a remote attacker controls this header and can assign a unique value to every request. Because each distinct header value maps to a fresh limiter bucket, the lockout never triggers, enabling unlimited password guessing again
  • < 0.5.8
GitHub (opens in a new tab)
GHSA-5mj8-gf6m-fhw8High9Router has an Authentication Bypass in Public LLM API via Spoofable X-9r-Real-Ip Header## Summary 9router determines whether an incoming request originates from localhost by trusting the X-9r-Real-Ip HTTP request header. This header is intended to be produced and sanitized exclusively by the bundled custom-server.js layer from the TCP socket address. In deployment modes where requests reach Next.js directly (the header is never stripped/regenerated), a remote, unauthenticated attacker can simply send X-9r-Real-Ip: 127.0.0.1 and be treated as a local client. This bypasses the API-key requirement on the public LLM API (/api/v1/*), granting unauthenticated access to the instance o
  • < 0.5.8
GitHub (opens in a new tab)
GHSA-86m2-fcxq-5q7cHigh9router: Unauthenticated `/v1` proxy access via `Host`-header spoofing → open AI relay + SSRF## Summary 9router's request guard decides a request is "local" (and therefore exempt from API-key auth on the `/v1` LLM proxy) by reading the **client-controlled `Host` header**. Because 9router binds `0.0.0.0` by default (and the CLI misleadingly prints "localhost"), a remote, unauthenticated attacker who can reach the port can send `Host: localhost` to be treated as local and obtain `/v1` proxy access with **no API key, no CLI token, and no dashboard login**. In the default configuration (`requireApiKey` is absent from `DEFAULT_SETTINGS`, so the handler-side key check is skipped), this yie
  • < 0.5.2
GitHub (opens in a new tab)
GHSA-8gmq-j984-vp4rHigh9router: Unauthenticated LLM proxy access via /codex rewrite authorization bypass## Summary 9router exposes an OpenAI/Anthropic-compatible LLM proxy. Remote access to this proxy is intended to be protected by an API-key check in the Next.js middleware. However, 9router also defines a rewrite that maps `/codex/*` to the backend LLM endpoint `/api/v1/responses`. The middleware authorization decision is made on the incoming request path before the rewrite is applied. Because `/codex` is not included in the middleware's protected LLM API prefix list, requests to `/codex/*` bypass the API-key gate and are later rewritten to the same backend used by `/api/v1/responses`. As a
  • < 0.5.2
GitHub (opens in a new tab)
GHSA-8g4w-4ffg-8vgxHigh9Router: Authenticated Server-Side Request Forgery (SSRF) via OIDC Provider Test Endpoint### Summary A Server-Side Request Forgery (SSRF) vulnerability exists in the 9Router dashboard via the `/api/auth/oidc/test` endpoint. The application accepts a user-controlled URL string through the `issuerUrl` parameter and performs an outbound HTTP request without validating if the destination IP belongs to a restricted internal network range. Notably, this endpoint can be accessed without active session authentication (Unauthenticated), allowing any remote actor with network visibility to the dashboard API endpoints to trigger outbound infrastructure connections. Depending on the state
  • <= 0.5.4
GitHub (opens in a new tab)
GHSA-7cfm-pqrj-xgq7High9router: Login brute-force protection bypass via spoofed X-Forwarded-For header## Summary The 9router dashboard login rate limiter derives the client identity from the attacker-controlled `X-Forwarded-For` HTTP header. When 9router is directly exposed, or deployed behind a reverse proxy that does not overwrite untrusted forwarding headers, a remote attacker can rotate the `X-Forwarded-For` value on each login attempt and receive a fresh rate-limit bucket every time. This bypasses the dashboard brute-force protection and makes the login lockout mechanism ineffective. ## Details | Component | File | Note
  • < 0.4.77
GitHub (opens in a new tab)
  • GHSA-6mwv-4mrm-5p3mModerate
    9router: Kiro region injection allows authenticated SSRF with Authorization header forwarding
    • < 0.5.6

    ### Summary The Kiro API-key validation endpoint builds an upstream URL using a user-controlled `region` value. By supplying a crafted region such as `kiro-canary.local:8443#`, an authenticated attacker can cause 9router to send the Kiro validation request to an attacker-controlled host under the constructed `codewhisperer.<region>` hostname. The request forwards the submitted Kiro API key as an `Authorization: Bearer` header. ### Details - **Affected version / commit:** 9router v0.5.2 @ `5da508a`. - **Endpoint:** `POST /api/oauth/kiro/api-key`. - **Correct runtime payload:** `region: "kiro

    CVE: CVE-2026-56678

  • GHSA-cmhj-wh2f-9cgxHigh
    9router: Image prefetch DNS rebinding allows SSRF to internal services
    • < 0.5.2

    ## Summary 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). ## Details - **Affected version / commit:** 9router `v0.4.80` @ `b282f05`. - **Reachable through** `/v1/chat/completions` with a **vision-capable model** and an `image_url` content part. A vision-capable model name i

    CVE: CVE-2026-56676

  • GHSA-vmjq-hvgq-2wv4High
    9router: Mass assignment in PATCH /api/settings allows authenticated authorization downgrade
    • < 0.5.4

    ### Summary The `PATCH /api/settings` endpoint writes the entire request body to persistent settings without a field whitelist. An authenticated user can set security-critical fields that are not meant to be modifiable here — notably `requireLogin`. Setting `requireLogin: false` disables authentication for the whole application, exposing all protected routes (e.g. `/api/keys`, `/api/providers`) to unauthenticated access. ### Details Root cause is unfiltered mass assignment (CWE-915): - `src/app/api/settings/route.js` (PATCH handler) parses the body and passes it to `updateSettings(body)`, wi

    CVE: CVE-2026-56679

  • GHSA-x5c9-v98j-722rHigh
    9router /v1 APIs has unauthenticated access via reverse proxy locality collapse
    • < 0.5.2

    ## Summary 9router treats local loopback requests as trusted and allows access to `/v1/*` without an API key. In a documented/common reverse-proxy deployment where nginx forwards public traffic to the backend via `127.0.0.1`, external non-`Origin` requests are misclassified as local. This allows unauthenticated access to `/v1` APIs such as `/v1/models`, and may allow abuse of configured upstream provider credentials depending on the enabled providers. ## Details - **Affected version / commit:** 9router `v0.4.80` @ `b282f05`. - **Deployment precondition:** a same-host reverse proxy (e.g. ngi

    CVE: CVE-2026-56675

  • GHSA-32gc-64m7-hj7vModerate
    9Router has a Login Brute-Force Lockout Bypass via Spoofable X-9r-Real-Ip Header
    • < 0.5.8

    # Summary 9router enforces a progressive login lockout (5 failed attempts → temporary 30s+ lock) keyed on the client IP. The client IP used for this limiter is taken from the X-9r-Real-Ip request header, which is intended to be set only by the bundled custom-server.js layer from the unspoofable TCP socket address. In deployment modes where requests reach Next.js directly, a remote attacker controls this header and can assign a unique value to every request. Because each distinct header value maps to a fresh limiter bucket, the lockout never triggers, enabling unlimited password guessing again

    CVE: CVE-2026-56682

  • GHSA-5mj8-gf6m-fhw8High
    9Router has an Authentication Bypass in Public LLM API via Spoofable X-9r-Real-Ip Header
    • < 0.5.8

    ## Summary 9router determines whether an incoming request originates from localhost by trusting the X-9r-Real-Ip HTTP request header. This header is intended to be produced and sanitized exclusively by the bundled custom-server.js layer from the TCP socket address. In deployment modes where requests reach Next.js directly (the header is never stripped/regenerated), a remote, unauthenticated attacker can simply send X-9r-Real-Ip: 127.0.0.1 and be treated as a local client. This bypasses the API-key requirement on the public LLM API (/api/v1/*), granting unauthenticated access to the instance o

    CVE: CVE-2026-56681

  • GHSA-86m2-fcxq-5q7cHigh
    9router: Unauthenticated `/v1` proxy access via `Host`-header spoofing → open AI relay + SSRF
    • < 0.5.2

    ## Summary 9router's request guard decides a request is "local" (and therefore exempt from API-key auth on the `/v1` LLM proxy) by reading the **client-controlled `Host` header**. Because 9router binds `0.0.0.0` by default (and the CLI misleadingly prints "localhost"), a remote, unauthenticated attacker who can reach the port can send `Host: localhost` to be treated as local and obtain `/v1` proxy access with **no API key, no CLI token, and no dashboard login**. In the default configuration (`requireApiKey` is absent from `DEFAULT_SETTINGS`, so the handler-side key check is skipped), this yie

    CVE: CVE-2026-55641

  • GHSA-8gmq-j984-vp4rHigh
    9router: Unauthenticated LLM proxy access via /codex rewrite authorization bypass
    • < 0.5.2

    ## Summary 9router exposes an OpenAI/Anthropic-compatible LLM proxy. Remote access to this proxy is intended to be protected by an API-key check in the Next.js middleware. However, 9router also defines a rewrite that maps `/codex/*` to the backend LLM endpoint `/api/v1/responses`. The middleware authorization decision is made on the incoming request path before the rewrite is applied. Because `/codex` is not included in the middleware's protected LLM API prefix list, requests to `/codex/*` bypass the API-key gate and are later rewritten to the same backend used by `/api/v1/responses`. As a

    CVE: CVE-2026-55638

  • GHSA-8g4w-4ffg-8vgxHigh
    9Router: Authenticated Server-Side Request Forgery (SSRF) via OIDC Provider Test Endpoint
    • <= 0.5.4

    ### Summary A Server-Side Request Forgery (SSRF) vulnerability exists in the 9Router dashboard via the `/api/auth/oidc/test` endpoint. The application accepts a user-controlled URL string through the `issuerUrl` parameter and performs an outbound HTTP request without validating if the destination IP belongs to a restricted internal network range. Notably, this endpoint can be accessed without active session authentication (Unauthenticated), allowing any remote actor with network visibility to the dashboard API endpoints to trigger outbound infrastructure connections. Depending on the state

    CVE: CVE-2026-56677

  • GHSA-7cfm-pqrj-xgq7High
    9router: Login brute-force protection bypass via spoofed X-Forwarded-For header
    • < 0.4.77

    ## Summary The 9router dashboard login rate limiter derives the client identity from the attacker-controlled `X-Forwarded-For` HTTP header. When 9router is directly exposed, or deployed behind a reverse proxy that does not overwrite untrusted forwarding headers, a remote attacker can rotate the `X-Forwarded-For` value on each login attempt and receive a fresh rate-limit bucket every time. This bypasses the dashboard brute-force protection and makes the login lockout mechanism ineffective. ## Details | Component | File | Note

    CVE: CVE-2026-55501

Showing 1-10 of 17 vulnerabilities