fix(security): block Azure platform callback target - #147
fix(security): block Azure platform callback target#147jason-allen-oneal wants to merge 1 commit into
Conversation
|
Codex review: needs maintainer review before merge. Reviewed August 3, 2026, 3:22 PM ET / 19:22 UTC. ClawSweeper reviewWhat this changesThe PR blocks Merge readinessThis PR remains necessary: current Priority: P1 Review scores
Verification
How this fits togetherClickClack sends signed HTTP callbacks for slash commands and event subscriptions using a shared outbound client. That client parses or resolves a configured callback target, checks it against the public-destination policy, and only then opens a connection. flowchart LR
A[Registered callback URL] --> B[Shared callback client]
B --> C[Literal parser or DNS lookup]
C --> D[Public destination policy]
D -->|allowed| E[Outbound HTTP connection]
D -->|blocked| F[Callback delivery error]
E --> G[Slash or event endpoint]
Decision needed
Why: The patch is technically narrow and has direct runtime proof, but maintainers must decide whether this provider-specific public-looking address belongs inside the permanent callback security boundary despite the compatibility impact. Before merge
Agent review detailsSecurityNone. Review metrics
Merge-risk optionsMaintainer options:
Technical reviewBest possible solution: Adopt the Azure platform VIP as a prohibited callback destination, keep the focused pre-dial and two-workflow regressions, and record the intended fail-closed upgrade behavior in the PR discussion rather than adding a weaker fallback. Do we have a high-confidence way to reproduce the issue? Yes, with high confidence from source: current Is this the best way to solve the issue? Yes technically: a single shared deny-list entry preserves identical behavior across both callback producers and the added tests verify rejection before dialing. Maintainer intent is still needed for the compatibility boundary, not for the implementation mechanics. AGENTS.md: found, but no applicable review policy affected this item. Codex review notes: model internal, reasoning high; reviewed against 601224ddee75. LabelsLabel justifications:
EvidenceWhat I checked:
Likely related people:
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
HistoryReview history (3 earlier review cycles) |
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
What Problem This Solves
Follow-up to #145. The callback address classifier still treated
168.63.129.16as a public destination. Azure reserves that public-lookingvirtual IP for platform services inside every virtual network, so callbacks
must not be allowed to reach it from the ClickClack host.
What Changed
168.63.129.16/32in the shared callback egress policy.fail closed for the platform VIP.
Verification
go test ./... -count=1go vet ./...pnpm fmt:go:checkReal behavior proof
Behavior addressed: A registered slash-command or event-subscription
callback must reject Azure's
168.63.129.16platform VIP before opening anoutbound connection.
Real environment tested: PR HEAD
b3f58ec245128b7056d55e0d3b8c2fe5052612b3, built with Go 1.26.5 and run asthe real ClickClack API with SQLite and development bootstrap enabled. The API
ran at
168.63.129.17and a Python HTTP sentinel ran at168.63.129.16on anisolated Docker bridge.
Exact steps run after this patch:
The registration and invocation requests used ClickClack's real HTTP API. All
one-time signing secrets and bot credentials were excluded from the captured
output.
Evidence after fix:
Observed result after fix: The control request proves that
168.63.129.16:80was reachable from the real ClickClack runtime. The slashworkflow returned the pre-dial policy error, the event workflow persisted the
same policy error with no HTTP response status, and the accept-level sentinel
recorded exactly the explicit control connection with no connection from
either callback. The focused pre-dial regression also passed with a dial
function that fails the test if called. Together, the real runtime and no-dial
evidence show both workflows reject the VIP before opening a callback
connection.
What was not tested: This disposable proof did not run inside an Azure VNet
or contact Azure platform services. It exercised the exact literal platform
VIP through both real callback workflows. Hostname resolution and TLS callback
behavior were not part of this
/32policy change.