☠️
EXFILTRATING
DATA...
01010111 10110010 00101001 11000110 01101100 10011011 00010001 11100101 01000010 10101111
[ <-- BACK_TO_SEARCH ]
Umbraco logo [ WEBSITE ] [ VENDOR STATS ]
CVSS: 5.3 🐛 CWE-200
👁️
Common Weakness Enumeration - Identifies the specific category of software weakness or flaw.

CVE-2025-24011

CVE-2025-24011 Information Disclosure in Umbraco
📅 PUBLISHED: 2025-01-21 15:27 UTC 🔄 UPDATED: 2026-09-23 20:31 UTC
[ OFFICIAL PATCH DEPLOYED ↓ ] FIX: LIKELY — 2 independent sources confirm fix
[ DEFENSE PATCH ↓ ]
💣 PoC: None
👁️
Proof of Concept - Indicates if functional exploit code is publicly available, drastically increasing the risk of immediate attacks.
🎯 EPSS: 1.51%
👁️
1.51% probability
37.7× above the median CVE
Tier: HIGH
30-day exploitation window · FIRST.org · updated daily
Country: Denmark License: Commercial
Patch available — upgrade to latest release
CVSS SEVERITY SCALE
9.0–10.0 CRITICAL
7.0–8.9 HIGH
4.0–6.9 MEDIUM
0.1–3.9 LOW
0.0 NONE
5.3
THREAT LEVEL
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

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.

⚡ AUTOMATE YOUR CVE INTELLIGENCE

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.

›Patch confidence — UNVERIFIED to CONFIRMED, cross-referenced NVD + RHSA + Debian
›Exploit & PoC — poc_status, poc_url, has_exploit. Not in NVD.
›Shodan dorks — ready-made queries to find exposed vulnerable systems
›Detection rules — YARA · Wazuh · Elastic (all plans) · Sigma (Pro)
›pending_fields — know exactly which of 7 fields NVD hasn't processed yet
›Free backfill — data incomplete when you paid? Re-check within 30 days = 0 credits
PAYG €0.08/lookup Standard €19/mo (was €29) · 5k credits Pro €65/mo (was €99) · 20k credits FOUNDING PRICE · LOCKED FOR LIFE · ENDS 31 DEC 2026
[ FROM €19/MO ]
Free sandbox key available
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:

  1. Deploy a vulnerable Umbraco instance (version 14.0.0 to 14.3.1 or 15.0.0 to 15.1.1).
  2. Use a tool like Burp Suite or a custom Python script to send requests to the management API.

Exploitation Steps:

  1. Identify the vulnerable endpoint (e.g., /umbraco/management/api/v1/user/check-exists).
  2. Send a request with a known valid username (e.g., admin).
  3. Observe the response code (e.g., 200 OK) and timing.
  4. Send a request with a random invalid username (e.g., nonexistentuser123).
  5. Observe the different response code (e.g., 404 Not Found) and timing.
  6. 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 different username parameters.
    • Anomalous ratio of 200 OK to 404 Not Found responses from the management API.
  • Log IOCs:
    • Multiple GET requests to the same endpoint with varying usernames in a short time frame.
    • Log entries showing 404 responses for user lookup endpoints followed by 200 responses for valid usernames.
  • 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:

  1. Upgrade Umbraco to version 14.3.2 or 15.1.2 (or later).
  2. If immediate upgrade is not possible, implement a reverse proxy or WAF rule to block requests to the vulnerable endpoint from untrusted IPs.
  3. 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

◈ SOURCE Analysis & enrichment: valtersit.com/cve/CVE-2025-24011/ · CVE data: NVD/MITRE (public domain) · © 2026 ValtersIT Hub
>_ SYSTEM_CORE: INTEL_ACTIVE
90% TEAM-CURATED // 10% AUTOMATED INGESTION.
ALL PATCH REFERENCES AND VERSION DATA SOURCED FROM NVD + OSV OFFICIAL REGISTRIES.