Vulnerability research
NetScaler: when handshake fragments overrun a buffer
A VPN gateway processes connection requests before an employee logs in. NetScaler CVE-2026-88772 fails at that stage: assembling fragments can copy more data than a buffer holds. Exploitation is confirmed. Older appliances with DTLS enabled need urgent patching and an investigation of their earlier exposure.

In this article
A company puts its VPN gateway on the internet so employees can connect securely from elsewhere. Before it checks an employee's identity, however, the gateway has work to do: receive packets, negotiate encryption and assemble handshake messages that arrive in pieces. The sender has not logged in yet. A flaw at this stage reaches the appliance before passwords and multifactor authentication can protect the login.
NetScaler CVE-2026-88772 sits in that assembly process. On September 27, Citrix confirmed exploitation and CISA added it to the Known Exploited Vulnerabilities catalog. A patch analysis published on the 29th explained the failure: after deciding that a message is complete, the program copies its stored contents into contiguous memory. That copy lacked a capacity bound. Passing the completeness check still left the subsequent write unsafe.
Internet-reachable DTLS services on older firmware need emergency patching. Strong passwords, login rate limits and MFA operate after this failure has already occurred. The companion 88771 log-command-injection flaw follows a background script; 88772 occurs while receiving network data. Each needs its own exposure check.
1 The work that happens before login
DTLS provides encrypted communication over UDP. Packets can be lost or arrive out of order, and a long handshake message can be split into fragments. The receiver must remember which message each fragment belongs to and where it fits, then resume negotiation when the missing pieces arrive. The handshake format in RFC 6347 separates the complete message's length, its message_seq, the fragment's fragment_offset and its fragment_length. These fields answer different questions.
Consider an eight-byte message in two fragments: one covers positions zero through three, the other four through seven. The receiver now has every message byte. Memory may hold more than those eight bytes, because an implementation can retain record headers, internal buffer structures or other temporary contents. When it copies the data next, it needs to account for which of those bytes it will move.
DTLS also has a cookie round trip: the server returns a value and asks the client to present it again. The protocol describes its purpose as checking that the sender can receive replies at that address, reducing resource exhaustion through spoofed source addresses. Someone who can send and receive packets can complete that exchange. Employee authentication still comes later. Exposure assessment needs to follow the packet's route to the service.
Citrix's security bulletin identifies enabled DTLS as the prerequisite, with DTLS enabled by default on VPN virtual servers. Searching configuration text for an explicit DTLS service can miss an ordinary SSL VPN virtual server that inherits this default. Dedicated DTLS virtual servers and load-balancing services also matter. Check the effective settings and network reachability of each virtual server.
2 A complete message can still overflow its destination
Comparing 14.1-73.30 with 14.1-73.37, watchTowr found a copy in the nsppe Packet Engine that walks linked NetScaler Buffers (NSBs) and combines their contents into a 0x8c00-byte destination—35,840 bytes. The old loop lacked a remaining-capacity check for each copy; the patch adds one. Citrix has not published source function names or line numbers. The appliance mechanism below comes from that firmware analysis; SOSEC obtained no firmware or independent reproduction of appliance code execution.
The published example shows how the lengths diverge. A complete message declares 120 bytes, and each fragment advances reassembly by one byte, while its NSB node retains substantially more record content. Once all 120 positions are covered, the program considers the message complete and walks the chain to copy node contents. It is now moving the actual retained bytes, whose total can greatly exceed the 120 bytes used to track progress. The destination still holds only 35,840 bytes.
Completing reassembly therefore still leaves a capacity check before each write. Valid fragments need that check too. Overlaps caused by retransmission must be handled according to the protocol; rejecting every overlap would break legitimate traffic.
What follows an out-of-bounds write depends on adjacent memory, control over the written bytes and the code that later consumes corrupted state. A crash is one possible outcome; Citrix also confirms remote code execution as an impact. Operators should preserve an unexpected restart for investigation, then correlate its time with connections, processes and file changes. A restart alone cannot establish that attacker code executed.
3 Protect every write
This independent model shows where a capacity check belongs. It handles integers only: no network requests and no NetScaler packets. Suppose a destination holds 64 bytes and a saved header takes eight. Every remaining chunk must fit in the space left. All lengths below are validated nonnegative integers:
def fits(capacity, header_size, chunks):
if header_size > capacity:
return False
remaining = capacity - header_size
for size in chunks:
if size > remaining:
return False
remaining -= size
return True
assert fits(64, 8, [20, 20, 16])
assert not fits(64, 8, [20, 20, 17])
assert not fits(64, 65, [])
The first case fills the destination exactly: 8 + 20 + 20 + 16 = 64. The second exceeds it by one byte and must be rejected before the third copy starts. In the third, even the header is too large and must be rejected first. SOSEC ran these three assertions locally; all passed. They validate this model's accounting. Appliance correctness still depends on the vendor implementation and appliance tests.
The order matters too: compare the next chunk with remaining space before subtracting. In low-level code with fixed-width integers, adding several external lengths before comparing the sum with capacity can overflow the sum itself. Implementers must also reject negative lengths, validate pointer ranges, release temporary state on failure and use the same length for both the check and the copy. Two independently chosen values can reopen the gap.
Regression tests should allow valid single- and multi-fragment messages and an exact fit, while rejecting one excess byte before a write. Duplicates, reordering and overlaps should follow the protocol, and the next valid connection should work after interruption or rejection. Run these checks in an isolated environment. A sample that crashes an old appliance covers only one outcome; trying it against a production gateway also interrupts service.
4 What to change on the gateway
Inventory customer-managed instances, including standby nodes and NetScaler instances used by Secure Private Access Hybrid. Citrix updates its managed cloud services. Prioritize older instances with reachable DTLS services. Temporarily disabling the relevant DTLS service or blocking its UDP entry point at a controlled network boundary reduces this vulnerability's exposure. Remote-access performance and availability may change; verify any transport fallback with the actual clients. The companion 88771 vulnerability still requires an upgrade.
On September 30, the official download page lists 14.1-73.37 and 13.1-64.24 for the ordinary release branches. Stay within the appropriate product line; ordinary packages cannot substitute for FIPS or NDcPP builds:
| Branch | First fixed | Deployment choice |
|---|---|---|
| ADC / Gateway 14.1 | 14.1-73.37 | 14.1-73.37 |
| ADC / Gateway 13.1 | 13.1-64.23 | 13.1-64.24 |
| ADC 14.1 FIPS | 14.1-73.37 FIPS | 14.1-73.37 FIPS in that branch |
| ADC 13.1 FIPS / NDcPP | 13.1-37.279 | 13.1-37.279 for the matching FIPS / NDcPP line |
Choose 13.1-64.24 on the ordinary 13.1 branch because 13.1-64.23 can reboot cyclically when variables are configured. Citrix's supplemental guidance documents that condition, which the read-only show ns variable command can check. Upgrades also require signed SAML assertions, so confirm the identity provider's configuration before changing the gateway. The 15.1 Technology Preview remained vulnerable at the cutoff, and Citrix does not permit its production use.
Scanner results can conflict with this package table. At 04:07 UTC on September 30, 2026, NVD was Analyzed, but its machine-readable 14.1 FIPS range still included fixed release 14.1-73.37 as an affected endpoint, contrary to the vendor bulletin and NetScaler CNA. Use the vendor package table to check the repair. Scores also come from different standards: NIST assigns CVSS 3.1 at 8.1 and the CNA assigns CVSS 4.0 at 9.5, so the difference is not a rise or fall on one severity scale.
Verify recovery with normal business traffic: check the running build on every node, HA status and intended DTLS settings, then complete an authorized login and application session while checking stability and logs. Keep necessary temporary restrictions until those checks finish. If the upgrade fails, keep unpatched nodes isolated. For ordinary 13.1 deployments, our rollback choice also remains 13.1-64.24 to avoid reintroducing the known reboot issue. Other branches must stay at or above their first-fixed release. If an operational emergency requires booting older firmware, keep it isolated while the incident owner decides how to restore service.
5 Investigate the time before the patch
Confirmed exploitation adds another obligation: determine whether someone entered during the exposure window. Citrix's suspected-compromise guide calls for preserving time information, logs and relevant instance or disk evidence, followed by isolation, investigation and rebuilding. Collecting a Packet Engine core causes a warm restart and disconnects SSH; account for its effects on evidence and service before proceeding. Preserve external syslog records too.
Signs of compromise widen recovery to identities and connected systems: investigate related authentication services, revoke exposed credentials, certificates and private keys, rebuild from trusted media, then restore a reliable pre-compromise configuration and rotate secrets. Citrix's IOC checks can assist, with coverage changing as detection logic evolves. A clean result leaves unrepresented attacker behavior to investigate. Record the detection version and time to make the result interpretable.
6Evidence and sources
6.1Sources and material
- Citrix: prerequisites and fixed releases, CTX697096https://support.citrix.com/external/article/CTX697096
- watchTowr: September 29 DTLS overflow and firmware patch analysishttps://labs.watchtowr.com/here-we-go-again-citrix-netscaler-dtls-preauth-memory-overflow-cve-2026-88772/
- RFC 6347: DTLS handshake, cookies and fragmentationhttps://www.rfc-editor.org/rfc/rfc6347.html#section-4.2
- Citrix: current NetScaler download brancheshttps://www.citrix.com/downloads/citrix-adc/
- Citrix: configuration, IOCs, 13.1 upgrade and SAML guidancehttps://community.citrix.com/techzone-blogs/110_security-updates/netscaler-adc-and-netscaler-gateway-security-bulletin-for-cve-2026-88771-through-cve-2026-88778/
- Citrix: evidence preservation, isolation and recovery after suspected compromisehttps://support.citrix.com/external/article/CTX694799/steps-to-take-if-netscaler-adc-is-suspec.html
- CISA: live KEV cataloghttps://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json
- NetScaler CNA: original CVE-2026-88772 recordhttps://cveawg.mitre.org/api/cve/CVE-2026-88772
- NVD: independent score, product matching and change historyhttps://nvd.nist.gov/vuln/detail/CVE-2026-88772