Feb 10, 2026·6 min read·52 visits
File Browser < 2.57.1 allows users to bypass file access restrictions by adding extra slashes to the URL (e.g., `//forbidden`). The app's router was told to skip cleaning paths, causing the security check to fail while the OS still serves the file.
A high-severity path traversal and authorization bypass vulnerability exists in File Browser versions prior to 2.57.1. Due to improper URL normalization settings in the Gorilla Mux router, specifically the use of `SkipClean(true)`, the application fails to sanitize request paths before evaluating security rules. This discrepancy allows authenticated users to bypass 'Disallow' file restrictions simply by prepending an extra slash (e.g., `//private/`) to the URL. While the application logic sees the path as safe, the underlying filesystem resolves it correctly, granting unauthorized access to sensitive files.
File Browser is one of those tools sysadmins love. It’s a sleek, single-binary solution that turns any directory on your server into a full-fledged file management interface. It’s convenient, fast, and—until recently—had a glaring hole in its authorization logic that made its permission system about as effective as a 'Keep Out' sign written in invisible ink.
The core promise of File Browser includes a feature called 'Global Scope' or user-specific scopes, often paired with a 'Disallow' list. You, the responsible admin, configure the app to serve /srv/data but explicitly ban access to /srv/data/private. You test it. You try to go to /private, and you get a 403 Forbidden. You pat yourself on the back and go to lunch.
But here's the problem: You trusted the application to understand what a file path is. In CVE-2026-25890, we find out that File Browser had a bit of an identity crisis regarding URL paths. By simply asking for the file nicely—or rather, by stuttering your request with an extra slash—you could walk right past the bouncer. It’s a classic case of the application layer and the filesystem layer speaking two different dialects.
To understand this vulnerability, you have to understand URL normalization. When a web server receives a request for //foo/../bar, standard behavior is to 'clean' that path into /bar before doing anything else. This prevents confusion. If you don't clean the path, you rely on string matching against raw input, which is the security equivalent of juggling chainsaws.
File Browser is built on Go and uses the popular Gorilla Mux router. In the affected versions, the router was explicitly configured with SkipClean(true). This flag tells the router: 'Hey, don't touch the path. Give it to me raw.' The developer likely did this to preserve trailing slashes or handle specific redirect behaviors that 'Clean' would mess up.
The authorization middleware checks permissions by looking at the path string. If you disallowed /private, the code effectively asks: Does request.Path start with "/private"?
If I request //private/secret.txt, the router passes //private/secret.txt to the middleware. The middleware compares strings: //private does NOT start with /private. The check passes. The request is allowed.
However, when that path is finally handed off to the Operating System's filesystem calls (like os.Open), the OS looks at //private/secret.txt, shrugs, treats the double slash as a single separator, and serves the file. The app was fooled; the kernel was not.
The smoking gun for this vulnerability is found in http/http.go. It’s rare to see a developer leave a comment that essentially predicts the future regret of a code change, but here we are. The developer explicitly disabled path cleaning to fix a minor annoyance with redirects.
Here is the vulnerable code in the NewHandler function:
// http/http.go (Vulnerable)
r := mux.NewRouter()
// ...
// NOTE: This fixes the issue where it would redirect if people did not put a
// trailing slash in the end. I hate this decision since this allows some awful
// URLs https://www.gorillatoolkit.org/pkg/mux#Router.SkipClean
r = r.SkipClean(true)> [!NOTE] > The comment "I hate this decision" is the foreshadowing of the century. By prioritizing the user experience of trailing slashes over canonicalization, the application accepted 'awful URLs' that broke the security model.
The fix, applied in commit 489af403, was brutally simple: delete the line. By removing r = r.SkipClean(true), the router reverts to its default secure behavior. Now, //private becomes /private before the security check runs, meaning the prefix match will succeed, and the request will be blocked.
Exploiting this is trivial. It doesn't require memory corruption, complex race conditions, or advanced cryptography. It requires a keyboard and a web browser.
An admin has set up File Browser and created a user guest. The admin wants to prevent guest from seeing the server's backup folder, so they add /backups/ to the user's Disallow list.
Standard Access (Blocked):
The attacker logs in as guest and navigates to https://target.com/api/resources/backups/shadow.zip.
/backups/shadow.zipStartsWith("/backups/shadow.zip", "/backups/") -> TRUE.The Bypass (Allowed):
The attacker modifies the URL manually or uses curl:
curl -H "X-Auth: ..." https://target.com/api/resources//backups/shadow.zip
//backups/shadow.zip (Because of SkipClean(true))StartsWith("//backups/shadow.zip", "/backups/") -> FALSE.The file acts as if it's in the root scope because the string comparison failed, but the file loader retrieves the content perfectly.
This is a High Severity (8.1) vulnerability for a reason. File Browser is often used to manage sensitive environments—home labs, corporate file shares, or configuration management directories. The 'Disallow' feature is the primary mechanism for segregation of duties.
If you rely on this software to partition access—say, giving a contractor access to /project_a but disallowing /project_a/contracts—this vulnerability renders that segregation null and void. An authenticated user (or an attacker who has compromised a low-level account) can map the entire directory structure and read any file the File Browser process has permission to touch on the OS level.
This is not just an information disclosure; it is a complete subversion of the application's access control model. If the File Browser runs as root (please don't do this) or a privileged user, the attacker can likely read sensitive system files like /etc/shadow or SSH keys if those paths are reachable within the scope.
The remediation path is straightforward: Update immediately.
Official Patch: Upgrade to File Browser v2.57.1 or later. The developers have removed the SkipClean(true) configuration, enforcing strict path normalization for all requests.
Workarounds:
If you cannot update the binary immediately, you must assume that your 'Disallow' rules are ineffective against a motivated user. You could attempt to mitigate this at the reverse proxy layer (Nginx/Apache/Caddy) by enforcing path normalization before the request hits File Browser, or by blocking URLs containing double slashes //.
For example, in Nginx, merge_slashes on; is the default, which might save you if Nginx sits in front, as it will collapse // to / before passing it upstream. However, relying on default proxy behavior is risky; patching the application is the only sure fix.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
File Browser Filebrowser | < 2.57.1 | 2.57.1 |
| Attribute | Detail |
|---|---|
| CVE ID | CVE-2026-25890 |
| CVSS | 8.1 (High) |
| Attack Vector | Network |
| CWE | CWE-706 / CWE-863 |
| Fix Version | 2.57.1 |
| Impact | Authorization Bypass |
The application uses a reference to a resource that resolves to a different resource than intended, or performs an authorization check that can be bypassed due to logic errors.
An uncontrolled resource consumption vulnerability exists in the Scala-based http4s-blaze-server package of the http4s/blaze library. The vulnerability allows remote, unauthenticated attackers to cause an Out of Memory Error (OOM) and JVM crash by streaming a continuous sequence of small or empty WebSocket continuation frames with the FIN bit set to 0. This bypasses typical payload size checks because of the JVM's per-object allocation overhead, leading to rapid heap exhaustion with minimal network bandwidth.
A critical path traversal vulnerability has been identified in the OpenList Go-based backend package. The vulnerability exists within the batch rename handler because the application does not validate the source filename parameter before constructing filesystems paths. This omission allows authenticated users to escape their designated directory and rename files in sibling paths.
OpenList version 4.2.3 and prior is vulnerable to an authorization bypass and metadata leakage. When configured with the Bleve search engine backend, OpenList fails to perform separator-aware path matching when validating tenant containment. This allows authenticated users to access sibling directories sharing similar name prefixes. Furthermore, the search backend returns unfiltered global result counts, leaking existence verification data of unauthorized files via side-channel analysis.
An authorization bypass vulnerability in OpenList version 4.2.3 and below allows authenticated users to read arbitrary files outside of their designated base directories due to an insecure path prefix check using Go's standard strings.HasPrefix function.
A security policy bypass vulnerability exists in the AWS API MCP Server (awslabs-aws-api-mcp-server) from version 0.2.13 through 1.3.46. When the server fails to load the read-only operations index during startup (due to transient network failures, file permission issues, or other exceptions), it logs a warning but continues running in an insecure, degraded state. Under this condition, the security policy engine fails open, silently skipping all subsequent security checks and consent prompts for the lifetime of the process. This permits unauthorized mutating AWS CLI commands to execute via indirect prompt injection attacks.
An incomplete escaping vulnerability in the npm package 'shescape' allows unauthenticated users to trigger dynamic shell expansions, absolute path disclosure, and command block break-outs on Unix and Windows systems.