Citrix NetScaler Authentication Bypass
Executive Summary
CVE-2026-19490 lets an unauthenticated remote attacker mint an anonymous, cryptographically-valid NetScaler session on any Gateway (SSL VPN / ICA Proxy / CVPN / RDP Proxy) or AAA virtual server that has SAML configured (or, on older builds, any Gateway/AAA vserver regardless of SAML). The bug is a single-instruction defect in NetScaler's SAML RelayState deserialization path: the decoded length of an attacker-controlled blob is carried forward as an internal error code and used to select which internal code branch runs next. The attacker's objective is straightforward — reach that anonymous "post-login" branch, then ride the appliance's own trust position. On a Gateway virtual server this yields a real NSC_AAAC session cookie that becomes an HTTP(S) proxy into the internal network through the clientless VPN path; if the global -defaultAuthorizationAction is left at the (non-default-in-practice) ALLOW setting, that proxy reaches internal web apps, other appliances' management interfaces, and the appliance's own NITRO configuration API — and default/reused management credentials turn that into root on the box via a one-line crontab addition.
The single highest-value defensive angle is also the simplest: patch to 14.1-73.32 / 13.1-63.21 (or the FIPS/NDcPP equivalents) immediately — there is no vendor-published workaround, and CISA added this vulnerability to the KEV catalog on 2026-09-09 with a 2026-09-12 remediation due date. Where immediate patching is impossible, set set vpn parameter -defaultAuthorizationAction DENY to bound the SSRF blast radius, and treat every SAML-configured Gateway/AAA vserver as internet-reachable and in scope for emergency hardening regardless of network diagram assumptions. This CVE is unrelated in root cause to the previously-published CVE-2026-8451 and CVE-2026-8452 NetScaler packs in this library — do not conflate scope or reuse those queries as coverage for this bug.
Source Review & Web Hunter Notes
Eight sources were fetched directly (live pages, not search-engine summaries) and saved as verbatim plain-text snapshots in Citrix-NetScaler-CVE-2026-19490-Hunt-sources/. A ninth, higher-profile claim repeated across multiple secondary aggregator summaries — a PHP webshell at /var/vpn/theme/x.php and /var/vpn/theme/z.php — could not be corroborated in any of the eight fetched sources and is carried in this pack strictly as an unconfirmed/reported indicator (see Section 4).
| # | Source | Tier | Type | Contributed | Access Date |
|---|---|---|---|---|---|
| 1 | Citrix Security Bulletin CTX696939 | T1 | Vendor primary | CVSS, CWE, affected/fixed versions, precondition strings, acknowledgment | 2026-09-13 |
| 2 | Rapid7 ETR Blog | T1 | Vendor/researcher primary | Disclosure timeline, KEV cross-reference, precondition strings | 2026-09-13 |
| 3 | CISA KEV Catalog Alert (2026-09-09) | T1 | Government primary | KEV addition date, BOD 26-04 applicability | 2026-09-13 |
| 4 | NVD CVE-2026-19490 | T1 | Government primary | CVSS vector, CWE, CPE ranges, KEV due date (2026-09-12) | 2026-09-13 |
| 5 | CCB Belgium Advisory | T1 | Government CSIRT primary | Version-specific SAML precondition table, exploitation timeline confirmation | 2026-09-13 |
| 6 | Previdian Vulnerability Intelligence | T3 | Commercial sensor telemetry (cited by CCB) | Exploitation telemetry: 56 attempts / 12 IPs / 6 countries, PoC repo reference | 2026-09-13 |
| 7 | Bishop Fox Technical Analysis | T3 | Researcher technical writeup | Root-cause mechanism, impact decision tree, safe detection method, log/behavioral signatures | 2026-09-13 |
| 8 | Security Arsenal Detection Guide | T3 | Researcher/vendor blog | Generic webshell-directory Sigma pattern, triage script, hardening checklist | 2026-09-13 |
Decisions & cross-reference notes
- Exploitation telemetry conflict: an earlier working assumption cited "~10 exploitation attempts from 6 unique source IPs across Australia, Germany, Japan, and the US" attributed to Rapid7. The live Rapid7 ETR post (source #2) contains no attempt counts, IP counts, or geography at all. The verified figures shipped in this pack — 56 attempts, 12 unique attacker IPs, 6 countries (AU/DE/JP/RO/TW/US), 2026-09-03 to 2026-09-09 — come from Previdian (source #6), which is independently referenced by name in the CCB Belgium government advisory (source #5), raising confidence from low to medium.
- Webshell path/filenames — UNCONFIRMED: a claim of PHP webshells at
/var/vpn/theme/x.phpand/var/vpn/theme/z.phprecurs across search-engine-generated summaries, but none of the eight sources actually fetched (including the CCB advisory and Bishop Fox's deep technical writeup, neither of which mentions any webshell at all) contain that path or those filenames. Security Arsenal (source #8) gives only generic guidance to check/netscaler/ns_gui/,/var/vpn/, and/netscaler/portal/for any.php/.pl/.py/.shfile — a general edge-appliance persistence pattern, not a citation of this specific path. This indicator ships in Section 4 and Section 10 labeled UNCONFIRMED, not as a verified atomic IOC. - Companion CVE-2026-19489: patched in the same bulletin (CTX696939) — a memory-overflow DoS requiring SIP ALG enabled on an LSN group. No evidence found of in-the-wild exploitation of -19489; mentioned here for completeness only. Hunt focus stays on -19490's confirmed exploitation per scope.
- Related-but-distinct packs: CVE-2026-8451 and CVE-2026-8452 are separate, previously-published NetScaler CVEs in this library with different root causes (pre-auth RCE class per watchTowr's public research, not this SAML/RelayState auth-bypass). No IOC or query overlap was found or assumed between them and this pack.
Hunt Brief & Attack Chain
HYPOTHESIS: If CVE-2026-19490 is being exploited against our NetScaler Gateway/AAA infrastructure, we should see POST requests to /cgi/samlauth with anomalous RelayState lengths, anonymous SSL VPN clientless-mode login log lines with no corresponding real authentication event, and — if the internal proxy path was reached — inbound connections from the NetScaler's own IP address to internal management interfaces that it has no legitimate reason to contact.
| Step | Attacker Action | Appliance/Network Behavior | Precondition |
|---|---|---|---|
| 1 | Recon / config-precondition check | Probe for SAML action + Gateway/AAA vserver presence | None — externally observable via /cgi/samlauth response |
| 2 | Send crafted SAML POST, RelayState = base64(ctx= + N junk bytes) | Appliance dispatches on decoded length N | SAML action configured (newer builds) or any Gateway/AAA vserver (older builds) |
| 3a | N = 18 or 21 | Packet engine crashes/restarts (~45s outage); 3 crashes in ~90s can force a full reboot | Any vulnerable, reachable vserver |
| 3b | N = 11 or 16 | Anonymous session created ("created session for anonymous") | Same as above |
| 4 | Session type check | AAA vserver → dead-end anonymous session (no cookie). Gateway vserver → real NSC_AAAC cookie, SSL VPN login logged for user "anonymous" in clientless mode, redirect to /cgi/setclient?cvpn | Gateway (vpn vserver) required for step 5+ |
| 5 | Drive session as HTTP(S) proxy | Clientless VPN path proxies requests into the internal network | -defaultAuthorizationAction = ALLOW (session skips per-vserver policy) |
| 6 | Enumerate/target internal hosts, incl. NITRO API and peer appliance admin UIs | Outbound-from-NetScaler-perspective, inbound-to-internal-host connections from the NetScaler's IP | Flat/under-segmented internal network |
| 7 | Authenticate to NITRO with default/reused/phished creds | Config read/write via NITRO through the proxied channel | Weak or reused NetScaler admin credentials |
| 8 | Append one-shot crontab line via NITRO file interface | Root command execution within ~1 minute via cron | Credentialed NITRO access from step 7 |
| 9 (reported, unconfirmed) | Drop PHP webshell for durable access | New script file in a web-served appliance directory | Root/file-write access; exact path/filenames not independently confirmed — see Sections 2 & 4 |
Consolidated IOC Table
This CVE is an authentication-bypass logic bug, not malware with published hashes/C2 infrastructure. No atomic hash, IP, or domain indicators have been published by any source reviewed. The table below is behavioral/configuration indicators plus one explicitly unconfirmed reported artifact.
| Type | Value / Pattern | Confidence | Action | Context / Source |
|---|---|---|---|---|
| Config string | add authentication samlAction.* | High | hunt | Precondition indicator — Citrix bulletin CTX696939 [#1] |
| Config string | add authentication vserver .* / add vpn vserver .* | High | hunt | Precondition indicator — CTX696939 [#1] |
| HTTP behavior | POST /cgi/samlauth → HTTP 500, internal error 43524 | High | detect | Unpatched-build signature (safe 20-byte-RelayState probe) — Bishop Fox [#7] |
| HTTP behavior | POST /cgi/samlauth → HTTP 200, "Malformed Assertion" | High | enrich | Patched-build response — Bishop Fox [#7]; NOT itself malicious, used to confirm patch state |
| Log string | SSL VPN login for user "anonymous" (clientless mode) | High | detect | Post-bypass session indicator — Bishop Fox [#7] |
| HTTP path | /cgi/setclient?cvpn redirect immediately after anonymous login | High | detect | Gateway post-login redirect chain — Bishop Fox [#7] |
| Session artifact | NSC_AAAC cookie issued to an unauthenticated request | Medium | enrich | Legitimate cookie name reused in the bypass — context only, not a standalone block — Bishop Fox [#7] |
| Aggregate telemetry | 56 exploitation attempts / 12 unique attacker IPs / 6 countries (AU, DE, JP, RO, TW, US), 2026-09-03 to 2026-09-09 | Medium | pivot | Previdian sensor telemetry [#6], cited by CCB [#5]; raw IPs not published |
| PoC reference | GitHub repo TarPeg007/CVE-2026-19490 (created 2026-09-02) | Medium | pivot | Public PoC existence noted, NOT fetched or reproduced — Previdian [#6] |
| File path/name — UNCONFIRMED | /var/vpn/theme/x.php, /var/vpn/theme/z.php (PHP webshell, reportedly executes OS commands via a GET parameter) | Low / Unconfirmed | hunt (manual verification only) | Repeated in secondary aggregator summaries; NOT found in any of the 8 sources actually fetched (see Section 2). Do not treat as a confirmed compromise indicator. |
Affected Surface & Telemetry Matrix
| Surface | Affected / Vulnerable Range | Telemetry Available | Priority | Gap |
|---|---|---|---|---|
| NetScaler ADC/Gateway 14.1 | Before 14.1-73.32 | None native (FreeBSD appliance, no Falcon sensor) — syslog/CEF forwarding only | Critical | No EDR visibility on the appliance itself; depends entirely on log forwarding being configured |
| NetScaler ADC/Gateway 13.1 | Before 13.1-63.21 | Same as above | Critical | Same as above |
| NetScaler ADC FIPS | Before 14.1-73.32 FIPS | Same as above | Critical | Same as above |
| NetScaler ADC FIPS/NDcPP 13.1 | Before 13.1-37.277 | Same as above | Critical | Same as above |
| Secure Private Access Hybrid (customer-managed NetScaler instances) | Same version ranges | Same as above | Critical | Easy to overlook in inventory — explicitly called out in CTX696939 |
| Internal hosts reachable via clientless-VPN SSRF (jump hosts, other appliances, NITRO-adjacent management planes) | N/A — downstream blast radius | Falcon-native (ProcessRollup2, NetworkConnectIP4/NetworkReceiveAcceptIP4) if Falcon sensor is deployed there | High | Coverage depends entirely on where Falcon sensors happen to sit relative to the SSRF's reach |
| NetScaler 12.1 / 13.0 | End-of-life — no fix available | N/A | Critical | Migration is the only remediation per Bishop Fox [#7]; cannot be patched |
ATT&CK Mapping
| Tactic | Technique | Behavior | Query / Control |
|---|---|---|---|
| Initial Access | T1190 — Exploit Public-Facing Application | Crafted SAML RelayState against /cgi/samlauth to reach the deserialization bug | Q1, Q8 |
| Impact | T1499.004 — Endpoint DoS: Application or System Exploitation | Crash-length RelayState (18/21) repeatedly sent to force packet-engine restarts/reboot | Q2 |
| Command and Control / Lateral Movement | T1090.001 — Proxy: Internal Proxy | Anonymous Gateway session used as an SSRF proxy into the internal network | Q3, Q4 |
| Persistence / Privilege Escalation | T1053.003 — Scheduled Task/Job: Cron | One-shot crontab line appended via NITRO file interface, executed as root | Q5 |
| Persistence | T1505.003 — Server Software Component: Web Shell (UNCONFIRMED) | Reported PHP webshell in a web-served appliance directory | Q6 (low confidence, manual verification required) |
| Credential Access / Initial Access (internal pivot) | T1078.001 — Valid Accounts: Default Accounts | NITRO login via the proxied SSRF channel using default/reused/phished management credentials | Q7 |
Native Audit-Log Hunts
Non-CQL checks to run directly against the appliance or its exported config/logs — these do not require Falcon telemetry.
- Precondition inventory (per Citrix bulletin CTX696939): on each appliance, run
show ns runningConfig | grep -i samland separately grep the running config foradd authentication vserver .*andadd vpn vserver .*. Any appliance matching one or more is in scope regardless of internet-exposure assumptions. - Safe external patch-state check: Bishop Fox published an open-source, non-destructive verifier (
github.com/BishopFox/CVE-2026-19490-check, not reproduced here) that sends one SAML POST withRelayStatedecoded to exactly 20 bytes and reads the response: HTTP 500 / internal error 43524 = unpatched; HTTP 200 / "Malformed Assertion" = patched. Safe to run against production — it never touches the crash-length (18/21) or session-creating (11/16) branches. - Appliance-side triage:
find /netscaler/ns_gui /var/vpn /netscaler/portal -type f \( -name "*.php" -o -name "*.pl" -o -name "*.py" -o -name "*.sh" \)— flags any script file in a web-served directory, including but not limited to the unconfirmedx.php/z.phpclaim (Section 4). Cross-reference every hit against a documented, ticketed customization before treating it as benign. - Shell/AAA log review (30+ days retroactive):
tail -200 /var/log/shell.log,tail -100 /var/log/bash.log, andgrep -iE "login|authentication" /var/log/ns.log— look specifically for authentication log entries with no preceding legitimate login flow, and any shell command not tied to a known change ticket. - Config-integrity diff: compare current
ns.confagainst the last known-good backup; unauthorizedvserverbindings, added routes, or new responder/rewrite policies are classic persistence moves on compromised NetScaler appliances.
CrowdStrike LogScale CQL Hunt Queries
NetScaler ADC/Gateway is a FreeBSD-based appliance and does not run a Falcon sensor. Queries Q1, Q2, Q3, Q7, and Q8 target NetScaler AAA/access logs forwarded via a syslog/CEF connector into Falcon Next-Gen SIEM — their field names are illustrative snake_case NG-SIEM parser fields and must be validated against a real sample row from your own syslog connector before deployment (fields are parser-prefixed per tenant, same caveat as SaaS/IdP ingest). Queries Q4, Q5, and Q6 are Falcon-native and run against downstream endpoints with actual sensor coverage (jump hosts, log collectors, management workstations) that the SSRF pivot could reach.
Looks for: POST requests to /cgi/samlauth returning either the unpatched-build error signature (500/43524) or the patched-build response (200/Malformed Assertion), grouped by source IP. FP: your own vulnerability scanners or Bishop Fox's safe probe will match by design — see TUNING.
// HUNT: NetScaler SAML RelayState Auth-Bypass Probe/Exploitation (CVE-2026-19490) // MITRE: T1190 - Exploit Public-Facing Application // CONF: medium // FP: low // COST: low // REQUIRES: NetScaler AAA/access logs (ns.log or equivalent) forwarded via syslog/CEF into Falcon Next-Gen SIEM. Field names are illustrative snake_case NG-SIEM parser fields -- validate against a real sample forwarded row for your connector before deploying. // FALSE POSITIVES: Vulnerability scanners and Bishop-Fox-style safe patch-state probes intentionally send this exact 20-byte-RelayState request to CHECK for the bug -- expected and benign from your own team's infrastructure. // TUNING: Exclude src_ip values belonging to your own vulnerability-management/scanning subnets before alerting; a single hit from an unrecognized external src_ip against /cgi/samlauth warrants review, high volume from one src_ip is the stronger signal. // LOOKBACK: 14d http_path = "/cgi/samlauth" | http_method = "POST" | (http_status = "500" and message = *43524*) or (http_status = "200" and message like "*Malformed Assertion*") | groupBy([src_ip, ns_hostname, http_status], function=[count(as=Hits), collect(message)], limit=500) | sort(Hits, order=desc)
Looks for: repeated HTTP 500 responses from /cgi/samlauth from the same source, consistent with an attacker sweeping crash-inducing RelayState lengths (18/21) to force a DoS. FP: aggressive authorized scanning — see TUNING.
// HUNT: NetScaler Packet-Engine Crash Sweep via Crafted RelayState Length (CVE-2026-19490) // MITRE: T1499.004 - Endpoint Denial of Service: Application or System Exploitation // CONF: medium // FP: medium // COST: low // REQUIRES: NetScaler AAA/access logs forwarded via syslog/CEF into Falcon Next-Gen SIEM, plus appliance restart/uptime telemetry if available. Field names are illustrative snake_case NG-SIEM parser fields -- validate against a real sample row for your connector. // FALSE POSITIVES: Aggressive but authorized vulnerability scanners or the Bishop-Fox-style safe detection tool can generate repeated 500-class responses against /cgi/samlauth during sanctioned testing windows. // TUNING: Exclude src_ip ranges belonging to your own scanning/testing infrastructure and any documented patch-verification window before alerting; escalate immediately if the appliance also logged an unplanned packet-engine restart in the same window. // LOOKBACK: 7d http_path = "/cgi/samlauth" | http_method = "POST" | http_status = "500" | groupBy([src_ip, ns_hostname], function=[count(as=Hits)], limit=500) | test(Hits >= 3) | sort(Hits, order=desc)
Looks for: the documented post-bypass log signature — an "anonymous" SSL VPN clientless-mode login immediately followed by the /cgi/setclient?cvpn redirect. This combination should not occur absent the bug or a deliberate guest-access configuration.
// HUNT: NetScaler Anonymous SSLVPN Session to Clientless-Proxy Pivot (CVE-2026-19490) // MITRE: T1090.001 - Proxy: Internal Proxy // CONF: high // FP: low // COST: low // REQUIRES: NetScaler AAA/access logs (ns.log) forwarded via syslog/CEF into Falcon Next-Gen SIEM. Validate the exact log-line wording against a real sample from your NetScaler build/version -- the "anonymous" clientless-mode login string is documented on unpatched builds per Bishop Fox's technical analysis. // FALSE POSITIVES: None expected -- a genuine anonymous/unauthenticated SSL VPN clientless login is not a normal outcome of standard NetScaler operation absent this bug or a deliberate guest-access configuration. // LOOKBACK: 30d message like "*SSLVPN LOGIN*" | message like "*anonymous*" | (http_path = "/cgi/setclient*" or http_path like "*cvpn*") | groupBy([src_ip, ns_hostname], function=[count(as=Hits), collect(message)], limit=500) | sort(Hits, order=desc)
Looks for: Falcon-covered internal hosts accepting a connection FROM the NetScaler appliance's own IP on a management-plane port (NITRO/admin UI), consistent with the documented SSRF pivot. Substitute your NetScaler's NSIP/VIP before running. FP: legitimate health-check/LDAP/RADIUS traffic — see TUNING.
// HUNT: Inbound Connections From NetScaler Appliance IP to Internal Management Ports (Possible SSRF Pivot, CVE-2026-19490) // MITRE: T1090.001 - Proxy: Internal Proxy // CONF: medium // FP: medium // COST: low // REQUIRES: Falcon sensor coverage on the internal Windows/Linux/management hosts a compromised NetScaler's clientless-VPN proxy could reach. NetScaler itself runs no Falcon sensor (FreeBSD appliance). // FALSE POSITIVES: The NetScaler appliance legitimately talks to internal hosts for load-balancing health checks, LDAP/RADIUS auth backends, and monitoring -- baseline your NetScaler's normal internal talk-to list before alerting. // TUNING: Exclude RemoteAddressIP4/LocalPort pairs matching your NetScaler's documented health-check/LDAP/RADIUS backend list; escalate on connections to NITRO API ports or other appliances' management UIs that fall outside that baseline. // LOOKBACK: 14d #event_simpleName = NetworkReceiveAcceptIP4 | RemoteAddressIP4 = "REPLACE_WITH_NETSCALER_NSIP_OR_VIP" | in(LocalPort, values=[443, 3008, 3009, 3010, 3011, 4433, 8443]) | table([@timestamp, ComputerName, UserName, RemoteAddressIP4, LocalPort, LocalAddressIP4, aid]) | sort(@timestamp, order=desc)
Looks for: crontab modification on any Falcon-covered Linux host in the NITRO/config-management chain, matching the documented "append one-shot crontab line → root in ~1 minute" persistence step. FP: legitimate CM tooling — see TUNING.
// HUNT: Root Cron Persistence Following Suspicious NITRO/API Configuration Activity (CVE-2026-19490) // MITRE: T1053.003 - Scheduled Task/Job: Cron // CONF: medium // FP: medium // COST: low // REQUIRES: Falcon sensor coverage (Linux) on any jump host, log collector, or management workstation from which NetScaler NITRO API sessions are proxied. NetScaler's own FreeBSD OS runs no Falcon sensor -- this hunt covers the credentialed pivot Bishop Fox documented, which requires a Falcon-covered Linux host somewhere in the chain to be directly observable. // FALSE POSITIVES: Legitimate configuration-management tools (Ansible, Puppet, Chef, cron-based backup jobs) routinely modify crontab entries. // TUNING: Exclude ParentBaseFileName values matching your approved CM/orchestration tooling (e.g. ansible-playbook, puppet, chef-client) and any documented maintenance window before alerting. // LOOKBACK: 14d #event_simpleName = /ProcessRollup2|SyntheticProcessRollup2/ | CommandLine = /crontab/i | FileName = /^(crontab|sh|bash)$/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, aid]) | sort(@timestamp, order=desc)
Looks for: files or processes named exactly x.php or z.php on any Falcon-covered Linux host that mirrors/processes NetScaler web content. This indicator is UNCONFIRMED — see Sections 2 and 4 before acting on any hit. FP: extremely high — any unrelated file with these common names will match; treat every hit as a manual-verification lead only.
// HUNT: Reported (UNCONFIRMED) NetScaler Webshell Basenames on Monitored Hosts (CVE-2026-19490) // MITRE: T1505.003 - Server Software Component: Web Shell // CONF: low // FP: high // COST: low // REQUIRES: Falcon sensor coverage (Linux) on any host that mirrors, syncs, or processes NetScaler web-served content -- the NetScaler appliance itself runs no Falcon sensor. IMPORTANT: the path/filenames here are UNCONFIRMED -- multiple secondary sources repeat a claim of PHP webshells named x.php / z.php in a NetScaler theme directory, but this could NOT be independently verified against the Citrix bulletin, the CCB Belgium advisory, the Rapid7 ETR post, or Bishop Fox's technical writeup (none of which mention any webshell). Treat any hit as a lead requiring manual appliance-side verification, never as a confirmed compromise indicator on its own. See Section 2 for full provenance notes. // FALSE POSITIVES: Any legitimately named x.php/z.php file unrelated to this threat; generic script files from approved deployment/customization tooling. // TUNING: Exclude paths matching documented, change-ticketed NetScaler theme/portal customizations before alerting; require manual appliance-side verification (e.g. find /var/vpn -name "*.php") before treating any hit as confirmed compromise. // LOOKBACK: 30d #event_simpleName = /ProcessRollup2|SyntheticProcessRollup2|NewExecutableWritten/ | FileName = /^[xz]\.php$/i | table([@timestamp, ComputerName, UserName, FileName, ImageFileName, CommandLine, aid]) | sort(@timestamp, order=desc)
Looks for: configuration-changing log lines (new vservers, auth objects, saved config, new local users) that don't align with a known change window — consistent with credentialed NITRO abuse after the SSRF pivot. FP: legitimate admin activity — see TUNING.
// HUNT: NetScaler Configuration Changes via NITRO Outside Change Window (Possible Default/Reused-Credential Abuse, CVE-2026-19490) // MITRE: T1078.001 - Valid Accounts: Default Accounts // CONF: medium // FP: medium // COST: low // REQUIRES: NetScaler audit/config logs (ns.log "save ns config" / "add vpn vserver" / "add authentication" / "add system user" lines) forwarded via syslog/CEF into Falcon Next-Gen SIEM. Field names are illustrative snake_case NG-SIEM parser fields -- validate against a real sample row for your connector. // FALSE POSITIVES: Scheduled/ticketed maintenance windows, legitimate NetScaler admin configuration changes, HA sync operations. // TUNING: Exclude admin_user values belonging to named, ticketed change-management sessions and your documented maintenance windows before alerting. // LOOKBACK: 30d message like "*save ns config*" or message like "*add vpn vserver*" or message like "*add authentication*" or message like "*add system user*" | groupBy([src_ip, ns_hostname, admin_user], function=[count(as=Hits), collect(message)], limit=500) | sort(Hits, order=desc)
Looks for: a single source hitting SAML/AAA/logon-related paths at high volume — the recon pattern documented ahead of the 2026-09-03 exploitation wave. FP: authorized vulnerability scanning — see TUNING.
// HUNT: Distributed Scanning of NetScaler SAML/AAA Endpoints (Pre-Exploitation Recon, CVE-2026-19490) // MITRE: T1190 - Exploit Public-Facing Application // CONF: medium // FP: medium // COST: medium // REQUIRES: NetScaler access logs forwarded via syslog/CEF into Falcon Next-Gen SIEM. Field names are illustrative snake_case NG-SIEM parser fields -- validate against a real sample row for your connector. // FALSE POSITIVES: Authorized external/internal vulnerability scanning (InsightVM, Qualys, Nessus, Bishop Fox's public detection tool) will match this pattern by design. // TUNING: Exclude src_ip ranges belonging to your own or a contracted vulnerability-management vendor's scanning infrastructure before alerting. // LOOKBACK: 7d in(http_path, values=["/cgi/samlauth", "/cgi/login", "/vpn/index.html", "/logon/LogonPoint"]) | groupBy([src_ip], function=[count(as=Hits)], limit=500) | test(Hits >= 20) | sort(Hits, order=desc)
Custom IOA Recommendations
Custom IOAs apply to Falcon-covered endpoints in the blast radius (jump hosts, log collectors, management workstations) — not to the NetScaler appliance itself, which cannot run a Falcon sensor.
Custom IOA: Unexpected Egress From NetScaler-Adjacent Management Host
Rule Group: Network / Edge-Appliance Pivot Defense · Rule Type: Network Connection · Action: Detect · Severity: Medium · MITRE: T1090.001
Detection Logic: Flag outbound connections from a host in the NetScaler management/jump-host sensor group to a destination outside an allowlisted internal range and outside DNS/NTP/licensing ports, immediately following an inbound connection from the NetScaler's own NSIP/VIP.
Description: Approximates Security Arsenal's "suspicious outbound connection from NetScaler appliance to rare external host" Sigma concept for the Falcon-covered side of the chain (the appliance itself has no sensor).
FP Tuning Notes: Baseline the management host's normal talk-to list (patch mirrors, monitoring, backup targets) for at least 14 days before enabling; exclude those first.
Recommended Validation: From an isolated canary host in the same sensor group, initiate a benign outbound connection to a non-allowlisted internal test address after simulating an inbound connection from a test NetScaler IP; confirm the rule fires in Detect mode before considering Block.
Custom IOA: Crontab Write by Non-CM Process
Rule Group: Linux Persistence · Rule Type: Process Creation · Action: Detect · Severity: High · MITRE: T1053.003
Detection Logic: Image Filename: .*/(crontab)$ · Parent Image Filename: NOT matching your approved CM/orchestration tooling list (ansible, puppet, chef, cron-package-manager hooks).
Description: Catches the documented "NITRO file interface appends a one-shot crontab line, cron runs it as root within ~1 minute" persistence step on any Falcon-covered Linux host in the NITRO-access chain.
FP Tuning Notes: Exclude your CM tooling's parent process names; run in Detect mode for 14+ days and measure FP rate before any promotion discussion.
Recommended Validation: On an isolated test VM, run crontab -l | { cat; echo "* * * * * /bin/true"; } | crontab - from a shell that is NOT your CM tool's parent process, confirm the rule fires, then remove the test entry.
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags filename,REPLACE_WITH_CONFIRMED_WEBSHELL_FILENAME,detect,high,2026-12-12,Reported (UNCONFIRMED) NetScaler webshell filename -- not independently verified against any fetched primary source; confirm on the appliance before treating as an indicator,campaign:CitrixNetScalerAuthBypass sha256,REPLACE_WITH_SHA256_IF_WEBSHELL_RECOVERED,prevent,critical,2027-09-12,Hash of any webshell/script recovered during appliance-side triage -- no atomic hash has been published for this CVE,campaign:CitrixNetScalerAuthBypass ipv4,REPLACE_WITH_CONFIRMED_ATTACKER_IP,detect,medium,2026-10-12,Attacker source IP from your own NetScaler AAA/access log review -- no atomic attacker IPs have been publicly disclosed for this CVE (Previdian reports aggregate counts only),campaign:CitrixNetScalerAuthBypass
# Confirmed behavioral signatures (Bishop Fox technical analysis; Citrix CTX696939) HTTP path: /cgi/samlauth (POST) Unpatched signal: HTTP 500, internal error 43524, on a RelayState decoding to 20 bytes Patched signal: HTTP 200, "Malformed Assertion", on the same 20-byte probe Session log line: SSL VPN login for user "anonymous" (clientless mode) Redirect chain: /cgi/setclient?cvpn immediately following the anonymous login Session cookie: NSC_AAAC issued to a request with no preceding authentication event Crash lengths: RelayState decoding to 18 or 21 bytes -> packet engine restart (~45s outage) Anon-session len: RelayState decoding to 11 or 16 bytes -> "created session for anonymous"
# Run against `show ns runningConfig` on every appliance in inventory add authentication samlAction.* add authentication vserver .* add vpn vserver .* # Companion CVE-2026-19489 precondition (SIP ALG / LSN) -- lower priority, no ITW exploitation observed add lsn group.*sipalg.*
# Public PoC repository (existence noted only -- NOT fetched, NOT reproduced) github.com/TarPeg007/CVE-2026-19490 # Safe, vendor-independent patch-state verification tool (NOT reproduced here) github.com/BishopFox/CVE-2026-19490-check # Exploitation telemetry snapshot (Previdian, 2026-09-03 to 2026-09-09) Attempts observed: 56 Unique attacker IPs: 12 Attacker countries: AU, DE, JP, RO, TW, US Public PoC published: 2026-09-02 First observed exploit: 2026-09-03 Added to CISA KEV: 2026-09-09 (due 2026-09-12)
Detection Validation Gates
| Gate | Status / Requirement |
|---|---|
| Telemetry ready | NetScaler AAA/access logs forwarding to Falcon NG-SIEM via syslog/CEF connector; field names validated against a real sample row (Q1, Q2, Q3, Q7, Q8 depend on this) |
| Falcon endpoint coverage confirmed | Sensor deployed and healthy on every jump host / log collector / management workstation reachable from the NetScaler's SSRF path (Q4, Q5, Q6 depend on this) |
| Benign baseline captured | 14-day baseline of the NetScaler's normal internal talk-to list (health checks, LDAP/RADIUS) captured before enabling Q4/Custom IOA in anything beyond Detect |
| Positive test | Bishop Fox's safe 20-byte-RelayState probe run against a lab/test NetScaler confirms Q1 and Q3's log patterns actually appear in your specific syslog pipeline before relying on them operationally |
| Promotion review | All queries ship as hunt/detect only. No IOA in this pack should be promoted to Block before 14+ days in Detect with a measured FP rate <5%, per threat-hunter-v2 prevention-promotion guidance |
Queries must be run manually in Falcon LogScale; this pack cannot execute them. "Expected Findings" in Section 16 describes what a positive result looks like so the analyst knows what to look for.
Hardening — Tiered
TTP: CVE-2026-19490 authentication bypass · MITRE Technique: T1190 · Primary Mitigations: M1051, M1042, M1032, M1030, M1029, M1018
- Patch to 14.1-73.32 / 13.1-63.21 (or 14.1-73.32 FIPS / 13.1-37.277 FIPS-NDcPP) on every appliance, both nodes of any HA pair. Framework: MITRE M1051 (Update Software); vendor advisory CTX696939 [#1]. There is no vendor-published workaround — patching is the only fix.
- Set the global authorization bound:
set vpn parameter -defaultAuthorizationAction DENY. This does not close the bug but bounds the SSRF blast radius on any appliance that cannot be patched immediately. Framework: MITRE M1042 (Disable or Remove Feature or Program); ⚠ vendor/researcher best-practice (Bishop Fox [#7]), no formal CIS/DISA benchmark exists for NetScaler at time of writing. - Inventory every NetScaler in scope using the config-audit strings in Section 10, including forgotten/DR/cloud-marketplace instances and Secure Private Access Hybrid deployments explicitly called out in CTX696939.
- Enforce TACACS+/RADIUS-backed admin authentication with MFA on the NetScaler management plane so appliance compromise doesn't expose static local admin credentials. Framework: MITRE M1032 (Multi-factor Authentication); ⚠ vendor best-practice (Security Arsenal [#8]), no formal benchmark cited.
- Restrict the NSIP/management interface to a dedicated management VLAN with ACLs; verify the NSIP is never internet-reachable (
show ns runningConfigreview). Framework: MITRE M1030 (Network Segmentation). - Forward all appliance logs off-box — access, AAA, audit, and shell logs — via syslog/CEF with 90+ days hot retention; appliance-local logs are attacker-editable. Framework: MITRE M1029 (Remote Data Storage); ⚠ vendor best-practice (Security Arsenal [#8]).
- Rotate all NetScaler-resident admin credentials and certificates/keys if any pre-patch probing or exploitation is found in retroactive log review, given NetScaler compromises historically lead to credential theft and session hijacking downstream. Framework: MITRE M1018 (User Account Management).
- Migrate any 12.1/13.0 NetScaler instances to a supported branch — no fix is coming for EOL trains per Bishop Fox [#7].
- Default-deny appliance egress, allowlisting only licensing, NTP, and DNS; NetScaler has no legitimate business initiating arbitrary outbound connections. Framework: MITRE M1042.
- Add edge-appliance CVEs (NetScaler, and comparable perimeter Gateway/VPN products) to an emergency patch SLA equivalent to a CISA KEV entry, even before one is formally issued — perimeter access-broker appliances see disproportionately fast weaponization.
What to verify after deployment
show ns runningConfig | grep -i samland re-run the config-audit strings (Section 10) after patching to confirm precondition strings still map to a patched build version.- Bishop Fox's safe 20-byte-RelayState probe should now return HTTP 200 / "Malformed Assertion" on every scoped virtual server.
- Re-run Q1 and Q3 (Section 8) for 7 days post-patch — a continued anonymous-session log line after patching indicates the patch did not take on that node.
Deployable Playbooks
MITRE: T1190 → M1051, M1042 · Estimated deploy time: 1–3 hours per HA pair (patch download/stage/reboot dependent) · Prerequisites: Console/SSH access to each NetScaler appliance, current firmware image staged · Reboot required: Yes, for the firmware upgrade step
Step 1 — Inventory and precondition check
What it does: Confirms which appliances are in scope before touching anything. Why it works: CTX696939's own precondition strings are authoritative for what's exploitable per build.
# Run on each NetScaler appliance shell show ns version show ns runningConfig | grep -i saml show ns runningConfig | grep -E "add authentication vserver|add vpn vserver"
Verify: Record build number and whether SAML/Gateway/AAA config is present for each appliance; cross-reference against the fixed-version table in Section 5.
Step 2 — Apply the vendor patch
What it does: Closes the deserialization-length bug at its root (a single instruction change per Bishop Fox's binary diff). Why it works: MITRE M1051 — Update Software.
# Standard Citrix firmware upgrade process -- obtain the exact fixed build # for your release train from the official bulletin before upgrading: # https://support.citrix.com (search: CTX696939) # Minimum fixed builds: 14.1-73.32 / 13.1-63.21 / 14.1-73.32 FIPS / 13.1-37.277 FIPS-NDcPP # Patch BOTH nodes of any HA pair -- an unpatched secondary is fully exposed # the moment it takes over.
Verify: show ns version reflects the fixed build on both HA nodes; re-run Bishop Fox's safe probe (Section 7, item 2) and confirm HTTP 200 / "Malformed Assertion" on every scoped vserver.
Step 3 — Bound the blast radius (compensating control, pre- or post-patch)
What it does: Prevents an anonymous Gateway session from being used as an SSRF proxy into the internal network. Why it works: MITRE M1042 — Disable or Remove Feature or Program.
# NetScaler CLI set vpn parameter -defaultAuthorizationAction DENY save ns config
Verify: show vpn parameter should report defaultAuthorizationAction: DENY.
Step 4 — Harden the management plane
What it does: Removes reliance on static local admin credentials that a successful SSRF-to-NITRO pivot could otherwise abuse. Why it works: MITRE M1032 — Multi-factor Authentication.
# NetScaler CLI -- configure TACACS+ or RADIUS-backed admin auth # (exact server/shared-secret values are environment-specific; consult # your NetScaler administration guide for the "add authentication # tacacsAction" / "add authentication radiusAction" syntax for your # firmware version before applying in production) show system user # Confirm no unexpected local accounts exist beyond documented break-glass admin(s)
Verify: show system user shows only documented accounts; admin logins now route through TACACS+/RADIUS in the AAA logs.
Deploying via your RMM
The steps above are raw NetScaler CLI. To wrap them for fleet-wide execution (change-ticket linkage, staged rollout across HA pairs, compliance writeback), hand them to your RMM/orchestration tooling and ask for a deployable package.
Containment Runbook
| Phase | Actions | Owner | Evidence to Preserve |
|---|---|---|---|
| 1. Triage | Run the config-precondition audit (Section 10) across the full NetScaler inventory; run Bishop Fox's safe probe to establish current patch state per appliance | Network/Security Engineering | Probe results, build versions, precondition-match list |
| 2. Retroactive hunt | Run Q1, Q2, Q3, Q7, Q8 against 30+ days of NetScaler log history; run the appliance-side triage script (Section 7, item 3) on every appliance | Threat Hunting / SOC | Query results, appliance shell/AAA log excerpts, any script-file findings |
| 3. Contain | Apply -defaultAuthorizationAction DENY immediately on any appliance not yet patched; isolate any appliance with confirmed anonymous-session or webshell-lead findings from the network (do NOT simply reboot — volatile evidence matters) | Incident Response | ns.conf backup, memory capture if feasible, isolation timestamp |
| 4. Eradicate | Patch to the fixed build; if any indicator was confirmed, treat as full compromise — rotate all NetScaler-resident credentials/certificates, rebuild from known-good config rather than trusting an in-place clean | Incident Response + Network Engineering | New credential/cert inventory, rebuild change record |
| 5. Recover & monitor | Re-run Bishop Fox's safe probe and Q1/Q3 for 7 days post-patch; confirm TACACS+/MFA and log-forwarding hardening (Section 12) are in place before closing the incident | SOC | Post-patch probe results, 7-day query re-run output |
| 6. Report | Document whether pre-patch exploitation was found; patching alone does not remediate historic compromise per CCB Belgium guidance [#5] | IR Lead | Final incident report, KEV/BOD 26-04 compliance record if FCEB |
Detection Coverage Map
| MITRE Technique | Technique Name | CQL Query | Custom IOA | IOC Block | Coverage |
|---|---|---|---|---|---|
| T1190 | Exploit Public-Facing Application | ✓ Q1, Q8 | — | — | Good |
| T1499.004 | Endpoint DoS: App/System Exploitation | ✓ Q2 | — | — | Partial |
| T1090.001 | Proxy: Internal Proxy | ✓ Q3, Q4 | ✓ IOA-1 | — | Good |
| T1053.003 | Scheduled Task/Job: Cron | ✓ Q5 | ✓ IOA-2 | — | Good |
| T1505.003 | Server Software Component: Web Shell | ✓ Q6 (low confidence) | — | REPLACE_WITH_ placeholder only | Partial — indicator unconfirmed |
| T1078.001 | Valid Accounts: Default Accounts | ✓ Q7 | — | — | Partial |
| T1611-adjacent (NITRO config read/write via SSRF) | Not independently mapped — appliance-config-API abuse via a proxied channel is closest to T1090.001 / T1078.001 above | Covered by Q4/Q7 above | — | — | GAP — no dedicated NITRO-audit-log query; native check in Section 7 is the primary control |
Coverage Summary: 6 of 6 mapped techniques have at least partial detection coverage; 8 CQL queries and 2 Custom IOA recommendations shipped. The clearest priority gap is native NITRO API audit-log ingestion into Falcon — today that control lives only as a manual native hunt (Section 7) because NetScaler's NITRO audit trail is not commonly forwarded in a structured way; if your syslog connector exposes NITRO API call logs, extend Q7 to key on the specific API session/user field rather than only config-changing keywords.
All five Detection Validation Gates from Section 11 apply before any of the above move beyond hunt/Detect mode.
Hunt Summary Ticket
TITLE: Citrix NetScaler CVE-2026-19490 Authentication Bypass -- Hunt & Hardening
SEVERITY: CRITICAL (CVSS v4.0 9.3) -- CISA KEV 2026-09-09, due 2026-09-12 -- exploited ITW since 2026-09-03
SCOPE: NetScaler ADC/Gateway 14.1 < 73.32, 13.1 < 63.21 (+ FIPS/NDcPP equivalents) configured as
Gateway (SSL VPN/ICA Proxy/CVPN/RDP Proxy) or AAA vserver; includes Secure Private Access
Hybrid customer-managed instances
HYPOTHESIS: If exploited, expect POST /cgi/samlauth with anomalous RelayState lengths, "anonymous"
SSLVPN clientless-mode logins with no real auth event, and (if defaultAuthorizationAction=
ALLOW) inbound connections from the NetScaler's own IP to internal management interfaces
QUERIES: Q1-Q8 (Section 8) -- run in Falcon LogScale manually; this pack cannot execute them
DO FIRST: 1) Inventory + precondition audit (Section 10 config strings) on every NetScaler appliance
2) Run Bishop Fox's safe 20-byte-RelayState probe against each to establish current patch state
3) Patch to 14.1-73.32 / 13.1-63.21+ ; if immediate patch is impossible, set
`set vpn parameter -defaultAuthorizationAction DENY` as an interim compensating control
FINDINGS: [Populate after queries are run -- see Section 11 "Expected Findings" guidance. Claude/this
pipeline does not execute queries; do not treat this field as pre-filled evidence.]
GAPS: - Webshell path/filenames (/var/vpn/theme/x.php, z.php) are UNCONFIRMED -- see Sections 2 and 4
- No dedicated structured NITRO audit-log query; native manual check only (Section 7)
- Exploitation telemetry (56 attempts/12 IPs/6 countries) sourced from Previdian (T3), not a
T1 primary -- treat as Medium confidence context, not a definitive attacker count
ACTIONS: Immediate: patch + defaultAuthorizationAction=DENY (Section 12, Immediate tier)
Pending approval: TACACS+/MFA rollout, management VLAN/ACL restriction, log-forwarding buildout
OWNER: [Assign per your on-call/IR rotation]
VERSION: v0.1 -- 2026-09-12
Changelog
References
| Tier | Source | Used For | Access Date |
|---|---|---|---|
| T1 | Citrix Security Bulletin CTX696939 | CVSS/CWE, affected/fixed versions, precondition strings, acknowledgment | 2026-09-13 |
| T1 | Rapid7 ETR Blog | Disclosure timeline, KEV cross-reference | 2026-09-13 |
| T1 | CISA KEV Catalog Alert | KEV addition confirmation, BOD 26-04 | 2026-09-13 |
| T1 | NVD CVE-2026-19490 | CVSS vector, CWE, KEV due date | 2026-09-13 |
| T1 | CCB Belgium Advisory | Version-specific SAML precondition table, exploitation timeline | 2026-09-13 |
| T3 | Previdian Vulnerability Intelligence | Exploitation telemetry, PoC repo reference | 2026-09-13 |
| T3 | Bishop Fox Technical Analysis | Root-cause mechanism, safe detection method, behavioral signatures | 2026-09-13 |
| T3 | Security Arsenal Detection Guide | Generic webshell-directory pattern, triage script, hardening checklist | 2026-09-13 |
Related-but-distinct prior library coverage: CVE-2026-8451 and CVE-2026-8452 (separate NetScaler CVEs, different root cause — not merged into this pack's scope).
Generated: 2026-09-12 · HuntPack v0.1 · Citrix NetScaler CVE-2026-19490