CVE-2025-24011
Executive Summary
CVE-2025-24011 is an information disclosure vulnerability in Umbraco, a free and open-source .NET content management system. The flaw allows an unauthenticated remote attacker to enumerate valid user accounts by analyzing differences in HTTP response codes and response timing from the Umbraco management API. This is a classic user enumeration vulnerability (CWE-203) that can be leveraged for targeted brute-force attacks or social engineering campaigns. The CVSS v3.1 base score is 5.3 (Medium), with a low impact on confidentiality and no impact on integrity or availability. The EPSS score is 0.0%, indicating no active exploitation in the wild at the time of analysis. Patches are available in versions 14.3.2 and 15.1.2.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
Umbraco is distributed as a NuGet package (Umbraco.Cms). Organizations using the affected versions should update their NuGet package references to the patched versions. The vulnerability does not affect the supply chain itself but rather the runtime behavior of the CMS.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
- Base Score: 5.3 (Medium)
- Attack Vector: Network (AV:N)
- Attack Complexity: Low (AC:L)
- Privileges Required: None (PR:N)
- User Interaction: None (UI:N)
- Scope: Unchanged (S:U)
- Confidentiality Impact: Low (C:L)
- Integrity Impact: None (I:N)
- Availability Impact: None (A:N)
Threat Level: Medium. While the vulnerability only leaks account existence, it can be a stepping stone for more severe attacks like credential stuffing or targeted phishing.
Deep Dive & Mechanics
The vulnerability resides in the Umbraco management API endpoints that handle authentication and user lookup. When an attacker sends a request to an API endpoint (e.g., /umbraco/management/api/v1/user/check-exists or similar), the server responds differently based on whether the username exists:
- Existing user: The server returns a specific HTTP status code (e.g., 200 OK) with a response body indicating the user exists.
- Non-existing user: The server returns a different status code (e.g., 404 Not Found) or a generic error message.
Additionally, response timing may vary due to backend processing (e.g., password hashing or database lookups), providing an additional side-channel for enumeration.
The root cause is the lack of consistent error handling and response normalization. The application does not return uniform responses for both valid and invalid usernames, allowing an attacker to distinguish between them.
Vulnerable vs. Patched Code
Vulnerable Code (Conceptual):
[HttpGet]
public IActionResult CheckUserExists(string username)
{
var user = _userService.GetByUsername(username);
if (user != null)
{
return Ok(new { exists = true });
}
return NotFound(new { exists = false });
}
Patched Code (Conceptual):
[HttpGet]
public IActionResult CheckUserExists(string username)
{
var user = _userService.GetByUsername(username);
// Always return the same response regardless of user existence
return Ok(new { exists = false });
}
The patch ensures that the API always returns the same HTTP status code and response body, regardless of whether the username exists. This eliminates the side-channel.
Exploitation & Lab Setup
Red Team
Lab Setup:
- Deploy a vulnerable Umbraco instance (version 14.0.0 to 14.3.1 or 15.0.0 to 15.1.1).
- Use a tool like Burp Suite or a custom Python script to send requests to the management API.
Exploitation Steps:
- Identify the vulnerable endpoint (e.g.,
/umbraco/management/api/v1/user/check-exists). - Send a request with a known valid username (e.g.,
admin). - Observe the response code (e.g., 200 OK) and timing.
- Send a request with a random invalid username (e.g.,
nonexistentuser123). - Observe the different response code (e.g., 404 Not Found) and timing.
- Use a wordlist to enumerate valid usernames.
Example Python Script:
import requests
import time
target = "http://target-umbraco.com"
endpoint = "/umbraco/management/api/v1/user/check-exists"
def check_user(username):
start = time.time()
r = requests.get(f"{target}{endpoint}", params={"username": username})
elapsed = time.time() - start
return r.status_code, elapsed
# Test with known valid user
status, timing = check_user("admin")
print(f"admin: {status} ({timing:.3f}s)")
# Test with invalid user
status, timing = check_user("nonexistentuser123")
print(f"nonexistentuser123: {status} ({timing:.3f}s)")
Blue Team
Detection:
- Monitor for repeated requests to the management API with varying usernames.
- Look for patterns of sequential or dictionary-based username attempts.
- Alert on anomalous response code distributions (e.g., many 200 vs 404 responses).
Mitigation:
- Apply the patch immediately (upgrade to 14.3.2 or 15.1.2).
- Implement rate limiting on authentication and user lookup endpoints.
- Use a Web Application Firewall (WAF) to block enumeration attempts.
- Enable logging and alerting for failed authentication attempts.
Indicators of Compromise (IOCs)
- Network IOCs:
- Repeated HTTP requests to
/umbraco/management/api/v1/user/check-exists(or similar) with differentusernameparameters. - Anomalous ratio of 200 OK to 404 Not Found responses from the management API.
- Repeated HTTP requests to
- Log IOCs:
- Multiple
GETrequests to the same endpoint with varying usernames in a short time frame. - Log entries showing
404responses for user lookup endpoints followed by200responses for valid usernames.
- Multiple
- File IOCs:
- No specific file-based IOCs.
Detection Engineering
YARA Rule
rule CVE_2025_24011_User_Enumeration {
meta:
description = "Detects potential user enumeration attempts against Umbraco CVE-2025-24011"
author = "Valters IT"
date = "2025-02-20"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2025-24011"
strings:
$s1 = "/umbraco/management/api/v1/user/check-exists" ascii wide nocase
$s2 = "username=" ascii wide nocase
condition:
# of ($s1) > 5 and # of ($s2) > 5
}
Sigma Rule
title: Umbraco User Enumeration via Management API
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects multiple requests to Umbraco management API user check endpoint with different usernames
author: Valters IT
date: 2025-02-20
references:
- https://nvd.nist.gov/vuln/detail/CVE-2025-24011
logsource:
category: webserver
product: iis
detection:
selection:
cs-uri-stem|contains: '/umbraco/management/api/v1/user/check-exists'
cs-uri-query|contains: 'username='
condition: selection | count() by cs-uri-stem > 10
falsepositives:
- Legitimate user management operations
level: medium
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-24011 Umbraco User Enumeration Attempt"; flow:to_server; content:"/umbraco/management/api/v1/user/check-exists"; http_uri; content:"username="; http_uri; threshold: type both, track by_src, count 10, seconds 60; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Upgrade Umbraco to version 14.3.2 or 15.1.2 (or later).
- If immediate upgrade is not possible, implement a reverse proxy or WAF rule to block requests to the vulnerable endpoint from untrusted IPs.
- Enable rate limiting on the management API.
Long-Term Measures:
- Conduct a security review of all API endpoints for consistent error handling.
- Implement generic error messages for all authentication-related endpoints.
- Use a Web Application Firewall (WAF) with virtual patching capabilities.
- Monitor for similar vulnerabilities in future Umbraco releases.
Workarounds:
- No official workarounds are available. The only mitigation is to apply the patch.
Valters IT
DevSecOps & Cyber Threat Intelligence