Someone left the castle gate's lock mechanism exposed, and an attacker just needs to whisper the right SAML incantation to walk in as root
CVE-2026-107406 is a heap buffer overflow in the SAML authentication processing of Citrix NetScaler ADC and NetScaler Gateway. When an appliance is configured as a SAML Service Provider (SP) or Identity Provider (IdP), a crafted SAML request with oversized signature or attribute elements overflows fixed-size buffers in the packet engine (nsppe), corrupting adjacent heap metadata and function pointers. This achieves unauthenticated remote code execution with root privileges — or, at minimum, a denial-of-service crash. All builds before 14.1-73.46 and 13.1-64.29 are affected, with older builds (pre-14.1-73.37, pre-13.1-64.23) vulnerable in both SP *and* IdP configurations, while intermediate builds (14.1-73.37–73.41, 13.1-64.23–64.28) are vulnerable only in IdP mode. FIPS and NDcPP variants track the same ranges. End-of-life branches (12.1, 13.0) receive no patch at all.
No vendor CVSS baseline was provided by the submitter, but Citrix's own bulletin assigns CVSS v4.0 9.5 with AC:H — acknowledging that heap exploitation requires some precision. Our assessment lands at CRITICAL / 9.4 because the attack-complexity friction is substantially offset by (a) a public Python PoC (ctroy999/CVE-2026-107406) demonstrating reliable pre-auth root shells, (b) 21,000–42,000 internet-facing NetScaler instances tracked by Shadowserver and Censys, (c) Feedly threat-intel reporting exploitation activity observed via infosec.exchange as of October 13, 2026, and (d) Poppelgaard's advisory noting Citrix has 'observed targeted attacks on unmitigated appliances.' NetScaler is a canonical network-edge appliance — the blast radius of a compromised appliance is perimeter breach, credential theft from the SAML authentication plane, and direct internal-network pivot. The CRITICAL floor holds.
5 steps from start to impact.
Identify internet-facing NetScaler
NS-Cache, Citrix-TransactionId) and the /vpn/index.html login page fingerprint make discovery trivial. Shadowserver currently tracks ~21,000 exposed ADC instances and ~2,300 Gateway instances; Censys reports ~42,000 total.- Internet-connected NetScaler instance with HTTPS listener
- None — mass scanning is automated and the fingerprint is well-known
Probe for SAML endpoint
AuthnRequest or accesses the IdP metadata URL (/saml/login, /cgi/samlauth, or the configured SP consumer endpoint). A valid SAML error response confirms the appliance has SAML authentication configured. CyCognito research found ~30% of observed NetScaler assets present authentication login panels suggesting SAML is active.- NetScaler configured as SAML SP or SAML IdP
- Non-SAML deployments (pure load-balancing, non-SAML VPN) are not reachable — this is the primary attack-surface reducer
- External scanners cannot confirm SAML config with certainty, only infer from response behavior
Send crafted SAML payload
--list targets.txt) and operates in check, exploit, or DoS modes. No authentication is required — the overflow occurs during pre-auth SAML processing.- Network reachability to the SAML endpoint on port 443
- No WAF or IPS rule blocking oversized SAML payloads
- AC:H in CVSS reflects that heap layout must be favorable for code execution vs. crash — but the PoC demonstrates reliable exploitation
- Some next-gen WAFs may block abnormally large SAML XML payloads, though most default rulesets do not inspect SAML content depth
<samlp:AuthnRequest> or <saml:Assertion> elements; Suricata rule SID for CVE-2026-107406 if published; packet-engine crash logs (nsppe core dumps)Achieve root-level code execution
-c flag demonstrates direct command execution (-c 'id; uname -a'). Root on a NetScaler means full control of the appliance's configuration, TLS private keys, session cookies, and network routing.- Successful heap overflow with favorable heap layout
- ASLR and heap randomization on modern NetScaler builds may reduce first-attempt reliability, but the PoC accounts for this
- Crash-before-exploit attempts produce nsppe restarts that are detectable
/var/nslog/; new files in /nsconfig/.slap/ or /var/tmp/.ux/; unexpected cron entries or admin accounts in ns.confPivot to internal network
ns.conf, active session cookies, and TLS certificates. They can inject webshells for persistent access, modify routing to intercept traffic, or use the appliance's internal-facing interfaces to reach backend servers directly. Historical NetScaler compromises (CVE-2023-3519, CVE-2023-4966 'Citrix Bleed') demonstrate that attackers immediately pivot to AD reconnaissance, credential harvesting, and ransomware staging.- Persistent root access on the NetScaler appliance
- Internal network segments reachable from the appliance's management or backend interfaces
- Network microsegmentation may limit lateral movement from the NetScaler VLAN
- EDR on internal hosts may detect post-exploitation tools deployed from the appliance
show ns version on every appliance and compare against fixed build numbers.AuthnRequest and Response XML payloads exceeding normal size thresholds (e.g., >64KB). This is an imperfect stop-gap — it may break legitimate large SAML assertions from some IdPs, and a sophisticated attacker may craft payloads below the threshold. Deploy within 24 hours as a bridge to patching.samlAction or samlIdPProfile configuration entries entirely. This eliminates the vulnerable code path. This breaks SSO for users authenticating via SAML — assess business impact before executing. Non-SAML authentication methods (LDAP, RADIUS, local) remain functional. Restores the appliance to a non-vulnerable state for this specific CVE.- Generic rate-limiting on the SAML endpoint — the exploit requires only a single crafted request, not a flood. Rate limiting will not prevent exploitation.
- NetScaler's built-in AppFirewall (without SAML-specific signatures) — the default AppFirewall profile does not inspect SAML XML payload depth for buffer-overflow patterns. Custom signatures would need to be authored and are not provided by Citrix.
- TLS client certificate authentication on the VPN vserver — the SAML processing occurs before client-cert validation in the authentication pipeline, so the overflow is triggered before the mTLS check.
- Network segmentation behind the NetScaler — this limits post-exploitation lateral movement but does nothing to prevent the initial compromise of the appliance itself. The attacker still gets root on your perimeter gateway.
The supporting signals.
| In-the-Wild Status | Feedly threat intel reports exploitation activity observed via infosec.exchange as of October 13, 2026. Poppelgaard's advisory notes Citrix has 'observed targeted attacks on unmitigated appliances.' Not yet on CISA KEV, but CISA issued a Sept 27 alert for related NetScaler zero-days. CISA has documented 27 actively exploited Citrix flaws since Nov 2021, including 7 weaponized in ransomware. |
|---|---|
| Proof-of-Concept | Public PoC available: ctroy999/CVE-2026-107406 on GitHub — Python exploit with check/exploit/DoS modes, pre-auth root RCE, batch targeting. Also indexed on Sploitus. A second repo techupdate24/citrix-netscaler-rce-cve-2026-107406 was noted by Feedly. No entry found on pocindex.io at time of analysis. |
| EPSS | 0.471% (0.00471) — relatively low percentile, but EPSS historically underweights edge-appliance vulns in the first two weeks after disclosure. Expect rapid increase given public PoC and exploitation reports. |
| KEV Status | Not listed as of 2026-10-16. Given the exploitation reports and CISA's pattern with NetScaler CVEs, KEV addition is likely imminent. |
| CVSS Vector | CVSS v4.0: 9.5 — AV:N/AC:H/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:L. Network-reachable, no privileges, no user interaction. AC:H reflects heap exploitation complexity. Subsequent-system impact is high across C/I/A — reflecting the appliance's gateway role. |
| Affected Versions | 14.1 branch: all builds before 73.46 (SP+IdP for <73.37; IdP-only for 73.37–73.41). 13.1 branch: all builds before 64.29 (SP+IdP for <64.23; IdP-only for 64.23–64.28). FIPS/NDcPP: corresponding ranges. EOL branches (12.1, 13.0): vulnerable, no patch available. |
| Fixed Versions | 14.1-73.46, 13.1-64.29, 14.1-73.46 FIPS, 13.1-37.283 FIPS/NDcPP. ⚠️ The Oct 3 patch (14.1-73.41 for CVE-2026-88779) falls *within* the affected range — organizations who patched Oct 3 must patch again. |
| Internet Exposure | Shadowserver: ~21,000 ADC + ~2,300 Gateway instances internet-facing. Censys: ~42,000 total. Unit 42 Cortex Xpanse: ~50,277 potentially vulnerable. CyCognito: top sectors — Industrials (26.2%), Financials (11.2%), Healthcare (10.3%). |
| Disclosure Date | 2026-10-08 via Citrix security bulletin CTX697191. |
| Reporting / Credits | Not publicly attributed to a named researcher. Citrix coordinated disclosure. Community tooling by Thomas Poppelgaard (netscaler-ctx697096-checker) covers IoC sweep for this CVE alongside CVE-2026-88771–88779. |
Sources.
- Citrix Security Bulletin CTX697191
- BleepingComputer — Citrix warns admins to patch new NetScaler RCE flaw immediately
- CyCognito — Emerging Threat: CVE-2026-107406 NetScaler RCE via SAML
- Poppelgaard — CVE-2026-88771 through CVE-2026-107406 NetScaler Guide
- Thomas Poppelgaard — netscaler-ctx697096-checker (IoC tool)
- ctroy999/CVE-2026-107406 — Public PoC Exploit
- Forkast — Oct 3 Fix Sits Inside Oct 8 Affected Range
- CISA Alert — Critical Zero-Day Vulnerabilities in Citrix NetScaler
Why this verdict
- Pre-auth, unauthenticated, network-reachable RCE: The attack requires zero credentials, zero user interaction, and hits the SAML endpoint on port 443 — the same port that must be open for the appliance to function. This is the most dangerous attack posture possible for a perimeter device.
- Public weaponized PoC with root execution: The ctroy999/CVE-2026-107406 repository provides a turnkey Python exploit with batch-targeting, check/exploit/DoS modes, and direct command execution as root. This collapses the skill barrier from 'heap exploitation researcher' to 'script runner.'
- Role multiplier — NetScaler is a canonical network-edge appliance: NetScaler ADC/Gateway is *definitionally* a perimeter device. 100% of its installed base occupies the high-value network-edge role — it IS the VPN gateway, the SAML authentication plane, the load balancer sitting between attackers and internal networks. A compromised NetScaler yields TLS private keys, LDAP bind credentials, SAML signing keys, active session tokens, and a direct network path to backend infrastructure. The blast radius is perimeter breach → credential harvest → domain compromise → fleet-scale impact. Per the deployment-role floor rule, the verdict floor is CRITICAL because the affected component is canonically a high-value-role component and ≥10% of installs occupy that role by definition (it's 100%).
- Massive internet exposure: 21,000–50,000 internet-facing instances across critical sectors (financial, healthcare, industrial). This is not a theoretical attack surface — it is actively enumerable.
- Exploitation signals already emerging: Feedly cites exploitation activity via infosec.exchange as of Oct 13. Poppelgaard's advisory references Citrix observing 'targeted attacks on unmitigated appliances.' Historical precedent: every major NetScaler CVE (CVE-2023-3519, CVE-2023-4966, CVE-2026-88771) was mass-exploited within days of disclosure.
- No workaround exists: Citrix provides no mitigation short of upgrading or fully disabling SAML authentication — which breaks SSO for the entire user population.
- AC:H provides only marginal friction: The CVSS vector includes
AC:Hfor heap exploitation complexity, but the public PoC demonstrates reliable exploitation, reducing this to a theoretical rather than practical barrier. We deduct 0.1 from a hypothetical 9.5 baseline for this residual uncertainty rather than treating it as a meaningful downgrade.
Why not higher?
A 10.0 would require trivially reliable exploitation with no preconditions. The SAML configuration prerequisite means non-SAML NetScaler deployments (pure load-balancing, non-SAML VPN) are not vulnerable, and the heap overflow's AC:H classification means some attempts may crash the service rather than achieve code execution. These factors prevent a maximum score, though they are narrow constraints given the public PoC's demonstrated reliability.
Why not lower?
Downgrading below CRITICAL would require evidence that the high-value-role blast radius is limited — but NetScaler is *the* perimeter gateway by definition. Every instance is internet-facing, handling authentication, and bridging external-to-internal networks. The SAML prerequisite affects perhaps 30–70% of deployments (CyCognito estimates ~30% show auth panels; many more have SAML configured but not externally fingerprinted). Even at the conservative 30% estimate, that's 6,000–15,000 directly exploitable internet-facing appliances across critical infrastructure sectors. A public PoC, emerging exploitation, and no available workaround make any verdict below CRITICAL indefensible for this component class.
Crowdsourced verification payload.
Run this script directly on each NetScaler appliance via SSH or console as nsroot (or any account with shell access). Invoke with: bash /tmp/check_cve_2026_107406.sh. The script checks the running firmware build and SAML configuration to determine vulnerability status. No network access or external dependencies required.
#!/bin/bash
# CVE-2026-107406 Vulnerability Checker for NetScaler ADC/Gateway
# Run on the NetScaler appliance as nsroot via SSH
# Output: VULNERABLE / PATCHED / UNKNOWN
set -euo pipefail
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
echo "=== CVE-2026-107406 Check ==="
echo "Checking NetScaler build version and SAML configuration..."
echo ""
# Get version info
VERSION_OUTPUT=$(nsapimgr_wr.sh -ys call=ns_get_version 2>/dev/null || cat /var/nsinstall/build_version 2>/dev/null || echo "UNKNOWN")
# Try to parse major.minor-build format
if echo "$VERSION_OUTPUT" | grep -qoE '[0-9]+\.[0-9]+-[0-9]+\.[0-9]+'; then
BUILD_STRING=$(echo "$VERSION_OUTPUT" | grep -oE '[0-9]+\.[0-9]+-[0-9]+\.[0-9]+' | head -1)
MAJOR_MINOR=$(echo "$BUILD_STRING" | cut -d'-' -f1)
BUILD_NUM=$(echo "$BUILD_STRING" | cut -d'-' -f2)
echo "Detected build: $BUILD_STRING"
else
echo -e "${YELLOW}UNKNOWN — Could not parse NetScaler version. Verify manually with 'show ns version'.${NC}"
exit 2
fi
# Check SAML configuration
SAML_SP=false
SAML_IDP=false
NSCONF="/nsconfig/ns.conf"
if [ -f "$NSCONF" ]; then
if grep -q 'add authentication samlAction' "$NSCONF" 2>/dev/null; then
SAML_SP=true
echo "SAML Service Provider (SP): CONFIGURED"
fi
if grep -q 'add authentication samlIdPProfile' "$NSCONF" 2>/dev/null; then
SAML_IDP=true
echo "SAML Identity Provider (IdP): CONFIGURED"
fi
if [ "$SAML_SP" = false ] && [ "$SAML_IDP" = false ]; then
echo "SAML configuration: NOT FOUND"
echo ""
echo -e "${GREEN}PATCHED — No SAML SP or IdP configuration detected. This appliance is not affected by CVE-2026-107406.${NC}"
exit 0
fi
else
echo -e "${YELLOW}WARNING: Cannot read $NSCONF — assuming SAML may be configured.${NC}"
SAML_SP=true
SAML_IDP=true
fi
echo ""
# Version comparison logic
compare_build() {
local major_minor="$1"
local build="$2"
local fix_build="$3"
# Compare build numbers as floating point
echo "$build $fix_build" | awk '{if ($1 >= $2) print "FIXED"; else print "VULN"}'
}
case "$MAJOR_MINOR" in
14.1)
RESULT=$(compare_build "14.1" "$BUILD_NUM" "73.46")
if [ "$RESULT" = "FIXED" ]; then
echo -e "${GREEN}PATCHED — Build $BUILD_STRING is at or above the fixed version 14.1-73.46.${NC}"
exit 0
else
# Check if in IdP-only range (73.37-73.41) or older (SP+IdP)
IN_IDP_RANGE=$(echo "$BUILD_NUM" | awk '{if ($1 >= 73.37 && $1 <= 73.41) print "YES"; else print "NO"}')
if [ "$IN_IDP_RANGE" = "YES" ]; then
if [ "$SAML_IDP" = true ]; then
echo -e "${RED}VULNERABLE — Build $BUILD_STRING is in the 73.37-73.41 range with SAML IdP configured. Upgrade to 14.1-73.46+.${NC}"
exit 1
else
echo -e "${GREEN}PATCHED — Build $BUILD_STRING is in the IdP-only vulnerable range but no SAML IdP is configured.${NC}"
exit 0
fi
else
echo -e "${RED}VULNERABLE — Build $BUILD_STRING is below 14.1-73.37 with SAML configured (SP and/or IdP). Upgrade to 14.1-73.46+.${NC}"
exit 1
fi
fi
;;
13.1)
RESULT=$(compare_build "13.1" "$BUILD_NUM" "64.29")
if [ "$RESULT" = "FIXED" ]; then
echo -e "${GREEN}PATCHED — Build $BUILD_STRING is at or above the fixed version 13.1-64.29.${NC}"
exit 0
else
IN_IDP_RANGE=$(echo "$BUILD_NUM" | awk '{if ($1 >= 64.23 && $1 <= 64.28) print "YES"; else print "NO"}')
if [ "$IN_IDP_RANGE" = "YES" ]; then
if [ "$SAML_IDP" = true ]; then
echo -e "${RED}VULNERABLE — Build $BUILD_STRING is in the 64.23-64.28 range with SAML IdP configured. Upgrade to 13.1-64.29+.${NC}"
exit 1
else
echo -e "${GREEN}PATCHED — Build $BUILD_STRING is in the IdP-only vulnerable range but no SAML IdP is configured.${NC}"
exit 0
fi
else
echo -e "${RED}VULNERABLE — Build $BUILD_STRING is below 13.1-64.23 with SAML configured (SP and/or IdP). Upgrade to 13.1-64.29+.${NC}"
exit 1
fi
fi
;;
12.1|13.0)
echo -e "${RED}VULNERABLE — Build $BUILD_STRING is END-OF-LIFE with no patch available. Migrate to a supported branch immediately.${NC}"
exit 1
;;
*)
echo -e "${YELLOW}UNKNOWN — Unrecognized NetScaler version $MAJOR_MINOR. Verify manually.${NC}"
exit 2
;;
esac