CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2025-66292

DPanel's Delete Function Works Too Well: A Tale of Path Traversal

Alon Barad
Alon Barad
Software Engineer

Jan 15, 2026·6 min read·33 visits

Executive Summary (TL;DR)

DPanel v1.9.1 and older contains a critical flaw in its attachment deletion logic. The application blindly trusts user-supplied paths, allowing an authenticated attacker to break out of the intended storage directory and delete any file the process has access to. A fix was released in v1.9.2 using Go's `filepath.IsLocal` check.

An arbitrary file deletion vulnerability in DPanel allows authenticated users to nuke system files via directory traversal sequences.

The Hook: When "Delete" Means "Destroy"

Server management panels are the Swiss Army knives of the infrastructure world. They promise to make complex tasks simple: spin up a database, manage cron jobs, or handle file uploads with a click. But as any security researcher knows, the more abstraction you layer over a system, the more places there are to hide a catastrophic logic error. DPanel, a popular Go-based open-source panel, recently fell victim to this exact paradox.

The vulnerability, tracked as CVE-2025-66292, resides in a seemingly innocuous feature: deleting attachments. It’s the kind of feature developers implement on autopilot. You upload a file; you delete a file. Simple. Boring, even. But in the world of vulnerability research, "boring" is where the bugs live. The developers assumed that when a user asks to delete image.png, they actually mean image.png.

They didn't count on us asking to delete ../../../../etc/passwd. In versions prior to 1.9.2, DPanel doesn't just delete the attachment; it dutifully resolves the path traversal sequences and deletes whatever file lies at the end of the rainbow. It’s not just a file deletion bug; it’s a "delete anything the web server can touch" bug. This isn't just dropping a table; it's potentially bricking the operating system.

The Flaw: Trusting the Path

The root cause here is a classic failure to sanitize input boundaries, specifically involving path traversal (CWE-22). In Go, managing file paths can be deceptive. The standard library provides excellent tools like filepath.Join and filepath.Clean, which are designed to normalize paths. However, normalization is not the same as sanitization. Normalizing ../../etc/passwd correctly resolves it to /etc/passwd (assuming a root context), which is syntactically correct but semantically disastrous for a web application.

The logic flaw occurred in the hand-off between the HTTP controller and the storage service. The controller accepted a raw path string from a JSON payload. Instead of verifying that this path pointed to a file inside the allowed upload directory, the application simply passed it to a helper function that constructed an absolute path. The application operated on the assumption that the user input was a filename, not a relative path command.

This is akin to a hotel concierge who, when asked to clean room 101, cleans room 101. But when asked to clean "the room three floors down and two doors to the left," they dutifully march downstairs and start scrubbing the bank vault next door. The application lacked a "jail" check—a verification step to ensure the final resolved path still starts with the expected base directory prefix.

The Code: The Smoking Gun

Let's look at the crime scene. The vulnerable function is Delete in app/common/http/controller/attach.go. Here is the logic before the patch:

// Vulnerable Code
func (self Attach) Delete(http *gin.Context) {
    // ... validation ...
    // 1. User input 'params.Path' is passed directly to the storage helper
    path := storage.Local{}.GetSaveRealPath(params.Path)
    
    // 2. We check if the file exists
    _, err := os.Stat(path)
    if err == nil {
        // 3. EXECUTION: The file is deleted. No questions asked.
        os.Remove(path)
    }
    self.JsonSuccessResponse(http)
    return
}

The GetSaveRealPath function likely joins a base path with the input. If params.Path is ../../etc/hosts, os.Remove receives the resolved system path. There are no guardrails.

The fix, implemented in commit cbda0d90204e8212f2010774345c952e42069119, leverages a newer Go feature (introduced in Go 1.20) called filepath.IsLocal. This function is a game-changer for preventing traversal attacks because it explicitly checks if a path is lexical, relative, and does not ascend above the current directory.

// Patched Code
if !self.Validate(http, &params) {
    return
}
 
