On June 17, 2025, Citrix published an advisory detailing CVE-2025-5777 and CVE-2025-5349. Affected products include:
On June 25, 2025, they also published an advisory detailing CVE-2025-6543. Affected products include:
Of the three vulnerabilities, two of them have been receiving a bit of buzz:
While we’ve developed a working exploit for one of these issues… it’s kinda hard to know which is which given the sparse technical details in the advisories. That said, based on the descriptions of the issues, the similarities to CitrixBleed, and the versions of Citrix NetScaler available to us for testing, we believe we’ve developed a working exploit for CVE-2025-5777. It’s also totally possible we’ve stumbled upon some other related issue that was inadvertently patched in these releases.
We’ll skimp on a bunch of internal background information for NetScaler for the sake of brevity, but if you’re interested in reading further, here are a few good write-ups to get you started:
Long story short, after digging through patch diffs of the nsppe
binary (NetScaler Packet Parsing Engine – the module responsible for handling the NetScalar Gateway features, AAA authentication mechanisms, and other such functionality), we stumbled upon some new cleanup sections that zero out buffers and memory regions related to HTTP request data prior to reusing them again – things such as request header length, request body length, and other http request attributes.
This is where we’d normally show a screenshot or snippet of code to illustrate these changes… but given the slight differences among nsppe
versions and the sheer size of the binary, we’re opting to demonstrate these changes with a targeted example further downstream in the code flow.
The example we’ve chosen is a login request to the /p/u/doAuthentication.do
endpoint. This endpoint accepts requests roughly in the following format:
Responses will indicate success or failure as you’d normally expect. The important thing to note about this endpoint (and other endpoints affected by this vulnerability) is that regardless of success or failure, the user-supplied login value is reflected in the response.
For this particular endpoint, the request data is parsed into a structure that is later used to build the response data via the annotated function here:
As mentioned earlier, the majority of diffs in the code indicated lots of clearing of buffers and cleanup. So where does that come into play here? Well, the code path that leads to this particular function only requires the successful parsing of a login
form key. It doesn’t care if the associated form values are actually there. So when our param_2 structure gets created, it points to adjacent memory, which is neatly null-terminated for us within the function itself so that we can leak a whole 127 bytes of arbitrary data, which includes the potential for sessions tokens or other sensitive information to be leaked.
Ok great, a log snippet. Not the most novel thing in the world… but this is much much worse than it initially appears. Take a look at the following video where you’ll see that it’s possible to receive legitimate user session tokens via this vector. In the upper left hand corner we have a browser window simply refreshing the page a bunch of times as a demonstration. The attacker script in the bottom right polls the vulnerable doAuthentication.do repeatedly looking for interesting items, such as strings that match the format of session tokens.
This isn’t just limited to endpoints accessible to normal users. The configuration utilities administrators use to manage Netscaler Gateway endpoints ALSO utilize this memory space, meaning those tokens are vulnerable to theft as well.
In the above, we can see a session token leaked that belongs to the “nsroot” user for the entire Citrix NetScaler ADC instance. Not only that, but we’ve also come across plaintext credentials from legitimate login requests.
Since we don’t have a lot to go on in terms of technical details from the vendor, it’s difficult to recommend good indicators of compromise, though we believe the following is a good starting point:
Jul 7 08:04:33 <local0.info> TARGET_GATEWAY_IP 07/07/2025:12:04:33 GMT nsvuln 0-PPE-0 : default SSLVPN TCPCONNSTAT 541 0 : User test_user - Client_ip USER_IP_1 - Nat_ip 127.0.0.2 - Vserver TARGET:443 - Source USER_IP_1:60737 - Destination 127.0.0.1:81 - Start_time "07/07/2025:12:04:33 GMT" - End_time "07/07/2025:12:04:33 GMT" - Duration 00:00:00 - Total_bytes_send 760 - Total_bytes_recv 277 - Total_compressedbytes_send 0 - Total_compressedbytes_recv 0 - Compression_ratio_send 0.00% - Compression_ratio_recv 0.00% - Access Allowed - Group(s) "N/A"
Jul 7 08:04:40 <local0.info> TARGET_GATEWAY_IP 07/07/2025:12:04:40 GMT nsvuln 0-PPE-0 : default SSLVPN TCPCONNSTAT 704 0 : User test_user - Client_ip USER_IP_2 - Nat_ip 127.0.0.2 - Vserver TARGET:443 - Source USER_IP_2:60788 - Destination 127.0.0.1:81 - Start_time "07/07/2025:12:04:40 GMT" - End_time "07/07/2025:12:04:40 GMT" - Duration 00:00:00 - Total_bytes_send 1049 - Total_bytes_recv 1147 - Total_compressedbytes_send 0 - Total_compressedbytes_recv 0 - Compression_ratio_send 0.00% - Compression_ratio_recv 0.00% - Access Allowed - Group(s) "N/A"
“test_user” being accessed from multiple IPs around the same time period
In terms of post-exploitation activities, we assume similar actions from the original CitrixBleed may be taken. These actions include adding backdoor accounts, dumping and modifying the running config with persistence mechanisms, and installing remote access utilities. Each of these actions are captured by many of the default logging mechanisms, though it should be noted that if admin sessions or credentials are compromised, logging configurations could also be modified, which itself is a pretty clear indicator of compromise.
If configuration backups are in place, showing the current running config via show ns runningConfig
-withDefaults
and comparing it to a known good back up with some sort of diffing utility (such as via diff -u backup.config current.config
) is a good starting point.
Given the long tail that CitrixBleed initially had, here are a few references to previous TTPs, backdoors, and threat actor write-ups:
In more recent campaigns regarding other vulnerabilities, threat actors have been observed adding backdoor admin accounts and dumping configurations for edge devices:
Publishing security advisories for such critical issues with such limited information only serves to hurt defenders and threat hunters in the long term. At best, it causes some minor confusion amongst security experts while triaging the issue. At worst, it leaves organizations scrambling and wondering if they’ve fallen victim to the issue, even after patches have been applied since there’s no way to really know what to look for in their environments.
In cases like this, where multiple vulnerabilities are in play, there isn’t even enough information to be 100% confident about which vulnerability we’ve written an exploit for or if we’ve stumbled across something totally new.
In the absence of actionable details from the vendor, as well as other public analysis, hopefully the indicators of compromise and other information we’ve detailed in this post allow system administrators and incident response to better manage their exposure and triage any suspected compromises. Anticipating possible avenues of attack from other recent threat actor activity regarding edge devices might give additional avenues to pursue for additional IoCs.
Get a NodeZero Demo:
See how NodeZero helps you uncover hidden vulnerabilities before attackers do—schedule a demo.