GHSA-r4v7-6wcg-ghj5: FileBrowser Remote Code Execution Vulnerability

MODERATE
CVSS 6.5
CWE-307
Published
Advisory Summary

GHSA-r4v7-6wcg-ghj5 is a MODERATE (CVSS 6.5) remote code execution vulnerability (CWE-307: Improper Restriction of Excessive Authentication Attempts) affecting FileBrowser libraries in the Go ecosystem. The issue involves missing rate limiting on authentication endpoint enables brute force attacks. Remediation is available by upgrading affected packages to version 0.0.0-20260522161427-fa5abc8c67f3a.

GHSA-r4v7-6wcg-ghj5 at a Glance

CVE Identifier N/A
GHSA Identifier GHSA-r4v7-6wcg-ghj5
Severity MODERATE
CVSS v3.1 Base Score 6.5
CWE Classification CWE-307: Improper Restriction of Excessive Authentication Attempts
Affected Product FileBrowser
Package Ecosystem Go
Published Date
Last Updated

Security Impact

CVSS: 6.5

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:L/A:N).

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required None (PR:N)
User Interaction None (UI:N)
Scope Unchanged (S:U)
Confidentiality Low (C:L)
Integrity Low (I:L)
Availability None (A:N)

How to Fix GHSA-r4v7-6wcg-ghj5

To remediate this vulnerability, upgrade all affected FileBrowser dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

github.com/gtsteffaniak/filebrowser fixed: 0.0.0-20260522161427-fa5abc8c67f3a
Upgrade github.com/gtsteffaniak/filebrowser to 0.0.0-20260522161427-fa5abc8c67f3a
Verify Direct and Transitive Dependencies

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

How to Check if You Are Affected

To determine whether your application is affected by GHSA-r4v7-6wcg-ghj5, inspect your project dependencies for FileBrowser:

inspect dependencies for github.com/gtsteffaniak/filebrowser

Analyze the terminal output to locate any version of FileBrowser 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-20260522161427-fa5abc8c67f3a), 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-307: Improper Restriction of Excessive Authentication Attempts, where the product does not implement sufficient measures to prevent multiple failed authentication attempts within a short time frame. In FileBrowser, 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

