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·53 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

•10 minutes ago•CVE-2026-113872
7.5

CVE-2026-113872: Unauthenticated Process Crash in Express Multer via Late Busboy Stream Resumption

CVE-2026-113872 (GHSA-q7qp-rjg7-q26m) is a high-severity denial-of-service vulnerability affecting the multer multipart/form-data upload middleware for Node.js and Express in versions 2.0.0 through 2.4.0. When an endpoint is configured to accept multiple files using an asynchronous fileFilter callback, a crafted, truncated multipart HTTP request can trigger an unhandled error event on the underlying busboy stream parser after request teardown has already completed. Because all error listeners are stripped during teardown, Node.js treats the resulting error event as an uncaught exception and immediately terminates the server process.

Amit Schendel
Amit Schendel
1 views•12 min read
•about 1 hour ago•CVE-2026-115897
2.1

CVE-2026-115897: Cross-Site Scripting via Function Body Boundary Bypass in serialize-javascript

CVE-2026-115897 (also tracked as GHSA-m5mm-p8h7-m29v and aliased as CVE-2026-115754) is a Cross-Site Scripting (XSS) vulnerability in the Yahoo serialize-javascript npm package prior to version 7.1.3. The flaw exists in the regular expression used by escapeFunctionBody() to neutralize HTML script closing tags within serialized JavaScript functions. Because function bodies are sanitized in isolation before structural formatting is applied, a function whose string representation terminates directly with the sequence '</script' bypasses the positive lookahead check. When combined with serialization formatting options that introduce whitespace delimiters and a subsequent property that supplies a closing bracket, an attacker can prematurely terminate an enclosing HTML <script> block and inject arbitrary HTML or JavaScript into the rendered document.

Amit Schendel
Amit Schendel
2 views•13 min read
•about 2 hours ago•CVE-2026-109841
5.9

CVE-2026-109841: Subresource Integrity Verification Bypass in Node.js Undici

CVE-2026-109841 is a Subresource Integrity (SRI) verification bypass vulnerability in undici, the official HTTP/1.1 and HTTP/2 client library for Node.js that powers the global fetch() implementation. The flaw stems from improper handling of case sensitivity (CWE-178) when validating cryptographic hash algorithm tokens within SRI metadata. Because undici compared incoming algorithm identifiers against a strictly lowercase set without prior ASCII-lowercase normalization, valid uppercase or mixed-case tokens such as SHA256- or Sha384- were treated as unrecognized algorithms and discarded. Under SRI forward-compatibility rules, discarding all provided tokens results in an empty integrity list, causing undici to fail open and accept tampered HTTP response bodies without cryptographic verification.

Alon Barad
Alon Barad
1 views•9 min read
•about 3 hours ago•CVE-2026-109924
5.9

CVE-2026-109924: Unbounded Memory Allocation in Node.js Undici EventSource Stream Parser

A resource allocation vulnerability (CWE-770) exists in the Server-Sent Events (SSE) parser within the Node.js undici HTTP client library. In affected versions, the EventSourceStream implementation fails to restrict the count of internal Buffer chunk references and accumulated string nodes prior to event dispatch boundaries. A malicious or compromised SSE endpoint can exploit this behavior by streaming fragmented, unterminated lines or continuous sequences of short data fields without empty separator lines, bypassing configured byte-size limits and causing a fatal Out-of-Memory (OOM) crash in the client Node.js process.

Amit Schendel
Amit Schendel
4 views•11 min read
•about 3 hours ago•CVE-2026-109869
7.5

CVE-2026-109869: Denial of Service via Orphaned Stream in Node.js Undici Fetch Implementation

CVE-2026-109869 is a high-severity denial-of-service vulnerability in undici, the default HTTP/1.1 client and Fetch implementation for Node.js. When a server responds with more than five Content-Encoding directives and prematurely closes the connection before transmitting the body, undici allocates an internal Readable stream before enforcing the content-encoding limit. Upon rejecting the fetch promise, the stream is orphaned without an error listener or abort signal, causing the premature socket closure to emit an unhandled stream error that terminates the Node.js process.

Alon Barad
Alon Barad
6 views•10 min read
•about 4 hours ago•CVE-2026-114612
9.9

CVE-2026-114612: Privilege Escalation to Proxy Admin via Cryptographic Context Reuse in LiteLLM

LiteLLM versions 1.87.0 through 1.104.0-rc.1 contain a cryptographic domain separation vulnerability (CWE-269, CWE-345, CWE-441) that allows an authenticated low-privilege user to escalate privileges to full proxy administrator. The application reuses a single symmetric cryptographic context and key derivation path for both at-rest secret encryption and ephemeral UI/CLI session authentication tokens without providing Associated Authenticated Data (AAD). By submitting crafted JSON session claims into user-accessible encrypted metadata fields, an attacker can use the API-key generation flow as an encryption oracle, extract the resulting ciphertext, and replay it as a bearer token to achieve administrative control and subsequent remote command execution via the Model Context Protocol (MCP) stdio interface.

Alon Barad
Alon Barad
8 views•9 min read