WS-D10 Pin resolved IP for webhook dispatch to close the DNS-rebind TOCTOU #306

Closed
opened 2026-07-31 18:14:39 +00:00 by KofTwentyTwo · 1 comment
KofTwentyTwo commented 2026-07-31 18:14:39 +00:00 (Migrated from github.com)

Documented residual from #203. Size S.

Roadmap-to-9/10 (design: scratchpad/design/). Serial PROTO queue via WS-A. Brief at dispatch. DoD per docs/STORY-WORKFLOW.md.

Documented residual from #203. Size S. Roadmap-to-9/10 (design: scratchpad/design/). Serial PROTO queue via WS-A. Brief at dispatch. DoD per docs/STORY-WORKFLOW.md.
KofTwentyTwo commented 2026-07-31 19:15:54 +00:00 (Migrated from github.com)

Delivered via PR #343 (WS-D10, squash-merged to dev). Webhook dispatch resolves the host once, checks every candidate IP (is_blocked_webhook_target, #203), then pins the connection to the checked IP via reqwest .resolve(host,addr) (SNI/Host preserved) so reqwest cannot re-resolve — closes the DNS-rebind TOCTOU by construction. Unresolvable-.invalid + wiremock-loopback test proves the checked IP is used. Residual single-DNS-answer trust documented out-of-scope. (Note: the PR body references #307 due to a PO mis-numbering at dispatch; the real issue is this #306.)

Delivered via PR #343 (WS-D10, squash-merged to dev). Webhook dispatch resolves the host once, checks every candidate IP (is_blocked_webhook_target, #203), then pins the connection to the checked IP via reqwest .resolve(host,addr) (SNI/Host preserved) so reqwest cannot re-resolve — closes the DNS-rebind TOCTOU by construction. Unresolvable-.invalid + wiremock-loopback test proves the checked IP is used. Residual single-DNS-answer trust documented out-of-scope. (Note: the PR body references #307 due to a PO mis-numbering at dispatch; the real issue is this #306.)
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: KofTwentyTwo/nuncio#306