// THE FIX: Reject paths that try to escape
if !filepath.IsLocal(params.Path) {
    self.JsonResponseWithError(http, 
        function.ErrorMessage(define.ErrorMessageCommonDataNotFoundOrDeleted), 
        500
    )
    return
}
 
params.Path = filepath.Clean(params.Path)
path := storage.Local{}.GetSaveRealPath(params.Path)
// ... proceed to delete ...

By adding filepath.IsLocal, the developer ensures that any input containing .. sequences that would break out of the directory is rejected immediately.

The Exploit: Nuke It From Orbit

Exploiting this requires low-level privileges (PR:L), specifically access to the backend API. However, in many organizations, "admin" panels are shared, or credentials are hardcoded/leaked. Once authenticated, the attack is trivial. We don't need fancy shellcode; we just need a valid JWT and a JSON payload.

Here is how an attacker would manually verify and exploit this. First, they identify the target endpoint /api/common/attach/delete. Then, they craft a request to delete a non-essential but verifiable system file to confirm the vulnerability (e.g., a temp file), before moving on to high-value targets.

The Attack Payload:

POST /api/common/attach/delete HTTP/1.1
Host: target-dpanel.local
Authorization: Bearer <Your-JWT-Here>
Content-Type: application/json
 
{
  "path": "../../../../../../etc/mysql/my.cnf"
}

When the server processes this, it resolves the path relative to the attachment storage root. If the storage root is /opt/dpanel/storage/uploads, the payload resolves to /etc/mysql/my.cnf. The os.Remove call triggers, and suddenly the database configuration is gone. When the service restarts, the database fails. DoS achieved.

