github.com/patrickhener/goshs/v2
Feature-rich single-binary file server for red teamers and developers. HTTP/S · WebDAV · FTP/SFTP · SMB · LDAP/S · NTLM hash capture · DNS/SMTP callbacks · TLS · Auth · Share links. A powerful python3 -m http.server replacement.
Activity
- Latest release
- 3w ago
- Total releases
- 17
- Cadence
- ~4 days
- Last 12 months
- 17
Reach
- Stars
- 964
Details
- First release
- Apr 14, 2026
| Version | Released | |
|---|---|---|
v2.1.6
patch
1 CVE
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev |
v2.1.6
patch
Dependencies (29)
+ 21 more |
|
v2.1.5
patch
1 CVE
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev |
v2.1.5
patch
Dependencies (29)
+ 21 more |
|
v2.1.4
patch
3 CVEs
CVE-2026-66064
GHSA-964w-f6gj-5236
GO-2026-6134
Jul 28, 2026
goshs has ACL Bypass & Path Traversal
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Summary
Finding (Medium): trailing-slash ACL and hidden-file bypasshttpserver/handler.go, sendFile (lines 789-801) takes the filename from the RAW req.URL.Path while the file itself is opened from the filepath.Clean-ed path. The two disagree, and a trailing slash makes the derived name the empty string. Both protections key on that derived name, so both are defeated: the rule that never serves the .goshs ACL file, and the acl.Block list. Measured, with negative controls:
Unauthenticated when the ACL is configured block-only (common usage). Stated precisely: AUTHENTICATION IS NOT BYPASSED. An unauthenticated request against a directory protected by authentication still returns 401 under the same trick; I tested that. The claim is specifically that the block list and the ACL-file protection are bypassed. In-tree evidence that sendFile is the defect: the sibling handlers doDir and bulkDownload both derive the name correctly; sendFile is the lone outlier. Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback with negative controls, including the 404-versus-200 pair and the authenticated-directory control that shows authentication is not affected. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-66063
GHSA-wg2q-39h6-66x9
GO-2026-6137
Jul 28, 2026
goshs has a Path Traversal issue
6.5
/ 10
Medium
Network
Low
None
None
Unchanged
Low
Low
None
SummaryThe multipart upload filename fix splits on the path separator but never rejects dot-dot, allowing a write outside the served tree. Finding (Medium): upload filename escapes the served tree (residual of CVE-2026-35393)The multipart filename fix (updown.go lines 135-136) splits on the path separator but never rejects "..". Uploading with filename=".." results in os.Create against the parent of the upload folder with a trailing marker character, outside the served tree, and the subsequent failed rename leaves that file behind. Verified: a file containing ESCAPED_WRITE_PROOF was written outside the webroot, unauthenticated, with the default configuration. Not claimed: a Windows-specific variant (Go's Part.FileName() already applies filepath.Base). Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev |
v2.1.4
patch
Dependencies (30)
+ 22 more |
|
v2.1.3
patch
5 CVEs
CVE-2026-66064
GHSA-964w-f6gj-5236
GO-2026-6134
Jul 28, 2026
goshs has ACL Bypass & Path Traversal
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Summary
Finding (Medium): trailing-slash ACL and hidden-file bypasshttpserver/handler.go, sendFile (lines 789-801) takes the filename from the RAW req.URL.Path while the file itself is opened from the filepath.Clean-ed path. The two disagree, and a trailing slash makes the derived name the empty string. Both protections key on that derived name, so both are defeated: the rule that never serves the .goshs ACL file, and the acl.Block list. Measured, with negative controls:
Unauthenticated when the ACL is configured block-only (common usage). Stated precisely: AUTHENTICATION IS NOT BYPASSED. An unauthenticated request against a directory protected by authentication still returns 401 under the same trick; I tested that. The claim is specifically that the block list and the ACL-file protection are bypassed. In-tree evidence that sendFile is the defect: the sibling handlers doDir and bulkDownload both derive the name correctly; sendFile is the lone outlier. Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback with negative controls, including the 404-versus-200 pair and the authenticated-directory control that shows authentication is not affected. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-66063
GHSA-wg2q-39h6-66x9
GO-2026-6137
Jul 28, 2026
goshs has a Path Traversal issue
6.5
/ 10
Medium
Network
Low
None
None
Unchanged
Low
Low
None
SummaryThe multipart upload filename fix splits on the path separator but never rejects dot-dot, allowing a write outside the served tree. Finding (Medium): upload filename escapes the served tree (residual of CVE-2026-35393)The multipart filename fix (updown.go lines 135-136) splits on the path separator but never rejects "..". Uploading with filename=".." results in os.Create against the parent of the upload folder with a trailing marker character, outside the served tree, and the subsequent failed rename leaves that file behind. Verified: a file containing ESCAPED_WRITE_PROOF was written outside the webroot, unauthenticated, with the default configuration. Not claimed: a Windows-specific variant (Go's Part.FileName() already applies filepath.Base). Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-64863
GHSA-hq33-8jgp-8qq3
GO-2026-6136
Jul 28, 2026
goshs --no-delete WebDAV MOVE bypass allows file deletion/overwrite
9.1
/ 10
Critical
Network
Low
None
None
Unchanged
None
High
High
SummaryThe WebDAV mode-flag guard added to fix GHSA-3whc-qvhv-xqjp still does not enforce This is a residual of the parent fix: the guard classifies Affectedgoshs v2.1.3 (current release, commit Details
The Proof of conceptReproduced live against goshs v2.1.3 on 2026-07-02. Server started with
Control - DELETE is correctly blocked:
secret.txt still exists on disk. Bypass 1 - MOVE removes the source file despite --no-delete:
secret.txt is now deleted from disk (its content is at gone.txt). Bypass 2 - MOVE with Overwrite:T destroys an existing victim file:
ImpactAn operator running Suggested fixMove
Add an integration test covering Fixed in
2.1.4
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-62325
GHSA-rjrw-mjq6-hpmm
GO-2026-6132
Jul 28, 2026
goshs SFTP authentication bypass via empty password (incomplete fix of CVE-2026-40884)
9.1
/ 10
Critical
Network
Low
None
None
Unchanged
High
High
None
SummaryStart goshs v2.1.3 with CVE-2026-40884CVE-2026-40884 (GHSA-c29w-qq4m-2gcv, Apr 13 2026) reported the empty-username case:
Empty username → Patrickhener fixed it with a sanity check at
Empty Password BypassSame
CVE-2026-40884 patched the symptom (empty username) with input validation. Root cause ( PoC
Root Cause
Incomplete FixPatrickhener added
Impact
AffectedAll goshs versions including v2.1.3. CVE-2026-40884 fix does not cover this variant. Recommended Fix
Affected versions
2.1.3
Fixed in
2.1.4
References Updated Aug 18, 2026 · Source: OSV.dev
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev |
v2.1.3
patch
Dependencies (29)
+ 21 more |
|
v2.1.2
patch
4 CVEs
CVE-2026-66064
GHSA-964w-f6gj-5236
GO-2026-6134
Jul 28, 2026
goshs has ACL Bypass & Path Traversal
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Summary
Finding (Medium): trailing-slash ACL and hidden-file bypasshttpserver/handler.go, sendFile (lines 789-801) takes the filename from the RAW req.URL.Path while the file itself is opened from the filepath.Clean-ed path. The two disagree, and a trailing slash makes the derived name the empty string. Both protections key on that derived name, so both are defeated: the rule that never serves the .goshs ACL file, and the acl.Block list. Measured, with negative controls:
Unauthenticated when the ACL is configured block-only (common usage). Stated precisely: AUTHENTICATION IS NOT BYPASSED. An unauthenticated request against a directory protected by authentication still returns 401 under the same trick; I tested that. The claim is specifically that the block list and the ACL-file protection are bypassed. In-tree evidence that sendFile is the defect: the sibling handlers doDir and bulkDownload both derive the name correctly; sendFile is the lone outlier. Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback with negative controls, including the 404-versus-200 pair and the authenticated-directory control that shows authentication is not affected. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-66063
GHSA-wg2q-39h6-66x9
GO-2026-6137
Jul 28, 2026
goshs has a Path Traversal issue
6.5
/ 10
Medium
Network
Low
None
None
Unchanged
Low
Low
None
SummaryThe multipart upload filename fix splits on the path separator but never rejects dot-dot, allowing a write outside the served tree. Finding (Medium): upload filename escapes the served tree (residual of CVE-2026-35393)The multipart filename fix (updown.go lines 135-136) splits on the path separator but never rejects "..". Uploading with filename=".." results in os.Create against the parent of the upload folder with a trailing marker character, outside the served tree, and the subsequent failed rename leaves that file behind. Verified: a file containing ESCAPED_WRITE_PROOF was written outside the webroot, unauthenticated, with the default configuration. Not claimed: a Windows-specific variant (Go's Part.FileName() already applies filepath.Base). Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-64863
GHSA-hq33-8jgp-8qq3
GO-2026-6136
Jul 28, 2026
goshs --no-delete WebDAV MOVE bypass allows file deletion/overwrite
9.1
/ 10
Critical
Network
Low
None
None
Unchanged
None
High
High
SummaryThe WebDAV mode-flag guard added to fix GHSA-3whc-qvhv-xqjp still does not enforce This is a residual of the parent fix: the guard classifies Affectedgoshs v2.1.3 (current release, commit Details
The Proof of conceptReproduced live against goshs v2.1.3 on 2026-07-02. Server started with
Control - DELETE is correctly blocked:
secret.txt still exists on disk. Bypass 1 - MOVE removes the source file despite --no-delete:
secret.txt is now deleted from disk (its content is at gone.txt). Bypass 2 - MOVE with Overwrite:T destroys an existing victim file:
ImpactAn operator running Suggested fixMove
Add an integration test covering Fixed in
2.1.4
References Updated Aug 18, 2026 · Source: OSV.dev
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev |
v2.1.2
patch
Dependencies (29)
+ 21 more |
|
v2.1.1
patch
4 CVEs
CVE-2026-66064
GHSA-964w-f6gj-5236
GO-2026-6134
Jul 28, 2026
goshs has ACL Bypass & Path Traversal
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Summary
Finding (Medium): trailing-slash ACL and hidden-file bypasshttpserver/handler.go, sendFile (lines 789-801) takes the filename from the RAW req.URL.Path while the file itself is opened from the filepath.Clean-ed path. The two disagree, and a trailing slash makes the derived name the empty string. Both protections key on that derived name, so both are defeated: the rule that never serves the .goshs ACL file, and the acl.Block list. Measured, with negative controls:
Unauthenticated when the ACL is configured block-only (common usage). Stated precisely: AUTHENTICATION IS NOT BYPASSED. An unauthenticated request against a directory protected by authentication still returns 401 under the same trick; I tested that. The claim is specifically that the block list and the ACL-file protection are bypassed. In-tree evidence that sendFile is the defect: the sibling handlers doDir and bulkDownload both derive the name correctly; sendFile is the lone outlier. Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback with negative controls, including the 404-versus-200 pair and the authenticated-directory control that shows authentication is not affected. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-66063
GHSA-wg2q-39h6-66x9
GO-2026-6137
Jul 28, 2026
goshs has a Path Traversal issue
6.5
/ 10
Medium
Network
Low
None
None
Unchanged
Low
Low
None
SummaryThe multipart upload filename fix splits on the path separator but never rejects dot-dot, allowing a write outside the served tree. Finding (Medium): upload filename escapes the served tree (residual of CVE-2026-35393)The multipart filename fix (updown.go lines 135-136) splits on the path separator but never rejects "..". Uploading with filename=".." results in os.Create against the parent of the upload folder with a trailing marker character, outside the served tree, and the subsequent failed rename leaves that file behind. Verified: a file containing ESCAPED_WRITE_PROOF was written outside the webroot, unauthenticated, with the default configuration. Not claimed: a Windows-specific variant (Go's Part.FileName() already applies filepath.Base). Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-64863
GHSA-hq33-8jgp-8qq3
GO-2026-6136
Jul 28, 2026
goshs --no-delete WebDAV MOVE bypass allows file deletion/overwrite
9.1
/ 10
Critical
Network
Low
None
None
Unchanged
None
High
High
SummaryThe WebDAV mode-flag guard added to fix GHSA-3whc-qvhv-xqjp still does not enforce This is a residual of the parent fix: the guard classifies Affectedgoshs v2.1.3 (current release, commit Details
The Proof of conceptReproduced live against goshs v2.1.3 on 2026-07-02. Server started with
Control - DELETE is correctly blocked:
secret.txt still exists on disk. Bypass 1 - MOVE removes the source file despite --no-delete:
secret.txt is now deleted from disk (its content is at gone.txt). Bypass 2 - MOVE with Overwrite:T destroys an existing victim file:
ImpactAn operator running Suggested fixMove
Add an integration test covering Fixed in
2.1.4
References Updated Aug 18, 2026 · Source: OSV.dev
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev |
v2.1.1
patch
Dependencies (29)
+ 21 more |
|
v2.1.0
minor
5 CVEs
CVE-2026-66064
GHSA-964w-f6gj-5236
GO-2026-6134
Jul 28, 2026
goshs has ACL Bypass & Path Traversal
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Summary
Finding (Medium): trailing-slash ACL and hidden-file bypasshttpserver/handler.go, sendFile (lines 789-801) takes the filename from the RAW req.URL.Path while the file itself is opened from the filepath.Clean-ed path. The two disagree, and a trailing slash makes the derived name the empty string. Both protections key on that derived name, so both are defeated: the rule that never serves the .goshs ACL file, and the acl.Block list. Measured, with negative controls:
Unauthenticated when the ACL is configured block-only (common usage). Stated precisely: AUTHENTICATION IS NOT BYPASSED. An unauthenticated request against a directory protected by authentication still returns 401 under the same trick; I tested that. The claim is specifically that the block list and the ACL-file protection are bypassed. In-tree evidence that sendFile is the defect: the sibling handlers doDir and bulkDownload both derive the name correctly; sendFile is the lone outlier. Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback with negative controls, including the 404-versus-200 pair and the authenticated-directory control that shows authentication is not affected. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-66063
GHSA-wg2q-39h6-66x9
GO-2026-6137
Jul 28, 2026
goshs has a Path Traversal issue
6.5
/ 10
Medium
Network
Low
None
None
Unchanged
Low
Low
None
SummaryThe multipart upload filename fix splits on the path separator but never rejects dot-dot, allowing a write outside the served tree. Finding (Medium): upload filename escapes the served tree (residual of CVE-2026-35393)The multipart filename fix (updown.go lines 135-136) splits on the path separator but never rejects "..". Uploading with filename=".." results in os.Create against the parent of the upload folder with a trailing marker character, outside the served tree, and the subsequent failed rename leaves that file behind. Verified: a file containing ESCAPED_WRITE_PROOF was written outside the webroot, unauthenticated, with the default configuration. Not claimed: a Windows-specific variant (Go's Part.FileName() already applies filepath.Base). Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-64863
GHSA-hq33-8jgp-8qq3
GO-2026-6136
Jul 28, 2026
goshs --no-delete WebDAV MOVE bypass allows file deletion/overwrite
9.1
/ 10
Critical
Network
Low
None
None
Unchanged
None
High
High
SummaryThe WebDAV mode-flag guard added to fix GHSA-3whc-qvhv-xqjp still does not enforce This is a residual of the parent fix: the guard classifies Affectedgoshs v2.1.3 (current release, commit Details
The Proof of conceptReproduced live against goshs v2.1.3 on 2026-07-02. Server started with
Control - DELETE is correctly blocked:
secret.txt still exists on disk. Bypass 1 - MOVE removes the source file despite --no-delete:
secret.txt is now deleted from disk (its content is at gone.txt). Bypass 2 - MOVE with Overwrite:T destroys an existing victim file:
ImpactAn operator running Suggested fixMove
Add an integration test covering Fixed in
2.1.4
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-54719
GHSA-rmxw-pq4x-3fvh
GO-2026-6133
Jul 28, 2026
goshs: File-based .goshs ACL authorization bypass via the ?bulk zip-download route (unauthenticated read; residual of GHSA-wvhv-qcqf-f3cx)
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
GHSA-wvhv-qcqf-f3cx fixed the per-folder .goshs ACL bypass on the state-changing routes (PUT/POST upload/?mkdir/?delete) and added recursive ACL resolution, and its description states the read/list path correctly enforces .goshs. That premise does not hold for the ?bulk zip-download route. bulkDownload (httpserver/updown.go) takes one or more ?file= parameters, runs each through sanitizePath(fs.Webroot, file), and streams the contents back as a ZIP without ever calling findEffectiveACL/applyCustomAuth. It is dispatched from earlyBreakParameters (?bulk) before the normal doDir/doFile/sendFile flow that performs the ACL check. An unauthenticated attacker can therefore read any file under the webroot protected solely by a .goshs ACL, bypassing both the folder auth (401 on the normal path) and the per-file block list (404 on the normal path). Same authorization-inconsistency root cause as the original advisory, surviving on a read route the fix did not cover. Proof of concept (live, against the fixed v2.1.0 build which includes fix commit f212c4f4, served with no global -b auth, only a per-folder .goshs): GET /protected/secret.txt -> 401 (ACL enforced on normal path) GET /protected/secret.txt -u admin:admin -> 200 GET /?bulk&file=/protected/secret.txt -> 200, zip contains the protected file contents (BYPASS) GET /?bulk&file=/protected/blocked.txt -> 200, zip contains the block-listed file (block bypass) GET /protected/secret.txt?share -> 403 'Sharing disabled when auth is disabled' (correctly gated, NOT a bypass) Impact: any unauthenticated network attacker can read files an operator protected with the documented per-folder .goshs ACL/basic-auth feature, by requesting them through ?bulk. Confidentiality only (the write/delete equivalents were closed by GHSA-wvhv-qcqf-f3cx). Applies to deployments relying on .goshs as the access boundary (a server-wide -b basic auth, if configured, also gates ?bulk via its middleware). Remediation: enforce the effective .goshs ACL inside bulkDownload for every requested file exactly as sendFile/processDir do (resolve findEffectiveACL(filepath.Dir(absPath)) + applyCustomAuth + honor acl.Block), or route ?bulk through the same authorization gate as the normal read path. Audit ?cbDown and other alternate read routes for the same gap. Credit: anir0y (independent security research). Fixed in
2.1.1
References Updated Aug 18, 2026 · Source: OSV.dev
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev |
v2.1.0
minor
Dependencies (24)
+ 16 more |
|
v2.0.9
patch
5 CVEs
CVE-2026-66064
GHSA-964w-f6gj-5236
GO-2026-6134
Jul 28, 2026
goshs has ACL Bypass & Path Traversal
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Summary
Finding (Medium): trailing-slash ACL and hidden-file bypasshttpserver/handler.go, sendFile (lines 789-801) takes the filename from the RAW req.URL.Path while the file itself is opened from the filepath.Clean-ed path. The two disagree, and a trailing slash makes the derived name the empty string. Both protections key on that derived name, so both are defeated: the rule that never serves the .goshs ACL file, and the acl.Block list. Measured, with negative controls:
Unauthenticated when the ACL is configured block-only (common usage). Stated precisely: AUTHENTICATION IS NOT BYPASSED. An unauthenticated request against a directory protected by authentication still returns 401 under the same trick; I tested that. The claim is specifically that the block list and the ACL-file protection are bypassed. In-tree evidence that sendFile is the defect: the sibling handlers doDir and bulkDownload both derive the name correctly; sendFile is the lone outlier. Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback with negative controls, including the 404-versus-200 pair and the authenticated-directory control that shows authentication is not affected. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-66063
GHSA-wg2q-39h6-66x9
GO-2026-6137
Jul 28, 2026
goshs has a Path Traversal issue
6.5
/ 10
Medium
Network
Low
None
None
Unchanged
Low
Low
None
SummaryThe multipart upload filename fix splits on the path separator but never rejects dot-dot, allowing a write outside the served tree. Finding (Medium): upload filename escapes the served tree (residual of CVE-2026-35393)The multipart filename fix (updown.go lines 135-136) splits on the path separator but never rejects "..". Uploading with filename=".." results in os.Create against the parent of the upload folder with a trailing marker character, outside the served tree, and the subsequent failed rename leaves that file behind. Verified: a file containing ESCAPED_WRITE_PROOF was written outside the webroot, unauthenticated, with the default configuration. Not claimed: a Windows-specific variant (Go's Part.FileName() already applies filepath.Base). Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-64863
GHSA-hq33-8jgp-8qq3
GO-2026-6136
Jul 28, 2026
goshs --no-delete WebDAV MOVE bypass allows file deletion/overwrite
9.1
/ 10
Critical
Network
Low
None
None
Unchanged
None
High
High
SummaryThe WebDAV mode-flag guard added to fix GHSA-3whc-qvhv-xqjp still does not enforce This is a residual of the parent fix: the guard classifies Affectedgoshs v2.1.3 (current release, commit Details
The Proof of conceptReproduced live against goshs v2.1.3 on 2026-07-02. Server started with
Control - DELETE is correctly blocked:
secret.txt still exists on disk. Bypass 1 - MOVE removes the source file despite --no-delete:
secret.txt is now deleted from disk (its content is at gone.txt). Bypass 2 - MOVE with Overwrite:T destroys an existing victim file:
ImpactAn operator running Suggested fixMove
Add an integration test covering Fixed in
2.1.4
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-54719
GHSA-rmxw-pq4x-3fvh
GO-2026-6133
Jul 28, 2026
goshs: File-based .goshs ACL authorization bypass via the ?bulk zip-download route (unauthenticated read; residual of GHSA-wvhv-qcqf-f3cx)
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
GHSA-wvhv-qcqf-f3cx fixed the per-folder .goshs ACL bypass on the state-changing routes (PUT/POST upload/?mkdir/?delete) and added recursive ACL resolution, and its description states the read/list path correctly enforces .goshs. That premise does not hold for the ?bulk zip-download route. bulkDownload (httpserver/updown.go) takes one or more ?file= parameters, runs each through sanitizePath(fs.Webroot, file), and streams the contents back as a ZIP without ever calling findEffectiveACL/applyCustomAuth. It is dispatched from earlyBreakParameters (?bulk) before the normal doDir/doFile/sendFile flow that performs the ACL check. An unauthenticated attacker can therefore read any file under the webroot protected solely by a .goshs ACL, bypassing both the folder auth (401 on the normal path) and the per-file block list (404 on the normal path). Same authorization-inconsistency root cause as the original advisory, surviving on a read route the fix did not cover. Proof of concept (live, against the fixed v2.1.0 build which includes fix commit f212c4f4, served with no global -b auth, only a per-folder .goshs): GET /protected/secret.txt -> 401 (ACL enforced on normal path) GET /protected/secret.txt -u admin:admin -> 200 GET /?bulk&file=/protected/secret.txt -> 200, zip contains the protected file contents (BYPASS) GET /?bulk&file=/protected/blocked.txt -> 200, zip contains the block-listed file (block bypass) GET /protected/secret.txt?share -> 403 'Sharing disabled when auth is disabled' (correctly gated, NOT a bypass) Impact: any unauthenticated network attacker can read files an operator protected with the documented per-folder .goshs ACL/basic-auth feature, by requesting them through ?bulk. Confidentiality only (the write/delete equivalents were closed by GHSA-wvhv-qcqf-f3cx). Applies to deployments relying on .goshs as the access boundary (a server-wide -b basic auth, if configured, also gates ?bulk via its middleware). Remediation: enforce the effective .goshs ACL inside bulkDownload for every requested file exactly as sendFile/processDir do (resolve findEffectiveACL(filepath.Dir(absPath)) + applyCustomAuth + honor acl.Block), or route ?bulk through the same authorization gate as the normal read path. Audit ?cbDown and other alternate read routes for the same gap. Credit: anir0y (independent security research). Fixed in
2.1.1
References Updated Aug 18, 2026 · Source: OSV.dev
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev |
v2.0.9
patch
Dependencies (24)
+ 16 more |
|
v2.0.8
patch
5 CVEs
CVE-2026-66064
GHSA-964w-f6gj-5236
GO-2026-6134
Jul 28, 2026
goshs has ACL Bypass & Path Traversal
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Summary
Finding (Medium): trailing-slash ACL and hidden-file bypasshttpserver/handler.go, sendFile (lines 789-801) takes the filename from the RAW req.URL.Path while the file itself is opened from the filepath.Clean-ed path. The two disagree, and a trailing slash makes the derived name the empty string. Both protections key on that derived name, so both are defeated: the rule that never serves the .goshs ACL file, and the acl.Block list. Measured, with negative controls:
Unauthenticated when the ACL is configured block-only (common usage). Stated precisely: AUTHENTICATION IS NOT BYPASSED. An unauthenticated request against a directory protected by authentication still returns 401 under the same trick; I tested that. The claim is specifically that the block list and the ACL-file protection are bypassed. In-tree evidence that sendFile is the defect: the sibling handlers doDir and bulkDownload both derive the name correctly; sendFile is the lone outlier. Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback with negative controls, including the 404-versus-200 pair and the authenticated-directory control that shows authentication is not affected. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-66063
GHSA-wg2q-39h6-66x9
GO-2026-6137
Jul 28, 2026
goshs has a Path Traversal issue
6.5
/ 10
Medium
Network
Low
None
None
Unchanged
Low
Low
None
SummaryThe multipart upload filename fix splits on the path separator but never rejects dot-dot, allowing a write outside the served tree. Finding (Medium): upload filename escapes the served tree (residual of CVE-2026-35393)The multipart filename fix (updown.go lines 135-136) splits on the path separator but never rejects "..". Uploading with filename=".." results in os.Create against the parent of the upload folder with a trailing marker character, outside the served tree, and the subsequent failed rename leaves that file behind. Verified: a file containing ESCAPED_WRITE_PROOF was written outside the webroot, unauthenticated, with the default configuration. Not claimed: a Windows-specific variant (Go's Part.FileName() already applies filepath.Base). Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-64863
GHSA-hq33-8jgp-8qq3
GO-2026-6136
Jul 28, 2026
goshs --no-delete WebDAV MOVE bypass allows file deletion/overwrite
9.1
/ 10
Critical
Network
Low
None
None
Unchanged
None
High
High
SummaryThe WebDAV mode-flag guard added to fix GHSA-3whc-qvhv-xqjp still does not enforce This is a residual of the parent fix: the guard classifies Affectedgoshs v2.1.3 (current release, commit Details
The Proof of conceptReproduced live against goshs v2.1.3 on 2026-07-02. Server started with
Control - DELETE is correctly blocked:
secret.txt still exists on disk. Bypass 1 - MOVE removes the source file despite --no-delete:
secret.txt is now deleted from disk (its content is at gone.txt). Bypass 2 - MOVE with Overwrite:T destroys an existing victim file:
ImpactAn operator running Suggested fixMove
Add an integration test covering Fixed in
2.1.4
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-54719
GHSA-rmxw-pq4x-3fvh
GO-2026-6133
Jul 28, 2026
goshs: File-based .goshs ACL authorization bypass via the ?bulk zip-download route (unauthenticated read; residual of GHSA-wvhv-qcqf-f3cx)
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
GHSA-wvhv-qcqf-f3cx fixed the per-folder .goshs ACL bypass on the state-changing routes (PUT/POST upload/?mkdir/?delete) and added recursive ACL resolution, and its description states the read/list path correctly enforces .goshs. That premise does not hold for the ?bulk zip-download route. bulkDownload (httpserver/updown.go) takes one or more ?file= parameters, runs each through sanitizePath(fs.Webroot, file), and streams the contents back as a ZIP without ever calling findEffectiveACL/applyCustomAuth. It is dispatched from earlyBreakParameters (?bulk) before the normal doDir/doFile/sendFile flow that performs the ACL check. An unauthenticated attacker can therefore read any file under the webroot protected solely by a .goshs ACL, bypassing both the folder auth (401 on the normal path) and the per-file block list (404 on the normal path). Same authorization-inconsistency root cause as the original advisory, surviving on a read route the fix did not cover. Proof of concept (live, against the fixed v2.1.0 build which includes fix commit f212c4f4, served with no global -b auth, only a per-folder .goshs): GET /protected/secret.txt -> 401 (ACL enforced on normal path) GET /protected/secret.txt -u admin:admin -> 200 GET /?bulk&file=/protected/secret.txt -> 200, zip contains the protected file contents (BYPASS) GET /?bulk&file=/protected/blocked.txt -> 200, zip contains the block-listed file (block bypass) GET /protected/secret.txt?share -> 403 'Sharing disabled when auth is disabled' (correctly gated, NOT a bypass) Impact: any unauthenticated network attacker can read files an operator protected with the documented per-folder .goshs ACL/basic-auth feature, by requesting them through ?bulk. Confidentiality only (the write/delete equivalents were closed by GHSA-wvhv-qcqf-f3cx). Applies to deployments relying on .goshs as the access boundary (a server-wide -b basic auth, if configured, also gates ?bulk via its middleware). Remediation: enforce the effective .goshs ACL inside bulkDownload for every requested file exactly as sendFile/processDir do (resolve findEffectiveACL(filepath.Dir(absPath)) + applyCustomAuth + honor acl.Block), or route ?bulk through the same authorization gate as the normal read path. Audit ?cbDown and other alternate read routes for the same gap. Credit: anir0y (independent security research). Fixed in
2.1.1
References Updated Aug 18, 2026 · Source: OSV.dev
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev |
v2.0.8
patch
Dependencies (24)
+ 16 more |
|
v2.0.7
patch
5 CVEs
CVE-2026-66064
GHSA-964w-f6gj-5236
GO-2026-6134
Jul 28, 2026
goshs has ACL Bypass & Path Traversal
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Summary
Finding (Medium): trailing-slash ACL and hidden-file bypasshttpserver/handler.go, sendFile (lines 789-801) takes the filename from the RAW req.URL.Path while the file itself is opened from the filepath.Clean-ed path. The two disagree, and a trailing slash makes the derived name the empty string. Both protections key on that derived name, so both are defeated: the rule that never serves the .goshs ACL file, and the acl.Block list. Measured, with negative controls:
Unauthenticated when the ACL is configured block-only (common usage). Stated precisely: AUTHENTICATION IS NOT BYPASSED. An unauthenticated request against a directory protected by authentication still returns 401 under the same trick; I tested that. The claim is specifically that the block list and the ACL-file protection are bypassed. In-tree evidence that sendFile is the defect: the sibling handlers doDir and bulkDownload both derive the name correctly; sendFile is the lone outlier. Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback with negative controls, including the 404-versus-200 pair and the authenticated-directory control that shows authentication is not affected. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-66063
GHSA-wg2q-39h6-66x9
GO-2026-6137
Jul 28, 2026
goshs has a Path Traversal issue
6.5
/ 10
Medium
Network
Low
None
None
Unchanged
Low
Low
None
SummaryThe multipart upload filename fix splits on the path separator but never rejects dot-dot, allowing a write outside the served tree. Finding (Medium): upload filename escapes the served tree (residual of CVE-2026-35393)The multipart filename fix (updown.go lines 135-136) splits on the path separator but never rejects "..". Uploading with filename=".." results in os.Create against the parent of the upload folder with a trailing marker character, outside the served tree, and the subsequent failed rename leaves that file behind. Verified: a file containing ESCAPED_WRITE_PROOF was written outside the webroot, unauthenticated, with the default configuration. Not claimed: a Windows-specific variant (Go's Part.FileName() already applies filepath.Base). Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-64863
GHSA-hq33-8jgp-8qq3
GO-2026-6136
Jul 28, 2026
goshs --no-delete WebDAV MOVE bypass allows file deletion/overwrite
9.1
/ 10
Critical
Network
Low
None
None
Unchanged
None
High
High
SummaryThe WebDAV mode-flag guard added to fix GHSA-3whc-qvhv-xqjp still does not enforce This is a residual of the parent fix: the guard classifies Affectedgoshs v2.1.3 (current release, commit Details
The Proof of conceptReproduced live against goshs v2.1.3 on 2026-07-02. Server started with
Control - DELETE is correctly blocked:
secret.txt still exists on disk. Bypass 1 - MOVE removes the source file despite --no-delete:
secret.txt is now deleted from disk (its content is at gone.txt). Bypass 2 - MOVE with Overwrite:T destroys an existing victim file:
ImpactAn operator running Suggested fixMove
Add an integration test covering Fixed in
2.1.4
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-54719
GHSA-rmxw-pq4x-3fvh
GO-2026-6133
Jul 28, 2026
goshs: File-based .goshs ACL authorization bypass via the ?bulk zip-download route (unauthenticated read; residual of GHSA-wvhv-qcqf-f3cx)
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
GHSA-wvhv-qcqf-f3cx fixed the per-folder .goshs ACL bypass on the state-changing routes (PUT/POST upload/?mkdir/?delete) and added recursive ACL resolution, and its description states the read/list path correctly enforces .goshs. That premise does not hold for the ?bulk zip-download route. bulkDownload (httpserver/updown.go) takes one or more ?file= parameters, runs each through sanitizePath(fs.Webroot, file), and streams the contents back as a ZIP without ever calling findEffectiveACL/applyCustomAuth. It is dispatched from earlyBreakParameters (?bulk) before the normal doDir/doFile/sendFile flow that performs the ACL check. An unauthenticated attacker can therefore read any file under the webroot protected solely by a .goshs ACL, bypassing both the folder auth (401 on the normal path) and the per-file block list (404 on the normal path). Same authorization-inconsistency root cause as the original advisory, surviving on a read route the fix did not cover. Proof of concept (live, against the fixed v2.1.0 build which includes fix commit f212c4f4, served with no global -b auth, only a per-folder .goshs): GET /protected/secret.txt -> 401 (ACL enforced on normal path) GET /protected/secret.txt -u admin:admin -> 200 GET /?bulk&file=/protected/secret.txt -> 200, zip contains the protected file contents (BYPASS) GET /?bulk&file=/protected/blocked.txt -> 200, zip contains the block-listed file (block bypass) GET /protected/secret.txt?share -> 403 'Sharing disabled when auth is disabled' (correctly gated, NOT a bypass) Impact: any unauthenticated network attacker can read files an operator protected with the documented per-folder .goshs ACL/basic-auth feature, by requesting them through ?bulk. Confidentiality only (the write/delete equivalents were closed by GHSA-wvhv-qcqf-f3cx). Applies to deployments relying on .goshs as the access boundary (a server-wide -b basic auth, if configured, also gates ?bulk via its middleware). Remediation: enforce the effective .goshs ACL inside bulkDownload for every requested file exactly as sendFile/processDir do (resolve findEffectiveACL(filepath.Dir(absPath)) + applyCustomAuth + honor acl.Block), or route ?bulk through the same authorization gate as the normal read path. Audit ?cbDown and other alternate read routes for the same gap. Credit: anir0y (independent security research). Fixed in
2.1.1
References Updated Aug 18, 2026 · Source: OSV.dev
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev |
v2.0.7
patch
Dependencies (24)
+ 16 more |
|
v2.0.6
patch
5 CVEs
CVE-2026-66064
GHSA-964w-f6gj-5236
GO-2026-6134
Jul 28, 2026
goshs has ACL Bypass & Path Traversal
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Summary
Finding (Medium): trailing-slash ACL and hidden-file bypasshttpserver/handler.go, sendFile (lines 789-801) takes the filename from the RAW req.URL.Path while the file itself is opened from the filepath.Clean-ed path. The two disagree, and a trailing slash makes the derived name the empty string. Both protections key on that derived name, so both are defeated: the rule that never serves the .goshs ACL file, and the acl.Block list. Measured, with negative controls:
Unauthenticated when the ACL is configured block-only (common usage). Stated precisely: AUTHENTICATION IS NOT BYPASSED. An unauthenticated request against a directory protected by authentication still returns 401 under the same trick; I tested that. The claim is specifically that the block list and the ACL-file protection are bypassed. In-tree evidence that sendFile is the defect: the sibling handlers doDir and bulkDownload both derive the name correctly; sendFile is the lone outlier. Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback with negative controls, including the 404-versus-200 pair and the authenticated-directory control that shows authentication is not affected. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-66063
GHSA-wg2q-39h6-66x9
GO-2026-6137
Jul 28, 2026
goshs has a Path Traversal issue
6.5
/ 10
Medium
Network
Low
None
None
Unchanged
Low
Low
None
SummaryThe multipart upload filename fix splits on the path separator but never rejects dot-dot, allowing a write outside the served tree. Finding (Medium): upload filename escapes the served tree (residual of CVE-2026-35393)The multipart filename fix (updown.go lines 135-136) splits on the path separator but never rejects "..". Uploading with filename=".." results in os.Create against the parent of the upload folder with a trailing marker character, outside the served tree, and the subsequent failed rename leaves that file behind. Verified: a file containing ESCAPED_WRITE_PROOF was written outside the webroot, unauthenticated, with the default configuration. Not claimed: a Windows-specific variant (Go's Part.FileName() already applies filepath.Base). Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-64863
GHSA-hq33-8jgp-8qq3
GO-2026-6136
Jul 28, 2026
goshs --no-delete WebDAV MOVE bypass allows file deletion/overwrite
9.1
/ 10
Critical
Network
Low
None
None
Unchanged
None
High
High
SummaryThe WebDAV mode-flag guard added to fix GHSA-3whc-qvhv-xqjp still does not enforce This is a residual of the parent fix: the guard classifies Affectedgoshs v2.1.3 (current release, commit Details
The Proof of conceptReproduced live against goshs v2.1.3 on 2026-07-02. Server started with
Control - DELETE is correctly blocked:
secret.txt still exists on disk. Bypass 1 - MOVE removes the source file despite --no-delete:
secret.txt is now deleted from disk (its content is at gone.txt). Bypass 2 - MOVE with Overwrite:T destroys an existing victim file:
ImpactAn operator running Suggested fixMove
Add an integration test covering Fixed in
2.1.4
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-54719
GHSA-rmxw-pq4x-3fvh
GO-2026-6133
Jul 28, 2026
goshs: File-based .goshs ACL authorization bypass via the ?bulk zip-download route (unauthenticated read; residual of GHSA-wvhv-qcqf-f3cx)
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
GHSA-wvhv-qcqf-f3cx fixed the per-folder .goshs ACL bypass on the state-changing routes (PUT/POST upload/?mkdir/?delete) and added recursive ACL resolution, and its description states the read/list path correctly enforces .goshs. That premise does not hold for the ?bulk zip-download route. bulkDownload (httpserver/updown.go) takes one or more ?file= parameters, runs each through sanitizePath(fs.Webroot, file), and streams the contents back as a ZIP without ever calling findEffectiveACL/applyCustomAuth. It is dispatched from earlyBreakParameters (?bulk) before the normal doDir/doFile/sendFile flow that performs the ACL check. An unauthenticated attacker can therefore read any file under the webroot protected solely by a .goshs ACL, bypassing both the folder auth (401 on the normal path) and the per-file block list (404 on the normal path). Same authorization-inconsistency root cause as the original advisory, surviving on a read route the fix did not cover. Proof of concept (live, against the fixed v2.1.0 build which includes fix commit f212c4f4, served with no global -b auth, only a per-folder .goshs): GET /protected/secret.txt -> 401 (ACL enforced on normal path) GET /protected/secret.txt -u admin:admin -> 200 GET /?bulk&file=/protected/secret.txt -> 200, zip contains the protected file contents (BYPASS) GET /?bulk&file=/protected/blocked.txt -> 200, zip contains the block-listed file (block bypass) GET /protected/secret.txt?share -> 403 'Sharing disabled when auth is disabled' (correctly gated, NOT a bypass) Impact: any unauthenticated network attacker can read files an operator protected with the documented per-folder .goshs ACL/basic-auth feature, by requesting them through ?bulk. Confidentiality only (the write/delete equivalents were closed by GHSA-wvhv-qcqf-f3cx). Applies to deployments relying on .goshs as the access boundary (a server-wide -b basic auth, if configured, also gates ?bulk via its middleware). Remediation: enforce the effective .goshs ACL inside bulkDownload for every requested file exactly as sendFile/processDir do (resolve findEffectiveACL(filepath.Dir(absPath)) + applyCustomAuth + honor acl.Block), or route ?bulk through the same authorization gate as the normal read path. Audit ?cbDown and other alternate read routes for the same gap. Credit: anir0y (independent security research). Fixed in
2.1.1
References Updated Aug 18, 2026 · Source: OSV.dev
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev |
v2.0.6
patch
Dependencies (24)
+ 16 more |
|
v2.0.5
patch
5 CVEs
CVE-2026-66064
GHSA-964w-f6gj-5236
GO-2026-6134
Jul 28, 2026
goshs has ACL Bypass & Path Traversal
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Summary
Finding (Medium): trailing-slash ACL and hidden-file bypasshttpserver/handler.go, sendFile (lines 789-801) takes the filename from the RAW req.URL.Path while the file itself is opened from the filepath.Clean-ed path. The two disagree, and a trailing slash makes the derived name the empty string. Both protections key on that derived name, so both are defeated: the rule that never serves the .goshs ACL file, and the acl.Block list. Measured, with negative controls:
Unauthenticated when the ACL is configured block-only (common usage). Stated precisely: AUTHENTICATION IS NOT BYPASSED. An unauthenticated request against a directory protected by authentication still returns 401 under the same trick; I tested that. The claim is specifically that the block list and the ACL-file protection are bypassed. In-tree evidence that sendFile is the defect: the sibling handlers doDir and bulkDownload both derive the name correctly; sendFile is the lone outlier. Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback with negative controls, including the 404-versus-200 pair and the authenticated-directory control that shows authentication is not affected. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-66063
GHSA-wg2q-39h6-66x9
GO-2026-6137
Jul 28, 2026
goshs has a Path Traversal issue
6.5
/ 10
Medium
Network
Low
None
None
Unchanged
Low
Low
None
SummaryThe multipart upload filename fix splits on the path separator but never rejects dot-dot, allowing a write outside the served tree. Finding (Medium): upload filename escapes the served tree (residual of CVE-2026-35393)The multipart filename fix (updown.go lines 135-136) splits on the path separator but never rejects "..". Uploading with filename=".." results in os.Create against the parent of the upload folder with a trailing marker character, outside the served tree, and the subsequent failed rename leaves that file behind. Verified: a file containing ESCAPED_WRITE_PROOF was written outside the webroot, unauthenticated, with the default configuration. Not claimed: a Windows-specific variant (Go's Part.FileName() already applies filepath.Base). Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-64863
GHSA-hq33-8jgp-8qq3
GO-2026-6136
Jul 28, 2026
goshs --no-delete WebDAV MOVE bypass allows file deletion/overwrite
9.1
/ 10
Critical
Network
Low
None
None
Unchanged
None
High
High
SummaryThe WebDAV mode-flag guard added to fix GHSA-3whc-qvhv-xqjp still does not enforce This is a residual of the parent fix: the guard classifies Affectedgoshs v2.1.3 (current release, commit Details
The Proof of conceptReproduced live against goshs v2.1.3 on 2026-07-02. Server started with
Control - DELETE is correctly blocked:
secret.txt still exists on disk. Bypass 1 - MOVE removes the source file despite --no-delete:
secret.txt is now deleted from disk (its content is at gone.txt). Bypass 2 - MOVE with Overwrite:T destroys an existing victim file:
ImpactAn operator running Suggested fixMove
Add an integration test covering Fixed in
2.1.4
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-54719
GHSA-rmxw-pq4x-3fvh
GO-2026-6133
Jul 28, 2026
goshs: File-based .goshs ACL authorization bypass via the ?bulk zip-download route (unauthenticated read; residual of GHSA-wvhv-qcqf-f3cx)
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
GHSA-wvhv-qcqf-f3cx fixed the per-folder .goshs ACL bypass on the state-changing routes (PUT/POST upload/?mkdir/?delete) and added recursive ACL resolution, and its description states the read/list path correctly enforces .goshs. That premise does not hold for the ?bulk zip-download route. bulkDownload (httpserver/updown.go) takes one or more ?file= parameters, runs each through sanitizePath(fs.Webroot, file), and streams the contents back as a ZIP without ever calling findEffectiveACL/applyCustomAuth. It is dispatched from earlyBreakParameters (?bulk) before the normal doDir/doFile/sendFile flow that performs the ACL check. An unauthenticated attacker can therefore read any file under the webroot protected solely by a .goshs ACL, bypassing both the folder auth (401 on the normal path) and the per-file block list (404 on the normal path). Same authorization-inconsistency root cause as the original advisory, surviving on a read route the fix did not cover. Proof of concept (live, against the fixed v2.1.0 build which includes fix commit f212c4f4, served with no global -b auth, only a per-folder .goshs): GET /protected/secret.txt -> 401 (ACL enforced on normal path) GET /protected/secret.txt -u admin:admin -> 200 GET /?bulk&file=/protected/secret.txt -> 200, zip contains the protected file contents (BYPASS) GET /?bulk&file=/protected/blocked.txt -> 200, zip contains the block-listed file (block bypass) GET /protected/secret.txt?share -> 403 'Sharing disabled when auth is disabled' (correctly gated, NOT a bypass) Impact: any unauthenticated network attacker can read files an operator protected with the documented per-folder .goshs ACL/basic-auth feature, by requesting them through ?bulk. Confidentiality only (the write/delete equivalents were closed by GHSA-wvhv-qcqf-f3cx). Applies to deployments relying on .goshs as the access boundary (a server-wide -b basic auth, if configured, also gates ?bulk via its middleware). Remediation: enforce the effective .goshs ACL inside bulkDownload for every requested file exactly as sendFile/processDir do (resolve findEffectiveACL(filepath.Dir(absPath)) + applyCustomAuth + honor acl.Block), or route ?bulk through the same authorization gate as the normal read path. Audit ?cbDown and other alternate read routes for the same gap. Credit: anir0y (independent security research). Fixed in
2.1.1
References Updated Aug 18, 2026 · Source: OSV.dev
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev |
v2.0.5
patch
Dependencies (23)
+ 15 more |
|
v2.0.4
patch
5 CVEs
CVE-2026-66064
GHSA-964w-f6gj-5236
GO-2026-6134
Jul 28, 2026
goshs has ACL Bypass & Path Traversal
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Summary
Finding (Medium): trailing-slash ACL and hidden-file bypasshttpserver/handler.go, sendFile (lines 789-801) takes the filename from the RAW req.URL.Path while the file itself is opened from the filepath.Clean-ed path. The two disagree, and a trailing slash makes the derived name the empty string. Both protections key on that derived name, so both are defeated: the rule that never serves the .goshs ACL file, and the acl.Block list. Measured, with negative controls:
Unauthenticated when the ACL is configured block-only (common usage). Stated precisely: AUTHENTICATION IS NOT BYPASSED. An unauthenticated request against a directory protected by authentication still returns 401 under the same trick; I tested that. The claim is specifically that the block list and the ACL-file protection are bypassed. In-tree evidence that sendFile is the defect: the sibling handlers doDir and bulkDownload both derive the name correctly; sendFile is the lone outlier. Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback with negative controls, including the 404-versus-200 pair and the authenticated-directory control that shows authentication is not affected. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-66063
GHSA-wg2q-39h6-66x9
GO-2026-6137
Jul 28, 2026
goshs has a Path Traversal issue
6.5
/ 10
Medium
Network
Low
None
None
Unchanged
Low
Low
None
SummaryThe multipart upload filename fix splits on the path separator but never rejects dot-dot, allowing a write outside the served tree. Finding (Medium): upload filename escapes the served tree (residual of CVE-2026-35393)The multipart filename fix (updown.go lines 135-136) splits on the path separator but never rejects "..". Uploading with filename=".." results in os.Create against the parent of the upload folder with a trailing marker character, outside the served tree, and the subsequent failed rename leaves that file behind. Verified: a file containing ESCAPED_WRITE_PROOF was written outside the webroot, unauthenticated, with the default configuration. Not claimed: a Windows-specific variant (Go's Part.FileName() already applies filepath.Base). Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-64863
GHSA-hq33-8jgp-8qq3
GO-2026-6136
Jul 28, 2026
goshs --no-delete WebDAV MOVE bypass allows file deletion/overwrite
9.1
/ 10
Critical
Network
Low
None
None
Unchanged
None
High
High
SummaryThe WebDAV mode-flag guard added to fix GHSA-3whc-qvhv-xqjp still does not enforce This is a residual of the parent fix: the guard classifies Affectedgoshs v2.1.3 (current release, commit Details
The Proof of conceptReproduced live against goshs v2.1.3 on 2026-07-02. Server started with
Control - DELETE is correctly blocked:
secret.txt still exists on disk. Bypass 1 - MOVE removes the source file despite --no-delete:
secret.txt is now deleted from disk (its content is at gone.txt). Bypass 2 - MOVE with Overwrite:T destroys an existing victim file:
ImpactAn operator running Suggested fixMove
Add an integration test covering Fixed in
2.1.4
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-54719
GHSA-rmxw-pq4x-3fvh
GO-2026-6133
Jul 28, 2026
goshs: File-based .goshs ACL authorization bypass via the ?bulk zip-download route (unauthenticated read; residual of GHSA-wvhv-qcqf-f3cx)
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
GHSA-wvhv-qcqf-f3cx fixed the per-folder .goshs ACL bypass on the state-changing routes (PUT/POST upload/?mkdir/?delete) and added recursive ACL resolution, and its description states the read/list path correctly enforces .goshs. That premise does not hold for the ?bulk zip-download route. bulkDownload (httpserver/updown.go) takes one or more ?file= parameters, runs each through sanitizePath(fs.Webroot, file), and streams the contents back as a ZIP without ever calling findEffectiveACL/applyCustomAuth. It is dispatched from earlyBreakParameters (?bulk) before the normal doDir/doFile/sendFile flow that performs the ACL check. An unauthenticated attacker can therefore read any file under the webroot protected solely by a .goshs ACL, bypassing both the folder auth (401 on the normal path) and the per-file block list (404 on the normal path). Same authorization-inconsistency root cause as the original advisory, surviving on a read route the fix did not cover. Proof of concept (live, against the fixed v2.1.0 build which includes fix commit f212c4f4, served with no global -b auth, only a per-folder .goshs): GET /protected/secret.txt -> 401 (ACL enforced on normal path) GET /protected/secret.txt -u admin:admin -> 200 GET /?bulk&file=/protected/secret.txt -> 200, zip contains the protected file contents (BYPASS) GET /?bulk&file=/protected/blocked.txt -> 200, zip contains the block-listed file (block bypass) GET /protected/secret.txt?share -> 403 'Sharing disabled when auth is disabled' (correctly gated, NOT a bypass) Impact: any unauthenticated network attacker can read files an operator protected with the documented per-folder .goshs ACL/basic-auth feature, by requesting them through ?bulk. Confidentiality only (the write/delete equivalents were closed by GHSA-wvhv-qcqf-f3cx). Applies to deployments relying on .goshs as the access boundary (a server-wide -b basic auth, if configured, also gates ?bulk via its middleware). Remediation: enforce the effective .goshs ACL inside bulkDownload for every requested file exactly as sendFile/processDir do (resolve findEffectiveACL(filepath.Dir(absPath)) + applyCustomAuth + honor acl.Block), or route ?bulk through the same authorization gate as the normal read path. Audit ?cbDown and other alternate read routes for the same gap. Credit: anir0y (independent security research). Fixed in
2.1.1
References Updated Aug 18, 2026 · Source: OSV.dev
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev |
v2.0.4
patch
Dependencies (23)
+ 15 more |
|
v2.0.3
patch
5 CVEs
CVE-2026-66064
GHSA-964w-f6gj-5236
GO-2026-6134
Jul 28, 2026
goshs has ACL Bypass & Path Traversal
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Summary
Finding (Medium): trailing-slash ACL and hidden-file bypasshttpserver/handler.go, sendFile (lines 789-801) takes the filename from the RAW req.URL.Path while the file itself is opened from the filepath.Clean-ed path. The two disagree, and a trailing slash makes the derived name the empty string. Both protections key on that derived name, so both are defeated: the rule that never serves the .goshs ACL file, and the acl.Block list. Measured, with negative controls:
Unauthenticated when the ACL is configured block-only (common usage). Stated precisely: AUTHENTICATION IS NOT BYPASSED. An unauthenticated request against a directory protected by authentication still returns 401 under the same trick; I tested that. The claim is specifically that the block list and the ACL-file protection are bypassed. In-tree evidence that sendFile is the defect: the sibling handlers doDir and bulkDownload both derive the name correctly; sendFile is the lone outlier. Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback with negative controls, including the 404-versus-200 pair and the authenticated-directory control that shows authentication is not affected. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-66063
GHSA-wg2q-39h6-66x9
GO-2026-6137
Jul 28, 2026
goshs has a Path Traversal issue
6.5
/ 10
Medium
Network
Low
None
None
Unchanged
Low
Low
None
SummaryThe multipart upload filename fix splits on the path separator but never rejects dot-dot, allowing a write outside the served tree. Finding (Medium): upload filename escapes the served tree (residual of CVE-2026-35393)The multipart filename fix (updown.go lines 135-136) splits on the path separator but never rejects "..". Uploading with filename=".." results in os.Create against the parent of the upload folder with a trailing marker character, outside the served tree, and the subsequent failed rename leaves that file behind. Verified: a file containing ESCAPED_WRITE_PROOF was written outside the webroot, unauthenticated, with the default configuration. Not claimed: a Windows-specific variant (Go's Part.FileName() already applies filepath.Base). Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-64863
GHSA-hq33-8jgp-8qq3
GO-2026-6136
Jul 28, 2026
goshs --no-delete WebDAV MOVE bypass allows file deletion/overwrite
9.1
/ 10
Critical
Network
Low
None
None
Unchanged
None
High
High
SummaryThe WebDAV mode-flag guard added to fix GHSA-3whc-qvhv-xqjp still does not enforce This is a residual of the parent fix: the guard classifies Affectedgoshs v2.1.3 (current release, commit Details
The Proof of conceptReproduced live against goshs v2.1.3 on 2026-07-02. Server started with
Control - DELETE is correctly blocked:
secret.txt still exists on disk. Bypass 1 - MOVE removes the source file despite --no-delete:
secret.txt is now deleted from disk (its content is at gone.txt). Bypass 2 - MOVE with Overwrite:T destroys an existing victim file:
ImpactAn operator running Suggested fixMove
Add an integration test covering Fixed in
2.1.4
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-54719
GHSA-rmxw-pq4x-3fvh
GO-2026-6133
Jul 28, 2026
goshs: File-based .goshs ACL authorization bypass via the ?bulk zip-download route (unauthenticated read; residual of GHSA-wvhv-qcqf-f3cx)
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
GHSA-wvhv-qcqf-f3cx fixed the per-folder .goshs ACL bypass on the state-changing routes (PUT/POST upload/?mkdir/?delete) and added recursive ACL resolution, and its description states the read/list path correctly enforces .goshs. That premise does not hold for the ?bulk zip-download route. bulkDownload (httpserver/updown.go) takes one or more ?file= parameters, runs each through sanitizePath(fs.Webroot, file), and streams the contents back as a ZIP without ever calling findEffectiveACL/applyCustomAuth. It is dispatched from earlyBreakParameters (?bulk) before the normal doDir/doFile/sendFile flow that performs the ACL check. An unauthenticated attacker can therefore read any file under the webroot protected solely by a .goshs ACL, bypassing both the folder auth (401 on the normal path) and the per-file block list (404 on the normal path). Same authorization-inconsistency root cause as the original advisory, surviving on a read route the fix did not cover. Proof of concept (live, against the fixed v2.1.0 build which includes fix commit f212c4f4, served with no global -b auth, only a per-folder .goshs): GET /protected/secret.txt -> 401 (ACL enforced on normal path) GET /protected/secret.txt -u admin:admin -> 200 GET /?bulk&file=/protected/secret.txt -> 200, zip contains the protected file contents (BYPASS) GET /?bulk&file=/protected/blocked.txt -> 200, zip contains the block-listed file (block bypass) GET /protected/secret.txt?share -> 403 'Sharing disabled when auth is disabled' (correctly gated, NOT a bypass) Impact: any unauthenticated network attacker can read files an operator protected with the documented per-folder .goshs ACL/basic-auth feature, by requesting them through ?bulk. Confidentiality only (the write/delete equivalents were closed by GHSA-wvhv-qcqf-f3cx). Applies to deployments relying on .goshs as the access boundary (a server-wide -b basic auth, if configured, also gates ?bulk via its middleware). Remediation: enforce the effective .goshs ACL inside bulkDownload for every requested file exactly as sendFile/processDir do (resolve findEffectiveACL(filepath.Dir(absPath)) + applyCustomAuth + honor acl.Block), or route ?bulk through the same authorization gate as the normal read path. Audit ?cbDown and other alternate read routes for the same gap. Credit: anir0y (independent security research). Fixed in
2.1.1
References Updated Aug 18, 2026 · Source: OSV.dev
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev |
v2.0.3
patch
Dependencies (23)
+ 15 more |
|
v2.0.2
patch
5 CVEs
CVE-2026-66064
GHSA-964w-f6gj-5236
GO-2026-6134
Jul 28, 2026
goshs has ACL Bypass & Path Traversal
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Summary
Finding (Medium): trailing-slash ACL and hidden-file bypasshttpserver/handler.go, sendFile (lines 789-801) takes the filename from the RAW req.URL.Path while the file itself is opened from the filepath.Clean-ed path. The two disagree, and a trailing slash makes the derived name the empty string. Both protections key on that derived name, so both are defeated: the rule that never serves the .goshs ACL file, and the acl.Block list. Measured, with negative controls:
Unauthenticated when the ACL is configured block-only (common usage). Stated precisely: AUTHENTICATION IS NOT BYPASSED. An unauthenticated request against a directory protected by authentication still returns 401 under the same trick; I tested that. The claim is specifically that the block list and the ACL-file protection are bypassed. In-tree evidence that sendFile is the defect: the sibling handlers doDir and bulkDownload both derive the name correctly; sendFile is the lone outlier. Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback with negative controls, including the 404-versus-200 pair and the authenticated-directory control that shows authentication is not affected. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-66063
GHSA-wg2q-39h6-66x9
GO-2026-6137
Jul 28, 2026
goshs has a Path Traversal issue
6.5
/ 10
Medium
Network
Low
None
None
Unchanged
Low
Low
None
SummaryThe multipart upload filename fix splits on the path separator but never rejects dot-dot, allowing a write outside the served tree. Finding (Medium): upload filename escapes the served tree (residual of CVE-2026-35393)The multipart filename fix (updown.go lines 135-136) splits on the path separator but never rejects "..". Uploading with filename=".." results in os.Create against the parent of the upload folder with a trailing marker character, outside the served tree, and the subsequent failed rename leaves that file behind. Verified: a file containing ESCAPED_WRITE_PROOF was written outside the webroot, unauthenticated, with the default configuration. Not claimed: a Windows-specific variant (Go's Part.FileName() already applies filepath.Base). Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-64863
GHSA-hq33-8jgp-8qq3
GO-2026-6136
Jul 28, 2026
goshs --no-delete WebDAV MOVE bypass allows file deletion/overwrite
9.1
/ 10
Critical
Network
Low
None
None
Unchanged
None
High
High
SummaryThe WebDAV mode-flag guard added to fix GHSA-3whc-qvhv-xqjp still does not enforce This is a residual of the parent fix: the guard classifies Affectedgoshs v2.1.3 (current release, commit Details
The Proof of conceptReproduced live against goshs v2.1.3 on 2026-07-02. Server started with
Control - DELETE is correctly blocked:
secret.txt still exists on disk. Bypass 1 - MOVE removes the source file despite --no-delete:
secret.txt is now deleted from disk (its content is at gone.txt). Bypass 2 - MOVE with Overwrite:T destroys an existing victim file:
ImpactAn operator running Suggested fixMove
Add an integration test covering Fixed in
2.1.4
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-54719
GHSA-rmxw-pq4x-3fvh
GO-2026-6133
Jul 28, 2026
goshs: File-based .goshs ACL authorization bypass via the ?bulk zip-download route (unauthenticated read; residual of GHSA-wvhv-qcqf-f3cx)
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
GHSA-wvhv-qcqf-f3cx fixed the per-folder .goshs ACL bypass on the state-changing routes (PUT/POST upload/?mkdir/?delete) and added recursive ACL resolution, and its description states the read/list path correctly enforces .goshs. That premise does not hold for the ?bulk zip-download route. bulkDownload (httpserver/updown.go) takes one or more ?file= parameters, runs each through sanitizePath(fs.Webroot, file), and streams the contents back as a ZIP without ever calling findEffectiveACL/applyCustomAuth. It is dispatched from earlyBreakParameters (?bulk) before the normal doDir/doFile/sendFile flow that performs the ACL check. An unauthenticated attacker can therefore read any file under the webroot protected solely by a .goshs ACL, bypassing both the folder auth (401 on the normal path) and the per-file block list (404 on the normal path). Same authorization-inconsistency root cause as the original advisory, surviving on a read route the fix did not cover. Proof of concept (live, against the fixed v2.1.0 build which includes fix commit f212c4f4, served with no global -b auth, only a per-folder .goshs): GET /protected/secret.txt -> 401 (ACL enforced on normal path) GET /protected/secret.txt -u admin:admin -> 200 GET /?bulk&file=/protected/secret.txt -> 200, zip contains the protected file contents (BYPASS) GET /?bulk&file=/protected/blocked.txt -> 200, zip contains the block-listed file (block bypass) GET /protected/secret.txt?share -> 403 'Sharing disabled when auth is disabled' (correctly gated, NOT a bypass) Impact: any unauthenticated network attacker can read files an operator protected with the documented per-folder .goshs ACL/basic-auth feature, by requesting them through ?bulk. Confidentiality only (the write/delete equivalents were closed by GHSA-wvhv-qcqf-f3cx). Applies to deployments relying on .goshs as the access boundary (a server-wide -b basic auth, if configured, also gates ?bulk via its middleware). Remediation: enforce the effective .goshs ACL inside bulkDownload for every requested file exactly as sendFile/processDir do (resolve findEffectiveACL(filepath.Dir(absPath)) + applyCustomAuth + honor acl.Block), or route ?bulk through the same authorization gate as the normal read path. Audit ?cbDown and other alternate read routes for the same gap. Credit: anir0y (independent security research). Fixed in
2.1.1
References Updated Aug 18, 2026 · Source: OSV.dev
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev |
v2.0.2
patch
Dependencies (23)
+ 15 more |
|
v2.0.1
patch
6 CVEs
CVE-2026-66064
GHSA-964w-f6gj-5236
GO-2026-6134
Jul 28, 2026
goshs has ACL Bypass & Path Traversal
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Summary
Finding (Medium): trailing-slash ACL and hidden-file bypasshttpserver/handler.go, sendFile (lines 789-801) takes the filename from the RAW req.URL.Path while the file itself is opened from the filepath.Clean-ed path. The two disagree, and a trailing slash makes the derived name the empty string. Both protections key on that derived name, so both are defeated: the rule that never serves the .goshs ACL file, and the acl.Block list. Measured, with negative controls:
Unauthenticated when the ACL is configured block-only (common usage). Stated precisely: AUTHENTICATION IS NOT BYPASSED. An unauthenticated request against a directory protected by authentication still returns 401 under the same trick; I tested that. The claim is specifically that the block list and the ACL-file protection are bypassed. In-tree evidence that sendFile is the defect: the sibling handlers doDir and bulkDownload both derive the name correctly; sendFile is the lone outlier. Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback with negative controls, including the 404-versus-200 pair and the authenticated-directory control that shows authentication is not affected. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-66063
GHSA-wg2q-39h6-66x9
GO-2026-6137
Jul 28, 2026
goshs has a Path Traversal issue
6.5
/ 10
Medium
Network
Low
None
None
Unchanged
Low
Low
None
SummaryThe multipart upload filename fix splits on the path separator but never rejects dot-dot, allowing a write outside the served tree. Finding (Medium): upload filename escapes the served tree (residual of CVE-2026-35393)The multipart filename fix (updown.go lines 135-136) splits on the path separator but never rejects "..". Uploading with filename=".." results in os.Create against the parent of the upload folder with a trailing marker character, outside the served tree, and the subsequent failed rename leaves that file behind. Verified: a file containing ESCAPED_WRITE_PROOF was written outside the webroot, unauthenticated, with the default configuration. Not claimed: a Windows-specific variant (Go's Part.FileName() already applies filepath.Base). Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-64863
GHSA-hq33-8jgp-8qq3
GO-2026-6136
Jul 28, 2026
goshs --no-delete WebDAV MOVE bypass allows file deletion/overwrite
9.1
/ 10
Critical
Network
Low
None
None
Unchanged
None
High
High
SummaryThe WebDAV mode-flag guard added to fix GHSA-3whc-qvhv-xqjp still does not enforce This is a residual of the parent fix: the guard classifies Affectedgoshs v2.1.3 (current release, commit Details
The Proof of conceptReproduced live against goshs v2.1.3 on 2026-07-02. Server started with
Control - DELETE is correctly blocked:
secret.txt still exists on disk. Bypass 1 - MOVE removes the source file despite --no-delete:
secret.txt is now deleted from disk (its content is at gone.txt). Bypass 2 - MOVE with Overwrite:T destroys an existing victim file:
ImpactAn operator running Suggested fixMove
Add an integration test covering Fixed in
2.1.4
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-54719
GHSA-rmxw-pq4x-3fvh
GO-2026-6133
Jul 28, 2026
goshs: File-based .goshs ACL authorization bypass via the ?bulk zip-download route (unauthenticated read; residual of GHSA-wvhv-qcqf-f3cx)
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
GHSA-wvhv-qcqf-f3cx fixed the per-folder .goshs ACL bypass on the state-changing routes (PUT/POST upload/?mkdir/?delete) and added recursive ACL resolution, and its description states the read/list path correctly enforces .goshs. That premise does not hold for the ?bulk zip-download route. bulkDownload (httpserver/updown.go) takes one or more ?file= parameters, runs each through sanitizePath(fs.Webroot, file), and streams the contents back as a ZIP without ever calling findEffectiveACL/applyCustomAuth. It is dispatched from earlyBreakParameters (?bulk) before the normal doDir/doFile/sendFile flow that performs the ACL check. An unauthenticated attacker can therefore read any file under the webroot protected solely by a .goshs ACL, bypassing both the folder auth (401 on the normal path) and the per-file block list (404 on the normal path). Same authorization-inconsistency root cause as the original advisory, surviving on a read route the fix did not cover. Proof of concept (live, against the fixed v2.1.0 build which includes fix commit f212c4f4, served with no global -b auth, only a per-folder .goshs): GET /protected/secret.txt -> 401 (ACL enforced on normal path) GET /protected/secret.txt -u admin:admin -> 200 GET /?bulk&file=/protected/secret.txt -> 200, zip contains the protected file contents (BYPASS) GET /?bulk&file=/protected/blocked.txt -> 200, zip contains the block-listed file (block bypass) GET /protected/secret.txt?share -> 403 'Sharing disabled when auth is disabled' (correctly gated, NOT a bypass) Impact: any unauthenticated network attacker can read files an operator protected with the documented per-folder .goshs ACL/basic-auth feature, by requesting them through ?bulk. Confidentiality only (the write/delete equivalents were closed by GHSA-wvhv-qcqf-f3cx). Applies to deployments relying on .goshs as the access boundary (a server-wide -b basic auth, if configured, also gates ?bulk via its middleware). Remediation: enforce the effective .goshs ACL inside bulkDownload for every requested file exactly as sendFile/processDir do (resolve findEffectiveACL(filepath.Dir(absPath)) + applyCustomAuth + honor acl.Block), or route ?bulk through the same authorization gate as the normal read path. Audit ?cbDown and other alternate read routes for the same gap. Credit: anir0y (independent security research). Fixed in
2.1.1
References Updated Aug 18, 2026 · Source: OSV.dev
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev
CVE-2026-42091
GHSA-rhf7-wvw3-vjvm
GO-2026-5625
Apr 23, 2026
goshs has Cross-Origin Arbitrary File Write via Missing CSRF on PUT and Wildcard CORS
6.5
/ 10
Medium
Network
Low
None
Required
Unchanged
None
High
None
SummaryThe PUT upload handler ( DetailsRoot Cause 1 — Missing CSRF on PUT ( When GHSA-jrq5-hg6x-j6g3 was fixed (commit
Root Cause 2 — Wildcard CORS ( The OPTIONS handler unconditionally returns permissive CORS headers:
This allows any website's JavaScript to pass the browser's CORS preflight check and send PUT requests to the goshs server. PoCPlease extract the uploaded compressed file before proceeding
Impact
Fixed in
2.0.2
References
Updated Jun 25, 2026 · Source: OSV.dev |
v2.0.1
patch
Dependencies (22)
+ 14 more |
|
v2.0.0
initial
6 CVEs
CVE-2026-66064
GHSA-964w-f6gj-5236
GO-2026-6134
Jul 28, 2026
goshs has ACL Bypass & Path Traversal
5.3
/ 10
Medium
Network
Low
None
None
Unchanged
Low
None
None
Summary
Finding (Medium): trailing-slash ACL and hidden-file bypasshttpserver/handler.go, sendFile (lines 789-801) takes the filename from the RAW req.URL.Path while the file itself is opened from the filepath.Clean-ed path. The two disagree, and a trailing slash makes the derived name the empty string. Both protections key on that derived name, so both are defeated: the rule that never serves the .goshs ACL file, and the acl.Block list. Measured, with negative controls:
Unauthenticated when the ACL is configured block-only (common usage). Stated precisely: AUTHENTICATION IS NOT BYPASSED. An unauthenticated request against a directory protected by authentication still returns 401 under the same trick; I tested that. The claim is specifically that the block list and the ACL-file protection are bypassed. In-tree evidence that sendFile is the defect: the sibling handlers doDir and bulkDownload both derive the name correctly; sendFile is the lone outlier. Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback with negative controls, including the 404-versus-200 pair and the authenticated-directory control that shows authentication is not affected. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-66063
GHSA-wg2q-39h6-66x9
GO-2026-6137
Jul 28, 2026
goshs has a Path Traversal issue
6.5
/ 10
Medium
Network
Low
None
None
Unchanged
Low
Low
None
SummaryThe multipart upload filename fix splits on the path separator but never rejects dot-dot, allowing a write outside the served tree. Finding (Medium): upload filename escapes the served tree (residual of CVE-2026-35393)The multipart filename fix (updown.go lines 135-136) splits on the path separator but never rejects "..". Uploading with filename=".." results in os.Create against the parent of the upload folder with a trailing marker character, outside the served tree, and the subsequent failed rename leaves that file behind. Verified: a file containing ESCAPED_WRITE_PROOF was written outside the webroot, unauthenticated, with the default configuration. Not claimed: a Windows-specific variant (Go's Part.FileName() already applies filepath.Base). Suggested fixes
ToolingAI assistance was used while investigating. The finding was reproduced against a running server on loopback. Fixed in
2.1.5-0.20260727065949-f3ef599e4091
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-64863
GHSA-hq33-8jgp-8qq3
GO-2026-6136
Jul 28, 2026
goshs --no-delete WebDAV MOVE bypass allows file deletion/overwrite
9.1
/ 10
Critical
Network
Low
None
None
Unchanged
None
High
High
SummaryThe WebDAV mode-flag guard added to fix GHSA-3whc-qvhv-xqjp still does not enforce This is a residual of the parent fix: the guard classifies Affectedgoshs v2.1.3 (current release, commit Details
The Proof of conceptReproduced live against goshs v2.1.3 on 2026-07-02. Server started with
Control - DELETE is correctly blocked:
secret.txt still exists on disk. Bypass 1 - MOVE removes the source file despite --no-delete:
secret.txt is now deleted from disk (its content is at gone.txt). Bypass 2 - MOVE with Overwrite:T destroys an existing victim file:
ImpactAn operator running Suggested fixMove
Add an integration test covering Fixed in
2.1.4
References Updated Aug 18, 2026 · Source: OSV.dev
CVE-2026-54719
GHSA-rmxw-pq4x-3fvh
GO-2026-6133
Jul 28, 2026
goshs: File-based .goshs ACL authorization bypass via the ?bulk zip-download route (unauthenticated read; residual of GHSA-wvhv-qcqf-f3cx)
7.5
/ 10
High
Network
Low
None
None
Unchanged
High
None
None
GHSA-wvhv-qcqf-f3cx fixed the per-folder .goshs ACL bypass on the state-changing routes (PUT/POST upload/?mkdir/?delete) and added recursive ACL resolution, and its description states the read/list path correctly enforces .goshs. That premise does not hold for the ?bulk zip-download route. bulkDownload (httpserver/updown.go) takes one or more ?file= parameters, runs each through sanitizePath(fs.Webroot, file), and streams the contents back as a ZIP without ever calling findEffectiveACL/applyCustomAuth. It is dispatched from earlyBreakParameters (?bulk) before the normal doDir/doFile/sendFile flow that performs the ACL check. An unauthenticated attacker can therefore read any file under the webroot protected solely by a .goshs ACL, bypassing both the folder auth (401 on the normal path) and the per-file block list (404 on the normal path). Same authorization-inconsistency root cause as the original advisory, surviving on a read route the fix did not cover. Proof of concept (live, against the fixed v2.1.0 build which includes fix commit f212c4f4, served with no global -b auth, only a per-folder .goshs): GET /protected/secret.txt -> 401 (ACL enforced on normal path) GET /protected/secret.txt -u admin:admin -> 200 GET /?bulk&file=/protected/secret.txt -> 200, zip contains the protected file contents (BYPASS) GET /?bulk&file=/protected/blocked.txt -> 200, zip contains the block-listed file (block bypass) GET /protected/secret.txt?share -> 403 'Sharing disabled when auth is disabled' (correctly gated, NOT a bypass) Impact: any unauthenticated network attacker can read files an operator protected with the documented per-folder .goshs ACL/basic-auth feature, by requesting them through ?bulk. Confidentiality only (the write/delete equivalents were closed by GHSA-wvhv-qcqf-f3cx). Applies to deployments relying on .goshs as the access boundary (a server-wide -b basic auth, if configured, also gates ?bulk via its middleware). Remediation: enforce the effective .goshs ACL inside bulkDownload for every requested file exactly as sendFile/processDir do (resolve findEffectiveACL(filepath.Dir(absPath)) + applyCustomAuth + honor acl.Block), or route ?bulk through the same authorization gate as the normal read path. Audit ?cbDown and other alternate read routes for the same gap. Credit: anir0y (independent security research). Fixed in
2.1.1
References Updated Aug 18, 2026 · Source: OSV.dev
GO-2026-5232
GHSA-7qx6-f23w-3w7f
Jun 25, 2026
Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs `/?redirect` endpoint in github.com/patrickhener/goshs Unauthenticated Open Redirect, Arbitrary HTTP Response Header Injection, Missing CSRF, and Invisible-Mode Bypass in goshs Updated Jun 25, 2026 · Source: OSV.dev
CVE-2026-42091
GHSA-rhf7-wvw3-vjvm
GO-2026-5625
Apr 23, 2026
goshs has Cross-Origin Arbitrary File Write via Missing CSRF on PUT and Wildcard CORS
6.5
/ 10
Medium
Network
Low
None
Required
Unchanged
None
High
None
SummaryThe PUT upload handler ( DetailsRoot Cause 1 — Missing CSRF on PUT ( When GHSA-jrq5-hg6x-j6g3 was fixed (commit
Root Cause 2 — Wildcard CORS ( The OPTIONS handler unconditionally returns permissive CORS headers:
This allows any website's JavaScript to pass the browser's CORS preflight check and send PUT requests to the goshs server. PoCPlease extract the uploaded compressed file before proceeding
Impact
Fixed in
2.0.2
References
Updated Jun 25, 2026 · Source: OSV.dev |
v2.0.0
initial
Dependencies (22)
+ 14 more |