Someone left the vault door hinged backwards so it swings open when you knock from the wrong side
CVE-2026-19490 is an authentication bypass (CWE-288) in Citrix NetScaler ADC and NetScaler Gateway. The flaw lives in nsppe, the packet-processing engine, specifically in its SAML HTTP-Redirect binding handler at /cgi/samlauth. Two bugs combine: (1) the redirect-binding code path passes a zero for the strict-parsing flag while the POST-binding path correctly enables it, and (2) the config word for rejectUnsignedAssertion treats the default value (2) as *permissive*, routing unsigned assertions to acceptance rather than denial. The result is that a single unauthenticated GET request carrying an unsigned, attacker-crafted SAML Response forges a valid session as any user. Affected versions are 14.1 before 14.1-73.32 and 13.1 before 13.1-63.21 (plus FIPS/NDcPP variants). Builds from 14.1-43.56 / 13.1-61.28 onward require a SAML action to be configured; earlier builds are vulnerable with just a Gateway or AAA virtual server configuration.
The vendor rated this CVSS 3.1 9.8 CRITICAL, and for once the label matches reality. This is not defense-in-depth hand-wringing — it is a one-request, zero-auth, zero-interaction bypass on a device that *is* your perimeter. Citrix published no workaround. A public PoC (TarPeg007 on GitHub) dropped 14 days after patch release, and in-the-wild exploitation was observed within 24 hours of the PoC on September 3, 2026. CISA added it to the KEV catalog six days later. Shadowserver and Rapid7 count 22,000+ NetScaler ADC and ~1,700 Gateway instances exposed to the internet. The vendor severity is, if anything, conservative given the deployment context.
5 steps from start to impact.
Discover internet-facing NetScaler
/vpn/index.html fingerprints using Shodan, Censys, or FOFA. Over 23,000 instances are internet-reachable. The NetScaler version can sometimes be inferred from response headers or JavaScript build strings on the login page.- Target NetScaler must be reachable on HTTPS from the internet
- None — these appliances are designed to be internet-facing
Enumerate SAML endpoint availability
/cgi/samlauth to confirm the SAML redirect binding handler is active. On builds 14.1-43.56+ / 13.1-61.28+, a SAML action must be configured for the endpoint to respond. On older builds, any Gateway or AAA vserver config suffices. The TarPeg007 PoC includes a --check-only mode for this step.- SAML action configured (newer builds) OR Gateway/AAA vserver configured (older builds)
- Enterprises not using SAML SSO on newer firmware are not exploitable via this specific path — but older firmware does not require SAML at all
/cgi/samlauth with SAMLResponse query parameters; redirect-binding GETs are uncommon in legitimate flows.Forge unsigned SAML assertion
- Knowledge of IdP and SP entity IDs (often guessable or discoverable from SAML metadata endpoints)
- Entity ID values may require reconnaissance, but SAML metadata is frequently exposed at well-known paths
/cgi/samlauth GET looking for deflated payloads without XML signatures. IDS signatures for unsigned SAML assertions in the query string.Send bypass request and obtain session
/cgi/samlauth?SAMLResponse=<payload>&RelayState=<ctx> triggers the vulnerable code path. The nsppe engine parses the assertion with strict=0, accepts the unsigned payload because the default rejectUnsignedAssertion config word routes to acceptance, and mints an authenticated session cookie. The attacker is now logged in as the forged identity.- Network path to the target on port 443
- Literally none — this is a single HTTP GET
--safe-oracle mode uses deliberately malformed assertions to detect without creating sessions.Post-authentication pivot
- Forged identity has VPN or admin privileges
- MFA on the backend resources may limit lateral movement, but the NetScaler session itself is already forged past authentication
set samlAction <name> -samlRejectUnsignedAssertion STRICT on each SAML action. This forces the engine to reject unsigned assertions even on the redirect-binding path, breaking the exploit chain. Deploy within hours as a bridge to patching. Caveat: this may break IdP integrations that send unsigned assertions (uncommon but possible). Test against your IdP before broad rollout./cgi/samlauth containing a SAMLResponse query parameter. Legitimate SAML flows almost exclusively use POST binding. This is a stopgap; do not rely on it as a substitute for patching./cgi/samlauth, (2) admin account session creation from unexpected sources, (3) configuration changes or new admin accounts, (4) crontab and nsppe filesystem modifications, (5) outbound connections to unusual destinations. If any indicators are found, treat as confirmed breach and invoke IR.- MFA on NetScaler Gateway login — the bypass forges a session *after* the SAML authentication step; MFA configured on the NetScaler login page is never reached because the attacker enters through the SAML callback endpoint, not the login form.
- NetScaler AppFW (Web App Firewall) — AppFW policies inspect traffic to backend servers, not to NetScaler's own management/authentication endpoints like
/cgi/samlauth. - Network segmentation behind NetScaler — segmentation limits post-compromise lateral movement but does nothing to prevent the initial authentication bypass on the appliance itself.
- Certificate pinning on SAML assertions — the vulnerability is that the unsigned-assertion rejection logic is inverted; the system never reaches the certificate validation step because it accepts the assertion as unsigned-but-allowed.
The supporting signals.
| In-the-Wild Exploitation | Confirmed active since 2026-09-03. Previdian sensors detected exploit traffic from IPs in AU, US, and DE within 24 hours of PoC publication. CISA added to KEV catalog on 2026-09-09. |
|---|---|
| Proof of Concept | Public and weaponized. TarPeg007/CVE-2026-19490 on GitHub provides poc.py with --check-only, --safe-oracle, and --mint (full exploit) modes. Root-cause analysis by TarPeg007; original report credited to Samarth Vashisht (JPMorgan Chase). Also indexed in SecureWithUmer/CVE-2026-PoCs. |
| EPSS Score | 0.2316 (top ~2% of all CVEs). This places it well above the threshold where most exploit-prediction models flag for priority action. |
| KEV Status | Listed. Added 2026-09-09. Ransomware use: *Unknown* per CISA. Federal remediation deadline set per BOD 22-01. |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — 9.8 CRITICAL. Network-accessible, low complexity, no privileges, no interaction. Full CIA impact. CVSS v4.0 score is 9.3. |
| Affected Versions | NetScaler ADC and Gateway 14.1 before 14.1-73.32, 13.1 before 13.1-63.21. FIPS: 14.1 before 14.1-73.32, 13.1 before 13.1-37.277. NDcPP: 13.1 before 13.1-37.277. Older builds (pre-14.1-43.56 / 13.1-61.28) exploitable without SAML; newer builds require SAML action configured. |
| Fixed Versions | 14.1-73.32, 13.1-63.21, 13.1-37.277 (FIPS/NDcPP). No backport to 12.x or earlier (EOL). Citrix bulletin: CTX696939. |
| Internet Exposure | Rapid7/Shadowserver report >22,000 NetScaler ADC and ~1,700 Gateway instances directly internet-reachable. This is the vulnerable surface — the total installed base is significantly larger behind firewalls. |
| Disclosure Timeline | 2026-08-19: Citrix advisory + patch. 2026-09-02: Public PoC (TarPeg007). 2026-09-03: ITW exploitation observed. 2026-09-09: CISA KEV listing. 15-day patch-to-exploit window. |
| Reporting Researcher | Samarth Vashisht (JPMorgan Chase pen-test team). Root-cause analysis and PoC by TarPeg007. |
Sources.
- Citrix Security Bulletin CTX696939
- CISA KEV Catalog — CVE-2026-19490 Added September 2026
- TarPeg007 PoC and Root-Cause Analysis
- Horizon3.ai Vulnerability Analysis
- BleepingComputer — Critical Citrix NetScaler Auth Bypass in Attacks
- Tech Insider — 22,000 Exposed NetScaler Instances
- Vijilan — CVE-2026-19490 Forensic Triage Guidance
- The Hacker News — Critical NetScaler Flaw
Why this verdict
- Zero-friction attack chain: The entire exploit is a single unauthenticated GET request to a known endpoint. No credentials, no user interaction, no race conditions, no memory corruption — pure logic bug. There is no complexity discount to apply.
- Public weaponized PoC + active exploitation: TarPeg007's PoC has been public since September 2 and exploitation was observed within 24 hours. The 15-day patch-to-exploit window is closed; this is in active campaigns *now*.
- KEV-listed with EPSS in top 2%: CISA KEV listing on 2026-09-09 confirms government-verified exploitation. EPSS 0.2316 independently corroborates high exploitation probability.
- Role multiplier: NetScaler ADC and Gateway are canonically network-edge appliances — 100% of installs occupy the high-value perimeter role by definition. These devices ARE the VPN concentrator, the SSL offloader, the authentication gateway. A successful bypass grants the attacker an authenticated session inside the enterprise network, equivalent to a VPN credential. Blast radius is network-scale to fleet-scale: the attacker bypasses the perimeter and lands inside with whatever access the forged identity carries. On admin sessions, the blast radius extends to full appliance control, certificate extraction, and persistent backdoor installation. Historical NetScaler compromises (CitrixBleed / CVE-2023-4966) led directly to ransomware deployments. The verdict floor is CRITICAL because the affected component is a canonical high-value network-edge device.
- Massive exposed surface: 23,000+ internet-facing instances per Shadowserver/Rapid7. No firewall or NAT hides these — they are purpose-built to be internet-reachable.
- No vendor workaround: Citrix published no workaround. The partial mitigation (
set samlAction -samlRejectUnsignedAssertion STRICT) was community-discovered and may break legitimate SAML flows.
Why not higher?
This is already at the CVSS ceiling of 9.8. The only vector that could theoretically push higher would be Scope change (S:C), but the bypass is contained to the NetScaler session context — downstream impact depends on the network the Gateway brokers into. The score cannot meaningfully exceed 9.8 under CVSS 3.1.
Why not lower?
Downgrading would require meaningful friction in the attack chain, and there is none. The SAML-configuration prerequisite on newer builds is the only narrowing factor, but older builds do not require it at all, and SAML SSO is extremely common in enterprises deploying NetScaler Gateway. The 23,000+ internet-exposed instances, public weaponized PoC, confirmed ITW exploitation, and KEV listing collectively eliminate any basis for downgrade. The canonical perimeter-device role sets a CRITICAL floor that no friction argument can breach.
Crowdsourced verification payload.
Run this from any Linux/macOS auditor workstation with curl and openssl installed. Usage: bash check_cve_2026_19490.sh <target_hostname_or_ip>. No special privileges required — it only sends safe, non-exploitative HTTP requests to the target's public HTTPS port.
#!/usr/bin/env bash
# check_cve_2026_19490.sh — CVE-2026-19490 NetScaler SAML auth bypass detector
# Safe check: version fingerprint + SAML endpoint probe (no exploitation)
# Exit codes: 0=VULNERABLE, 1=PATCHED, 2=UNKNOWN
set -euo pipefail
TARGET="${1:?Usage: $0 <target_hostname_or_ip>}"
BASE="https://${TARGET}"
RESULT="UNKNOWN"
echo "[*] CVE-2026-19490 checker for NetScaler ADC/Gateway"
echo "[*] Target: ${TARGET}"
echo ""
# Step 1: Grab version from login page JavaScript
echo "[*] Step 1: Attempting version fingerprint..."
VER_RAW=$(curl -sk --max-time 10 "${BASE}/vpn/index.html" 2>/dev/null || true)
if [ -z "$VER_RAW" ]; then
echo "[-] Could not reach ${BASE}/vpn/index.html"
echo "UNKNOWN — target unreachable or not a NetScaler"
exit 2
fi
# Try to extract build string
BUILD=$(echo "$VER_RAW" | grep -oP '(13\.1|14\.1)-[0-9]+\.[0-9]+' | head -1 || true)
if [ -n "$BUILD" ]; then
echo "[+] Detected build: ${BUILD}"
MAJOR=$(echo "$BUILD" | cut -d'-' -f1)
MINOR=$(echo "$BUILD" | cut -d'-' -f2 | cut -d'.' -f1)
PATCH=$(echo "$BUILD" | cut -d'.' -f2)
if [ "$MAJOR" = "14.1" ]; then
# Fixed at 14.1-73.32
if [ "$MINOR" -gt 73 ] || ([ "$MINOR" -eq 73 ] && [ "$PATCH" -ge 32 ]); then
echo "[+] Build ${BUILD} >= 14.1-73.32 — PATCHED"
RESULT="PATCHED"
else
echo "[!] Build ${BUILD} < 14.1-73.32 — VULNERABLE"
RESULT="VULNERABLE"
fi
elif [ "$MAJOR" = "13.1" ]; then
# Fixed at 13.1-63.21
if [ "$MINOR" -gt 63 ] || ([ "$MINOR" -eq 63 ] && [ "$PATCH" -ge 21 ]); then
echo "[+] Build ${BUILD} >= 13.1-63.21 — PATCHED"
RESULT="PATCHED"
else
echo "[!] Build ${BUILD} < 13.1-63.21 — VULNERABLE"
RESULT="VULNERABLE"
fi
else
echo "[?] Unrecognized major version: ${MAJOR}"
RESULT="UNKNOWN"
fi
else
echo "[-] Could not extract build string from login page."
fi
# Step 2: Probe SAML redirect endpoint
echo ""
echo "[*] Step 2: Probing SAML redirect-binding endpoint..."
SAML_RESP=$(curl -sk --max-time 10 -o /dev/null -w "%{http_code}" "${BASE}/cgi/samlauth" 2>/dev/null || echo "000")
echo "[*] /cgi/samlauth returned HTTP ${SAML_RESP}"
if [ "$SAML_RESP" = "200" ] || [ "$SAML_RESP" = "302" ] || [ "$SAML_RESP" = "400" ]; then
echo "[!] SAML endpoint is active — exploitable path exists"
if [ "$RESULT" = "VULNERABLE" ]; then
echo "[!!!] CONFIRMED: Version vulnerable AND SAML endpoint reachable"
fi
elif [ "$SAML_RESP" = "403" ] || [ "$SAML_RESP" = "404" ]; then
echo "[+] SAML endpoint not active (HTTP ${SAML_RESP}) — exploit path may not be reachable"
if [ "$RESULT" = "VULNERABLE" ]; then
echo "[*] Version is vulnerable but SAML endpoint not exposed — check SAML config"
fi
else
echo "[?] Unexpected response from SAML endpoint"
fi
echo ""
echo "========================================"
echo "RESULT: ${RESULT}"
echo "========================================"
case "$RESULT" in
VULNERABLE) exit 0 ;;
PATCHED) exit 1 ;;
*) exit 2 ;;
esac