An attacker could get more creative: deleting dpanel.toml (the application's own config), deleting SSH authorized keys to lock out admins, or deleting log files to cover tracks from previous intrusions.

The Impact: Silence is Deadly

While this vulnerability scores an 8.1 (High) rather than a 9.8 (Critical), do not underestimate it. The lack of Confidentiality impact (you can't read the files, only delete them) keeps the score down, but the Integrity and Availability impacts are total.

From an availability standpoint, this is a nuclear option. An attacker can systematically delete the binaries required to run the OS, effectively requiring a full server reinstall. In a cloud environment, this might mean downtime for critical business logic managed by the panel.

Furthermore, consider the security implications of deleting specific files. If an attacker deletes .htaccess or other access control definition files, they might inadvertently (or purposefully) open up other parts of the system to unauthenticated access. They could delete lock files to trigger race conditions. In the worst-case scenario, if the application runs as root (which, sadly, many of these panels do), the attacker can render the entire operating system unbootable.

The Fix: Containment Strategy

The immediate remediation is to upgrade DPanel to version v1.9.2. The patch provided by donknap is robust because it uses the standard library's filepath.IsLocal, which avoids the pitfalls of writing custom regex or string parsing logic to detect .. sequences.

For developers reading this: this is a lesson in defensive programming. Never trust file system operations with raw user input. If you must accept a filename, verify it against an allowlist of characters (e.g., alphanumeric only) or use strict lexical checks like IsLocal.

Additionally, this highlights the importance of Principle of Least Privilege. Why does a web panel need write access to /etc/ or /bin/? It shouldn't. Running the DPanel service as a dedicated, low-privileged user would mitigate the impact of this vulnerability significantly. Even if the code is flawed, the OS permissions would prevent the deletion of critical system files.

Official Patches

donknapGitHub Commit fixing the vulnerability

Fix Analysis (1)

Technical Appendix

CVSS Score
8.1/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H

Affected Systems

DPanel Server Management Panel

Affected Versions Detail

Product
Affected Versions
Fixed Version
DPanel
donknap
< 1.9.21.9.2
AttributeDetail
CWE IDCWE-22 (Path Traversal)
Attack VectorNetwork
CVSS v3.18.1 (High)
Privileges RequiredLow (Authenticated)
ImpactHigh Integrity, High Availability
Exploit StatusPOC Available

MITRE ATT&CK Mapping

T1485Data Destruction
Impact
T1499Endpoint Denial of Service
Impact
CWE-22
Path Traversal

The application allows user input to control a file path used in a deletion operation without properly validating that the path is within the intended directory.

Known Exploits & Detection

Hypothetical PoCPOST /api/common/attach/delete with payload {"path": "../../../target"}

Vulnerability Timeline

Vulnerability fixed in commit cbda0d
2025-12-01
GHSA-vh2x-fw87-4fxq published
2026-01-15
CVE-2025-66292 Assigned
2026-01-15

References & Sources

  • [1]GitHub Security Advisory
  • [2]NVD Entry

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 7 hours ago•CVE-2026-39922
6.3

CVE-2026-39922: Server-Side Request Forgery in GeoNode Service Registration Endpoint

GeoNode versions prior to 4.4.5 and 5.0.2 are vulnerable to Server-Side Request Forgery (SSRF) in the service registration endpoint. Authenticated attackers with low privileges can exploit insufficient input validation in the Web Map Service (WMS) registration module to force the application server to make outbound network queries to loopback addresses, private RFC1918 subnets, link-local scopes, and cloud metadata endpoints. This technical report details the mechanics of the vulnerability, the underlying architectural flaw, and how to effectively remediate and mitigate the associated security risks.

Alon Barad
Alon Barad
4 views•7 min read
•about 16 hours ago•CVE-2022-0492
7.8

CVE-2022-0492: Privilege Escalation and Container Escape via cgroups v1 release_agent

CVE-2022-0492 is a high-severity missing authorization vulnerability in the Linux kernel's Control Groups (cgroups) v1 implementation. The flaw resides within the cgroup_release_agent_write function in kernel/cgroup/cgroup-v1.c, where the kernel fails to validate if the process writing to the release_agent file possesses administrative capabilities in the initial user namespace. This allows a local attacker inside a container with root privileges (UID 0) to abuse user namespaces, mount a cgroups v1 directory, modify the release_agent parameter, and execute arbitrary commands on the host system as host root, effectively achieving a complete container escape.

Amit Schendel
Amit Schendel
8 views•7 min read
•2 days ago•GHSA-G72G-R7M4-9X4G
6.3

GHSA-G72G-R7M4-9X4G: Insufficient Session Expiration of OAuth Tokens in NocoDB

NocoDB is subject to an insufficient session expiration vulnerability where OAuth access and refresh tokens are not invalidated or revoked during security-sensitive actions such as password changes, forgot-password requests, or password resets. This allows an attacker possessing an active OAuth token to maintain unauthorized persistence.

Amit Schendel
Amit Schendel
10 views•6 min read
•3 days ago•GHSA-FGMC-2HQJ-86V4
6.9

GHSA-FGMC-2HQJ-86V4: Default Administrative Credentials in vantage6-server

A vulnerability in the vantage6 federated learning framework allows unauthenticated remote attackers to gain administrative control of the server via hardcoded default credentials (root/root) when deployed under default configurations in versions 4.2.3 and below.

Amit Schendel
Amit Schendel
8 views•5 min read
•3 days ago•GHSA-X9F6-9RVM-MMRG
6.9

GHSA-X9F6-9RVM-MMRG: Improper Access Control and Volume Mount Isolation Bypass in vantage6 Node

An improper access control vulnerability in the vantage6 node component allows concurrently running algorithm containers to read and modify sensitive input and output files of other tasks. The lack of strict workspace directory isolation exposes a significant attack surface in multi-tenant or federated environments where untrusted algorithms are executed.

Amit Schendel
Amit Schendel
3 views•4 min read
•3 days ago•CVE-2026-47760
8.7

CVE-2026-47760: Cross-Site Scripting (XSS) via SVG Namespace Sanitizer Bypass in TinyMCE

TinyMCE versions 6.8.0 through 7.0.1 contain a high-severity Cross-Site Scripting (XSS) vulnerability. The flaw exists in the custom HTML parser and sanitizer module, which incorrectly manages SVG namespace scopes when parsing nested elements. A low-privileged or unauthenticated attacker can submit a crafted HTML payload containing nested SVG structures to bypass sanitization filters, leading to arbitrary JavaScript execution in the context of the victim's browser session.

Alon Barad
Alon Barad
30 views•7 min read