v1.0.0-rc.2
Pre-releasesockguard is a default-deny Docker socket proxy written in Go. It filters every request by HTTP method, path, and request body — so a compromised API consumer can't escalate through the socket.
sockguard v1.0.0-rc.2 — release candidate 2
⚠️ Pre-release. This is the candidate that froze the v1.0 proxy contract on 2026-05-16. For production use the stablev1.0.0.
⚠️ Breaking change
A non-loopback plaintext TCP listener now requires two insecure acknowledgments instead of one: listen.insecure_allow_plain_tcp (unencrypted transport) and the new listen.insecure_allow_unauthenticated_clients (any host that can reach the port can impersonate a client). One flag without the other is rejected at config validation, so the dangerous mode can't be reached by a single fat-fingered flag. The same applies to admin.listen.*. Existing plaintext non-loopback TCP configs must add insecure_allow_unauthenticated_clients: true (env: SOCKGUARD_LISTEN_INSECURE_ALLOW_UNAUTHENTICATED_CLIENTS).
🔄 Changed
request_body.exec.allowed_commandsentries are now glob-matched argv templates instead of exact strings. Each token follows the same dialect as path rules (*matches a run of non-slash characters,**matches any sequence), so an operator can allowlist an exec whose argv carries a variable run ID, timestamp, or generated path — e.g.["drydock", "finalize", "*"]— without enumerating every literal form. Tokens with no glob metacharacters keep matching exactly as before.- A rule whose
match.pathcontains a literal%is now a config-validation error instead of a startup warning — sockguard percent-decodes paths before matching, so such a pattern can never fire, and a silently dead rule is a security-intent gap.
🐛 Fixed
- Oversized request bodies on the exec, plugin, and swarm inspectors now return
413 Request Entity Too Largeinstead of403. All body inspectors now share one size-rejection contract.
🔒 Security
Hardening from the 2026-05-16 branch review:
- The visibility pattern-filter response buffer (
GET /containers/json,/images/jsonwithresponse.name_patterns/image_patterns) is now capped at 8 MiB — a larger upstream response is rejected with502instead of being buffered unbounded, closing an out-of-memory DoS. - The visibility middleware now honors rollout mode — an invisible single-resource inspect under
mode: warn/auditis forwarded with awould_denyverdict instead of a hard404, so operators can measure visibility-policy impact before enforcing. - The reverse-proxy and side-channel transports now set
ResponseHeaderTimeout: 30s— a Docker daemon that accepts a connection but never sends headers can no longer pin a goroutine indefinitely.
📥 Install
docker pull ghcr.io/codeswhat/sockguard:1.0.0-rc.2📦 ghcr.io/codeswhat/sockguard:1.0.0-rc.2 · 📖 Documentation · 🔎 Full diff