### Summary The `/api/auth/login` endpoint does not implement rate limiting, account lockout, or progressive backoff for repeated authentication failures. As a result, an attacker can perform unlimited login attempts against the endpoint. When combined with the username enumeration timing vulnerability, valid accounts can be identified and then brute-forced without restriction. The risk is further increased by a weak default password policy that only enforces a minimum length of five characters. ### Details The authentication endpoint `/api/auth/login` does not enforce any form of rate limiting, account lockout, or progressive backoff for repeated failed login attempts. Testing confirmed that the endpoint accepts an unlimited number of authentication attempts from the same client without delay or restriction. This allows attackers to repeatedly attempt password guesses against valid usernames. Secure authentication systems typically enforce request throttling, temporary account lockout, or progressive delays after repeated failed login attempts to mitigate brute-force attacks. ``` $ python rate-limit-probe.py [*] Probing http://localhost/api/auth/login for rate limiting, lockout, and backoff behavior... Attempt 10: status=401, latency=0.0411s Attempt 20: status=401, latency=0.0411s Attempt 30: status=401, latency=0.0402s Attempt 40: status=401, latency=0.0420s Attempt 50: status=401, latency=0.0403s Attempt 60: status=401, latency=0.0423s Attempt 70: status=401, latency=0.0474s Attempt 80: status=401, latency=0.0417s Attempt 90: status=401, latency=0.0407s Attempt 100: status=401, latency=0.0407s --- CONCRETE EVIDENCE --- Attempts completed: 100 Total runtime: 4.17s Average request rate: 23.98 req/sec Unique status codes: [401] Average time (first 5): 0.0447s Average time (last 5): 0.0408s Latency delta: -0.0038s [RESULT] No HTTP 429 responses observed. [RESULT] No progressive backoff detected: response timing remained effectively constant. ``` #### Additional Context Password validation is implemented in `backend/database/storage/bolt/user.go` via `checkPassword()`, which only verifies that the supplied password length is greater than or equal to settings.Config.Auth.Methods.PasswordAuth.MinLength. In `backend/common/settings/auth.go`, the PasswordAuthConfig documents the default value of MinLength as 5. No additional complexity requirements, such as uppercase, lowercase, numeric, or special character checks, were identified in this code path. ### PoC The script below demonstrates the lack of rate limiting by performing a high volume automated authentication test. The script sends sequential login requests and monitors for HTTP 429 (Too Many Requests) status codes. ``` import requests import time import statistics URL = "http://localhost/api/auth/login" USERNAME = "admin" PASSWORD = "wrong-password" MAX_ATTEMPTS = 100 TIMEOUT = 10 latencies = [] statuses = [] print(f"[*] Probing {URL} for rate limiting, lockout, and backoff behavior...") start_total = time.time() for i in range(1, MAX_ATTEMPTS + 1): start = time.perf_counter() resp = requests.post( URL, params={"username": USERNAME, "recaptcha": ""}, headers={"X-Password": PASSWORD}, timeout=TIMEOUT ) duration = time.perf_counter() - start latencies.append(duration) statuses.append(resp.status_code) if resp.status_code == 429: print(f"[!] Rate limit detected at attempt {i} (HTTP 429)") break if i % 10 == 0: print(f" Attempt {i:3}: status={resp.status_code}, latency={duration:.4f}s") end_total = time.time() attempts_completed = len(latencies) print("\n--- CONCRETE EVIDENCE ---") first_five_avg = statistics.mean(latencies[:5]) if attempts_completed >= 5 else statistics.mean(latencies) last_five_avg = statistics.mean(latencies[-5:]) if attempts_completed >= 5 else statistics.mean(latencies) latency_delta = last_five_avg - first_five_avg print(f"Attempts completed: {attempts_completed}") print(f"Total runtime: {end_total - start_total:.2f}s") print(f"Average request rate: {attempts_completed / (end_total - start_total):.2f} req/sec") print(f"Unique status codes: {sorted(set(statuses))}") print(f"Average time (first 5): {first_five_avg:.4f}s") print(f"Average time (last 5): {last_five_avg:.4f}s") print(f"Latency delta: {latency_delta:+.4f}s") if 429 not in statuses: print("[RESULT] No HTTP 429 responses observed.") if abs(latency_delta) < 0.05: print("[RESULT] No progressive backoff detected: response timing remained effectively constant.") else: print("[RESULT] Latency variation detected: investigate possible throttling or environmental noise.") ``` ### Impact An attacker can perform unlimited authentication attempts against valid usernames. When combined with the username enumeration timing vulnerability, this enables targeted brute-force attacks against user accounts and increases the likelihood of credential compromise. Please let me know if you need any additional information or clarification. I'm happy to assist with testing or validating a fix.

GHSA-r4v7-6wcg-ghj5 Affected FileBrowser Versions

1 component(s)
Fixed Versions:
0.0.0-20260522161427-fa5abc8c67f3a
Product / Package Ecosystem Affected Versions Fixed Version
github.com/gtsteffaniak/filebrowser
Go
< 0.0.0-20260522161427-fa5abc8c67f3a
0.0.0-20260522161427-fa5abc8c67f3a

References

Frequently Asked Questions

