WS-02: bind daemon downloads to validated IPs#23
Merged
glittercowboy merged 1 commit intomainfrom Apr 14, 2026
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
TL;DR
This closes the daemon-side DNS rebinding SSRF gap from WS-02.
Download validation now resolves and approves addresses once, then the actual HTTP client dials only those validated IPs with proxies disabled and redirects still disabled.
Why it matters
A preflight DNS check can be bypassed if the hostname rebinds before the real fetch. Binding the actual socket dial to the validated IP closes that gap for user-supplied image URLs.
How it works now
DialContextfor the actual requestVerification
go test ./internal/claude/...go test ./...Post-merge verification
3a801c6f92dd1ef20b0794c11780c70752fc1f9edaemon/v0.2.15release-daemon.ymlsucceeded ondaemon/v0.2.15: run24399686676https://github.com/gsd-build/daemon/releases/tag/daemon/v0.2.15Observability gate
health.check_allwas rerun after the release, but it did not produce a passing health result because the MCP is misconfigured in this environmentVERCEL_TOKEN,FLY_API_TOKEN,SUPABASE_ACCESS_TOKEN,SENTRY_AUTH_TOKEN,STRIPE_*, andRESEND_API_KEY