CVE-2026-62683
File Browser: Trailing-slash delete leaves a stale public share behind
CVE-2026-62683 is a low vulnerability (CVSS 3.1) in Filebrowser, published July 12, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.32%, the 24th percentile. Fixed in github.com/filebrowser/filebrowser/v2 2.63.17.
- Severity
- 3.1 LowCVSS 3.1, CVE List
- Exploit chance
- 0.32%EPSS, 24th percentile
- Exploitation
- None knownNot on CISA’s or ENISA’s lists
- Fixed in
2.63.17github.com/filebrowser/filebrowser/v2 +1 more
Description
File Browser is a file managing interface for uploading, deleting, previewing, renaming, and editing files within a specified directory. Prior to 2.63.17, File Browser can leave a public directory share behind when the shared directory is deleted through a path with a trailing slash because the share cleanup path calls DeleteWithPathPrefix(file.Path, userID) and the Bolt backend performs the database prefix query with the unnormalized path before trimming the slash for boundary checks, so deleting /a/ does not delete the stored /a share and the stale public share exposes future content if the same path is recreated. This issue is fixed in version 2.63.17.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- High
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- None
- Availability
- None
Exploit likelihood
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
github.com/filebrowser/filebrowser/v2Go | before 2.63.17 | 2.63.17 |
github.com/filebrowser/filebrowser/v2Go From an advisory covering 2 CVEs | before 2.63.17 | 2.63.17 |
What each source reports
CVE List Score used 3.1
File Browser: Trailing-slash delete leaves a stale public share behind
File Browser is a file managing interface for uploading, deleting, previewing, renaming, and editing files within a specified directory. Prior to 2.63.17, File Browser can leave a public directory share behind when the shared directory is deleted through a path with a trailing slash because the share cleanup path calls DeleteWithPathPrefix(file.Path, userID) and the Bolt backend performs the database prefix query with the unnormalized path before trimming the slash for boundary checks, so deleting /a/ does not delete the stored /a share and the stale public share exposes future content if the same path is recreated. This issue is fixed in version 2.63.17.
- Record
CVE-2026-62683- CVSS 3.1
- 3.1 Low
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-863
- Updated
- 2026-11-02
EUVDEUVD-2026-44705 3.1
File Browser is a file managing interface for uploading, deleting, previewing, renaming, and editing files within a specified directory. Prior to 2.63.17, File Browser can leave a public directory share behind when the shared directory is deleted through a path with a trailing slash because the share cleanup path calls DeleteWithPathPrefix(file.Path, userID) and the Bolt backend performs the database prefix query with the unnormalized path before trimming the slash for boundary checks, so deleting /a/ does not delete the stored /a share and the stale public share exposes future content if the same path is recreated. This issue is fixed in version 2.63.17.
- Record
EUVD-2026-44705- CVSS 3.1
- 3.1 Low
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:N/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-pp88-jhwj-5qh5 3.1
File Browser: Trailing-slash directory deletion leaves public shares active for recreated paths
Summary
File Browser v2.63.15 can leave a public directory share behind when the shared directory is deleted through a path with a trailing slash. The share cleanup path calls DeleteWithPathPrefix(file.Path, userID), but the Bolt backend performs the database prefix query with the unnormalized argument before trimming the slash for boundary checks. For a stored share at /a, deleting /a/ queries for paths prefixed by /a/, so the exact /a share is never loaded and never deleted.
If a directory with the same path is later recreated, the stale public share becomes active again and exposes the new directory contents through the old public URL.
Impact
An authenticated user with share, download, and delete permissions can create a valid public share, delete the shared path with a trailing slash, and leave the public link in storage. The link is dormant while the path does not exist, but it exposes future content if the same path is recreated later. The final data exposure is unauthenticated through the public share URL.
This bypasses the intended lifecycle cleanup around public shares and is adjacent to the recent public-share path-existence and prefix-boundary fixes.
Reproduction
The following test was run against v2.63.15, commit be23ab3a15bf957928ecfed88de5ab67850c1b9c.
- Create a scoped user with share, download, and delete permissions.
- Create
/a/old.txtin that user's scope. - Store a valid public share row with
Hash: "h",UserID: 1, andPath: "/a". - Send an authenticated delete request for
/a/through the resource delete handler. - Confirm the directory is deleted.
- Confirm share hash
hstill exists in storage. - Recreate
/a/future.txt. - Request the public share handler at
h/and observe that the unauthenticated response includesfuture.txt.
Command used for the local proof:
go test ./http -run TestValidationTrailingSlashDeleteLeavesExactDirectoryShare -count=1 -v
Observed result:
=== RUN TestValidationTrailingSlashDeleteLeavesExactDirectoryShare
--- PASS: TestValidationTrailingSlashDeleteLeavesExactDirectoryShare (0.03s)
PASS
ok github.com/filebrowser/filebrowser/v2/http 0.044s
Root cause
storage/bolt/share.go queries the share index before normalizing the path:
func (s shareBackend) DeleteWithPathPrefix(pathPrefix string, userID uint) error {
var links []share.Link
if err := s.db.Prefix("Path", pathPrefix, &links); err != nil {
...
}
prefix := strings.TrimRight(pathPrefix, "/")
for _, link := range links {
if link.UserID != userID {
continue
}
if link.Path != prefix && !strings.HasPrefix(link.Path, prefix+"/") {
continue
}
...
}
}
For pathPrefix == "/a/", the database prefix query can return descendants such as /a/child, but it does not return the exact share path /a. The later TrimRight cannot delete the exact share because that row was not loaded from storage.
http/resource.go passes the request-derived path into this cleanup before removing the resource:
file, err := files.NewFileInfo(... Path: r.URL.Path ...)
...
err = d.store.Share.DeleteWithPathPrefix(file.Path, d.user.ID)
...
return d.user.Fs.RemoveAll(r.URL.Path)
A request for /a/ therefore removes the directory but misses the exact /a share row.
Remediation
Normalize the path before querying the share index, and cover both the exact normalized path and its descendants. Add regression tests where a stored share path /a is removed by DeleteWithPathPrefix("/a/", userID) and where DELETE /api/resources/a/ deletes the exact public share row.
Fixed in version 2.63.17.
- Record
GHSA-pp88-jhwj-5qh5- CVSS 3.1
- 3.1 Low
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-863
- Updated
- 2026-11-13
NVD 3.1
File Browser is a file managing interface for uploading, deleting, previewing, renaming, and editing files within a specified directory. Prior to 2.63.17, File Browser can leave a public directory share behind when the shared directory is deleted through a path with a trailing slash because the share cleanup path calls DeleteWithPathPrefix(file.Path, userID) and the Bolt backend performs the database prefix query with the unnormalized path before trimming the slash for boundary checks, so deleting /a/ does not delete the stored /a share and the stale public share exposes future content if the same path is recreated. This issue is fixed in version 2.63.17.
- Record
CVE-2026-62683- CVSS 3.1
- 3.1 Low
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-863
- Updated
- 2026-11-02
OSVCVE-2026-61874 2.3
filebrowser before 2.63.17 Stale Public Share via Trailing-Slash Delete
filebrowser versions before 2.63.17 fail to normalize paths before querying the share index in DeleteWithPathPrefix, allowing authenticated users to leave stale public shares behind. Attackers can delete a shared directory using a trailing-slash path, then recreate the same directory to expose new contents through the dormant public share URL.
- Record
CVE-2026-61874- CVSS 4.0
- 2.3 Low
CVSS:4.0/AV:N/AC:H/AT:P/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-863
- Updated
- 2026-11-02
OSV 3.1
File Browser: Trailing-slash delete leaves a stale public share behind
File Browser is a file managing interface for uploading, deleting, previewing, renaming, and editing files within a specified directory. Prior to 2.63.17, File Browser can leave a public directory share behind when the shared directory is deleted through a path with a trailing slash because the share cleanup path calls DeleteWithPathPrefix(file.Path, userID) and the Bolt backend performs the database prefix query with the unnormalized path before trimming the slash for boundary checks, so deleting /a/ does not delete the stored /a share and the stale public share exposes future content if the same path is recreated. This issue is fixed in version 2.63.17.
- Record
CVE-2026-62683- CVSS 3.1
- 3.1 Low
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-863
- Updated
- 2026-11-02
OSVGHSA-pp88-jhwj-5qh5 3.1
File Browser: Trailing-slash directory deletion leaves public shares active for recreated paths
Summary
File Browser v2.63.15 can leave a public directory share behind when the shared directory is deleted through a path with a trailing slash. The share cleanup path calls DeleteWithPathPrefix(file.Path, userID), but the Bolt backend performs the database prefix query with the unnormalized argument before trimming the slash for boundary checks. For a stored share at /a, deleting /a/ queries for paths prefixed by /a/, so the exact /a share is never loaded and never deleted.
If a directory with the same path is later recreated, the stale public share becomes active again and exposes the new directory contents through the old public URL.
Impact
An authenticated user with share, download, and delete permissions can create a valid public share, delete the shared path with a trailing slash, and leave the public link in storage. The link is dormant while the path does not exist, but it exposes future content if the same path is recreated later. The final data exposure is unauthenticated through the public share URL.
This bypasses the intended lifecycle cleanup around public shares and is adjacent to the recent public-share path-existence and prefix-boundary fixes.
Reproduction
The following test was run against v2.63.15, commit be23ab3a15bf957928ecfed88de5ab67850c1b9c.
- Create a scoped user with share, download, and delete permissions.
- Create
/a/old.txtin that user's scope. - Store a valid public share row with
Hash: "h",UserID: 1, andPath: "/a". - Send an authenticated delete request for
/a/through the resource delete handler. - Confirm the directory is deleted.
- Confirm share hash
hstill exists in storage. - Recreate
/a/future.txt. - Request the public share handler at
h/and observe that the unauthenticated response includesfuture.txt.
Command used for the local proof:
go test ./http -run TestValidationTrailingSlashDeleteLeavesExactDirectoryShare -count=1 -v
Observed result:
=== RUN TestValidationTrailingSlashDeleteLeavesExactDirectoryShare
--- PASS: TestValidationTrailingSlashDeleteLeavesExactDirectoryShare (0.03s)
PASS
ok github.com/filebrowser/filebrowser/v2/http 0.044s
Root cause
storage/bolt/share.go queries the share index before normalizing the path:
func (s shareBackend) DeleteWithPathPrefix(pathPrefix string, userID uint) error {
var links []share.Link
if err := s.db.Prefix("Path", pathPrefix, &links); err != nil {
...
}
prefix := strings.TrimRight(pathPrefix, "/")
for _, link := range links {
if link.UserID != userID {
continue
}
if link.Path != prefix && !strings.HasPrefix(link.Path, prefix+"/") {
continue
}
...
}
}
For pathPrefix == "/a/", the database prefix query can return descendants such as /a/child, but it does not return the exact share path /a. The later TrimRight cannot delete the exact share because that row was not loaded from storage.
http/resource.go passes the request-derived path into this cleanup before removing the resource:
file, err := files.NewFileInfo(... Path: r.URL.Path ...)
...
err = d.store.Share.DeleteWithPathPrefix(file.Path, d.user.ID)
...
return d.user.Fs.RemoveAll(r.URL.Path)
A request for /a/ therefore removes the directory but misses the exact /a share row.
Remediation
Normalize the path before querying the share index, and cover both the exact normalized path and its descendants. Add regression tests where a stored share path /a is removed by DeleteWithPathPrefix("/a/", userID) and where DELETE /api/resources/a/ deletes the exact public share row.
Fixed in version 2.63.17.
- Record
GHSA-pp88-jhwj-5qh5- CVSS 3.1
- 3.1 Low
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-863
- Updated
- 2026-11-13
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, references | OSV | |
| affected, facts, references | GitHub Advisories | |
| facts | ||
| first indexed | CVE List, EUVD, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
References
github.com/filebrowser/filebrowser/security/advisories/GHSA-pp88-jhwj-5qh5
github.com/filebrowser/filebrowser/commit/f30fca636c1af9ef401e9a82ff60391cb3db97e1
github.com/filebrowser/filebrowser/releases/tag/v2.63.17
nvd.nist.gov/vuln/detail/cve-2026-62683
github.com/advisories/GHSA-pp88-jhwj-5qh5
github.com/CVEProject/cvelistV5/tree/main/cves/2026/61xxx/CVE-2026-61874.json
Show 6 moreShow less
nvd.nist.gov/vuln/detail/CVE-2026-61874
vulncheck.com/advisories/filebrowser-before-stale-public-share-via-trailing-slash-delete
github.com/filebrowser/filebrowser/commit/be23ab3a15bf957928ecfed88de5ab67850c1b9c
github.com/CVEProject/cvelistV5/tree/main/cves/2026/62xxx/CVE-2026-62683.json
nvd.nist.gov/vuln/detail/CVE-2026-62683
github.com/filebrowser/filebrowser