What is GHSA-r4v7-6wcg-ghj5?
GHSA-r4v7-6wcg-ghj5 is a security vulnerability in FileBrowser involving Missing Rate Limiting on Authentication Endpoint Enables Brute Force Attacks under CWE-307: Improper Restriction of Excessive Authentication Attempts.
Which FileBrowser versions are affected?
Affected versions include releases prior to 0.0.0-20260522161427-fa5abc8c67f3a across affected packages: github.com/gtsteffaniak/filebrowser.
What version fixes GHSA-r4v7-6wcg-ghj5?
Upgrading to 0.0.0-20260522161427-fa5abc8c67f3a (or the latest patched release for your respective branch) resolves the vulnerability.
Is github.com/gtsteffaniak/filebrowser affected?
Yes, github.com/gtsteffaniak/filebrowser is affected in releases prior to 0.0.0-20260522161427-fa5abc8c67f3a. Upgrade your dependency to 0.0.0-20260522161427-fa5abc8c67f3a or later.
What is the CVSS score of GHSA-r4v7-6wcg-ghj5?
GHSA-r4v7-6wcg-ghj5 has a CVSS v3.1 base score of 6.5 (MODERATE) with vector string CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N.
What CWE is associated with GHSA-r4v7-6wcg-ghj5?
GHSA-r4v7-6wcg-ghj5 is classified under CWE-307: Improper Restriction of Excessive Authentication Attempts (The product does not implement sufficient measures to prevent multiple failed authentication attempts within a short time frame.).
How can I check Go dependencies for GHSA-r4v7-6wcg-ghj5?
Run the dependency tree command: 'inspect dependencies for github.com/gtsteffaniak/filebrowser'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-r4v7-6wcg-ghj5",
  "modified" : "2026-06-25T18:18:12Z",
  "published" : "2026-06-25T18:18:12Z",
  "aliases" : [ ],
  "summary" : "FileBrowser: Missing Rate Limiting on Authentication Endpoint Enables Brute Force Attacks",
  "details" : "### Summary\nThe `/api/auth/login` endpoint does not implement rate limiting, account lockout, or progressive backoff for repeated authentication failures. As a result, an attacker can perform unlimited login attempts against the endpoint. When combined with the username enumeration timing vulnerability, valid accounts can be identified and then brute-forced without restriction. The risk is further increased by a weak default password policy that only enforces a minimum length of five characters.\n\n\n### Details\nThe authentication endpoint `/api/auth/login` does not enforce any form of rate limiting, account lockout, or progressive backoff for repeated failed login attempts. Testing confirmed that the endpoint accepts an unlimited number of authentication attempts from the same client without delay or restriction.\n\nThis allows attackers to repeatedly attempt password guesses against valid usernames.\n\nSecure authentication systems typically enforce request throttling, temporary account lockout, or progressive delays after repeated failed login attempts to mitigate brute-force attacks.\n```\n$ python rate-limit-probe.py\n[*] Probing http://localhost/api/auth/login for rate limiting, lockout, and backoff behavior...\n    Attempt  10: status=401, latency=0.0411s\n    Attempt  20: status=401, latency=0.0411s\n    Attempt  30: status=401, latency=0.0402s\n    Attempt  40: status=401, latency=0.0420s\n    Attempt  50: status=401, latency=0.0403s\n    Attempt  60: status=401, latency=0.0423s\n    Attempt  70: status=401, latency=0.0474s\n    Attempt  80: status=401, latency=0.0417s\n    Attempt  90: status=401, latency=0.0407s\n    Attempt 100: status=401, latency=0.0407s\n\n--- CONCRETE EVIDENCE ---\nAttempts completed:        100\nTotal runtime:             4.17s\nAverage request rate:      23.98 req/sec\nUnique status codes:       [401]\nAverage time (first 5):    0.0447s\nAverage time (last 5):     0.0408s\nLatency delta:             -0.0038s\n[RESULT] No HTTP 429 responses observed.\n[RESULT] No progressive backoff detected: response timing remained effectively constant.\n```\n#### Additional Context\nPassword validation is implemented in `backend/database/storage/bolt/user.go` via `checkPassword()`, which only verifies that the supplied password length is greater than or equal to settings.Config.Auth.Methods.PasswordAuth.MinLength. In `backend/common/settings/auth.go`, the PasswordAuthConfig documents the default value of MinLength as 5. No additional complexity requirements, such as uppercase, lowercase, numeric, or special character checks, were identified in this code path.\n\n### PoC\nThe script below demonstrates the lack of rate limiting by performing a high volume automated authentication test.  The script sends sequential login requests and monitors for HTTP 429 (Too Many Requests) status codes. \n\n```\nimport requests\nimport time\nimport statistics\n\nURL = \"http://localhost/api/auth/login\"\nUSERNAME = \"admin\"\nPASSWORD = \"wrong-password\"\nMAX_ATTEMPTS = 100\nTIMEOUT = 10\n\nlatencies = []\nstatuses = []\n\nprint(f\"[*] Probing {URL} for rate limiting, lockout, and backoff behavior...\")\n\nstart_total = time.time()\n\nfor i in range(1, MAX_ATTEMPTS + 1):\n    start = time.perf_counter()\n\n    resp = requests.post(\n        URL,\n        params={\"username\": USERNAME, \"recaptcha\": \"\"},\n        headers={\"X-Password\": PASSWORD},\n        timeout=TIMEOUT\n    )\n\n    duration = time.perf_counter() - start\n    latencies.append(duration)\n    statuses.append(resp.status_code)\n\n    if resp.status_code == 429:\n        print(f\"[!] Rate limit detected at attempt {i} (HTTP 429)\")\n        break\n\n    if i % 10 == 0:\n        print(f\"    Attempt {i:3}: status={resp.status_code}, latency={duration:.4f}s\")\n\nend_total = time.time()\nattempts_completed = len(latencies)\n\nprint(\"\\n--- CONCRETE EVIDENCE ---\")\n\nfirst_five_avg = statistics.mean(latencies[:5]) if attempts_completed >= 5 else statistics.mean(latencies)\nlast_five_avg = statistics.mean(latencies[-5:]) if attempts_completed >= 5 else statistics.mean(latencies)\nlatency_delta = last_five_avg - first_five_avg\n\nprint(f\"Attempts completed:        {attempts_completed}\")\nprint(f\"Total runtime:             {end_total - start_total:.2f}s\")\nprint(f\"Average request rate:      {attempts_completed / (end_total - start_total):.2f} req/sec\")\nprint(f\"Unique status codes:       {sorted(set(statuses))}\")\nprint(f\"Average time (first 5):    {first_five_avg:.4f}s\")\nprint(f\"Average time (last 5):     {last_five_avg:.4f}s\")\nprint(f\"Latency delta:             {latency_delta:+.4f}s\")\n\nif 429 not in statuses:\n    print(\"[RESULT] No HTTP 429 responses observed.\")\n\nif abs(latency_delta) < 0.05:\n    print(\"[RESULT] No progressive backoff detected: response timing remained effectively constant.\")\nelse:\n    print(\"[RESULT] Latency variation detected: investigate possible throttling or environmental noise.\")\n```                                  \n\n### Impact\nAn attacker can perform unlimited authentication attempts against valid usernames. When combined with the username enumeration timing vulnerability, this enables targeted brute-force attacks against user accounts and increases the likelihood of credential compromise.\n\n\n\nPlease let me know if you need any additional information or clarification.\nI'm happy to assist with testing or validating a fix.",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "Go",
      "name" : "github.com/gtsteffaniak/filebrowser"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "0.0.0-20260522161427-fa5abc8c67f3a"
      } ]
    } ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/gtsteffaniak/filebrowser/security/advisories/GHSA-r4v7-6wcg-ghj5"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/gtsteffaniak/filebrowser/pull/2485"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/gtsteffaniak/filebrowser/commit/fa5abc8c67f3a66ce76e358a3c57981750c76a23"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/gtsteffaniak/filebrowser"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-307" ],
    "severity" : "MODERATE",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-06-25T18:18:12Z",
    "nvd_published_at" : null
  }
}