Jan 30, 2026·6 min read·54 visits
Sitecore shipped a database snapshot with a hardcoded user 'sitecore\ServicesAPI' having the password 'b'. Attackers can use this to get a valid session cookie, bypassing 'web.config' restrictions and opening the door to RCE vulnerabilities like CVE-2025-34510.
A critical lapse in database seeding practices left a default user account enabled in Sitecore Experience Manager and Experience Platform versions 10.1 through 10.4. The account, 'sitecore\ServicesAPI', was configured with the single-character password 'b'. While this user lacks administrative privileges, the valid session it generates allows attackers to bypass IIS-level authentication checks, serving as the necessary precursor for critical Remote Code Execution chains.
Enterprise CMS solutions like Sitecore are architectural behemoths. They are designed to manage content for some of the largest organizations on the planet, consisting of complex pipelines, databases, and authentication providers. When you install such a system, you aren't just copying files; you are hydrating a massive ecosystem.
Part of this hydration process involves the 'Core' database, which manages system settings, users, and security configuration. In the shift to version 10.1, Sitecore modernized how they deploy this database using DACPAC (Data-Tier Application Package) files. Think of a DACPAC as a vacuum-sealed snapshot of a database schema and its default data.
But here is the problem with snapshots: if you take a picture of your house while the back door is unlocked, every house built from that blueprint will have the back door unlocked. In Sitecore's case, they didn't just leave a door unlocked; they left a key under the mat. And the key was the letter 'b'.
During the analysis of Sitecore.Core.dacpac, researchers at watchTowr Labs noticed something peculiar in the dbo.aspnet_Membership table. This table holds the legacy ASP.NET Membership credentials. Among the rows of data was a user account named sitecore\ServicesAPI.
Now, ServicesAPI sounds like an internal service account—something that should probably be disabled or have a 64-character random password. Instead, the password hash stored in the database corresponded to a single character: 'b'.
Why 'b'? Veterans of the Sitecore ecosystem might chuckle. In the ancient days of Sitecore (think version 6 or 7), the default password for the admin account was often 'b'. It seems that during the creation of the version 10.1 master database image, a developer or a migration script carried this legacy credential forward, baking it into the installer. Because DACPACs are binary deployments, this hardcoded credential wasn't visible in plain text config files, allowing it to slip past code reviews and into production environments for nearly four years.
You might be thinking, "So what? It's a service account with no roles." And you would be half-right. If you try to log into the main Sitecore shell with this account, the application logic usually kicks you out. The Sitecore.Owin.Authentication pipeline has a specific processor that checks if you are an administrator or a specific client user.
However, security is often a game of layers, and the outer layer is usually IIS and web.config rules. Many sensitive directories in Sitecore (like /sitecore/admin or /sitecore/shell) are protected by standard ASP.NET authorization rules:
<authorization>
<deny users="?" />
</authorization>The ? represents anonymous users. To get past this check, you don't need to be an admin; you just need to be authenticated. By sending a POST request to the authentication API with the username ServicesAPI and the password b, the server issues a valid .AspNet.Cookies session cookie.
This cookie is the golden ticket. It tells IIS, "I am a known user." IIS lets the request through to the underlying ASPX files. Even if the Sitecore application layer eventually says "Hey, you don't have permission to view this specific page," you have already breached the perimeter. You are now inside the authenticated attack surface, where much more dangerous bugs live.
Exploiting this is embarrassingly simple. No memory corruption, no race conditions, just a polite request to the login API. Here is how an attacker creates a session:
/sitecore/api/ssc/auth/login.POST /sitecore/api/ssc/auth/login HTTP/1.1
Host: target.com
Content-Type: application/json
{
"domain": "sitecore",
"username": "ServicesAPI",
"password": "b"
}If the server responds with a 200 OK and a Set-Cookie header containing .AspNet.Cookies, the game is effectively over. The attacker can now take that cookie and browse to endpoints that were previously returning 403 Forbidden or 302 Redirect to login.
While CVE-2025-34509 is ostensibly just an authentication bypass, it is rarely used alone. It is the prerequisite for CVE-2025-34510, a Zip Slip vulnerability in Upload2.aspx. That file is protected by the web.config rule mentioned earlier. Without the 'b' password, the attacker can't reach the upload handler. With it, they can upload a web shell and achieve full Remote Code Execution.
The CVSS score of 7.5 might seem modest because it's technically "only" a privilege escalation to a low-privilege user. Do not be fooled. In the context of Sitecore, this is a gateway drug to total compromise.
Once an attacker has bypassed the initial authentication check, they expose the soft underbelly of the CMS—administrative tools, debugging handlers, and legacy uploaders that were never meant to be exposed to the public internet. The specific combination of CVE-2025-34509 (Auth Bypass) and CVE-2025-34510 (File Write) allows an unauthenticated attacker to execute code as the IIS AppPool user, which often has modify rights to the webroot.
From there, data exfiltration is trivial. Customer data, marketing strategies, and user credentials stored in the SQL database are open for the taking. For a platform designed to host global brands, the reputational damage is catastrophic.
If you are running Sitecore 10.1 through 10.4, you are likely vulnerable unless you manually changed this password previously. The official patch from Sitecore updates the DACPACs for future installs, but it might not automatically fix existing databases.
Immediate Remediation Steps:
sitecore\ServicesAPI, and change the password to a strong, random string. Alternatively, execute a SQL update against the Core database aspnet_Membership table (though UI is safer)./sitecore/admin and /sitecore/api endpoints. These should not be exposed to the open internet. Use WAF rules to block external access to these paths.> [!NOTE]
> Changing the password for ServicesAPI does not break core functionality in a standard setup, as this account is largely a vestigial artifact or used for specific internal service calls that can be reconfigured.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
Sitecore XM/XP Sitecore | 10.1.0 - 10.1.3 | 10.1.4 |
Sitecore XM/XP Sitecore | 10.2.x | See Vendor Advisory |
Sitecore XM/XP Sitecore | 10.3.0 - 10.3.2 | 10.3.3 |
Sitecore XM/XP Sitecore | 10.4.0 | 10.4.1 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-798 |
| Attack Vector | Network |
| CVSS Score | 7.5 (High) |
| EPSS Score | 23.18% |
| Exploit Status | PoC Available |
| Likelihood | High |
The use of hard-coded credentials, such as passwords or cryptographic keys, typically creates a significant hole that allows an attacker to bypass the authentication that has been configured by the software administrator.
Tornado versions prior to 6.6.0 contain an uncontrolled resource consumption vulnerability (CWE-400) in the HTTP/1.1 chunked transfer encoding parser. When processing incoming chunked payloads that have already buffered in the socket read buffer, Tornado parses chunks in a tight synchronous loop without yielding to the event loop. Furthermore, non-streaming request handlers and SimpleAsyncHTTPClient store each chunk as a discrete Python bytes object inside a list, inducing an approximately 20-fold memory overhead for 1-byte chunks.
A missing cryptographic signature verification vulnerability exists in Electrum Bitcoin Wallet versions prior to 4.8.3. In Electrum's Simplified Payment Verification (SPV) architecture, the client failed to validate input signatures on unconfirmed mempool transactions received from connected Electrum servers. A malicious Electrum server can exploit this flaw by intercepting a legitimate user broadcast, suppressing it, and returning a spoofed unconfirmed transaction with an invalid signature and zero fee that redirects the user's UTXOs to an attacker-controlled address. When the user initiates a Replace-By-Fee (RBF) action to accelerate the seemingly stuck transaction, Electrum signs the spoofed outputs with the user's private keys, resulting in the direct theft of funds.
CVE-2026-118254 (GHSA-r5wg-q8fc-p6w2) is a high-severity DOM-based Cross-Site Scripting (DOM XSS) vulnerability in the pagination module of Highcharts Grid (@highcharts/grid-lite and @highcharts/grid-pro). The flaw stems from the direct assignment of localization configuration strings (lang.pageInfo and lang.pageSizeLabel) and pagination UI labels to DOM elements via the innerHTML property instead of text-safe DOM APIs such as textContent or innerText. When an application passes attacker-controlled data into the Grid localization options with pagination enabled, arbitrary HTML and JavaScript execute automatically within the hosting document's origin context upon component rendering.
CVE-2026-118255 is a Cross-Site Scripting (XSS) vulnerability in Highcharts Grid and Highcharts Grid Pro. The flaw occurs because the credits component assigns the configuration-supplied credits.href property directly to an HTML anchor element without verifying the URI scheme against the internal Abstract Syntax Tree (AST) allowlist. An attacker who can influence the grid configuration can supply a javascript: URI, resulting in arbitrary JavaScript execution in the victim's browser session when the credits link is clicked.
The Model Context Protocol (MCP) TypeScript SDK contains an uncontrolled resource consumption vulnerability in its HTTP server transport implementations and middleware adapters. Affected versions fail to enforce upper bounds on incoming HTTP POST request body sizes and JSON-RPC 2.0 batch array lengths. In addition, middleware wrappers for Express and Hono parse request bodies into memory prior to validating Host and Origin headers. Unauthenticated remote attackers can exploit these flaws to trigger Out-Of-Memory (OOM) process crashes or monopolize the single-threaded Node.js event loop.
An uncaught exception vulnerability (CWE-248) exists in the Node.js HTTP/1.1 client library undici, affecting versions 7.15.0 through 7.30.0 and 8.0.0 through 8.12.1. The flaw resides in the DecompressHandler interceptor (lib/interceptor/decompress.js), which processes compressed HTTP response streams using asynchronous Node.js zlib callbacks. When forwarding decompressed data chunks or stream completion events to downstream handlers, the interceptor fails to wrap the invocations of super.onResponseData() and super.onResponseEnd() in try...catch blocks. If a downstream interceptor or handler throws an exception during response processing—such as the built-in dump interceptor enforcing a maximum response size—the exception escapes the asynchronous zlib callback stack onto the top-level Node.js event loop, terminating the entire client process.