chore(gvproxy): bump pinned base to 629a4a42 (upstream main) - #163
Conversation
Advances the gvproxy fork pin from 0fd10515 (2026-07-13) to 629a4a42 (2026-07-29), the head of containers/gvisor-tap-vsock main. Closes the drift finding from the daily freshness check (#159). Eight commits, of which six are OWNERS/approver churn, a lint comment and merges. The two that change shipped code: - 52d1ec12 "sockets: set gvproxy-created unix sockets to 0600" (PR #683). Post-bind `os.Chmod(path, 0600)` on every unix-family listener in pkg/transport, failing closed if the chmod fails. augur's only gvproxy socket -- `--listen-vfkit unixgram://.../<slug>-<hash>.vfkit.sock` -- is one of them, so its mode goes srwxr-xr-x -> srw-------. Defense in depth rather than a closed hole: on Darwin an AF_UNIX connect is gated by the write bit, and the pre-change mode under the default umask 022 was 0755, which already denied other users. It matters under a loose umask (002 gave the group write, 000 gave everyone write). - c5f19126 "Remove dependency on apparentlymart/go-cidr" (PR #661). Drops a third-party module from the shipped vendor tree; pkg/tap/ip_pool.go now walks the subnet with net/netip. The address set it hands out is unchanged, and Reserve() gained an error return that virtualnetwork.New() propagates, so an unparseable gateway IP now aborts startup instead of silently inserting a `<nil>` lease -- a fail-closed improvement. augur-egress.patch is NOT touched: none of the eight commits modify any of the eleven files it patches (`git diff 0fd10515 629a4a42 --` over those paths is empty), so there is nothing to rebase. The egress-enforcing surface -- pkg/virtualnetwork/services.go, pkg/services/forwarder/, pkg/services/dns/, pkg/tap/switch.go, pkg/types/, cmd/ -- is byte-identical between the two pins, so I4/I5/I9 are untouched by construction. Verified here (Apple Silicon, Go 1.26.5, against the exact new SHA): - `git apply --check augur-egress.patch` clean at 629a4a42 - after apply: `go build ./cmd/gvproxy` OK, `go vet ./cmd/... ./pkg/...` OK - the patch's own tests pass (TestDNSAllowlistMatches, TestDNSAllowlistOversizedLabel, TestPatternsFromConf) - upstream packages the bump touches are ok: pkg/tap, pkg/transport, cmd/gvproxy - `bash gvproxy/build.sh` end-to-end with the new PIN produces a binary carrying all five augur flags (-socks-upstream -deny-direct -dns-allowlist -listen-vfkit -ssh-port) - `make offline-tests`: 29/30 scripts green. The one failure, 33_gvproxy_socket_order.sh, is a checkout-path artifact, not a regression: it reproduces with this change reverted, and is caused by the worktree directory name pushing the computed socket path to 108 bytes, past augur's own AUGUR_SOCKET_MAX_LEN=103 sun_path guard, which then fails closed before launching. It is green in a short-named checkout. - differential runtime checks against both pins (DHCP exchange, TCP forced to SOCKS, UDP/ICMP dropped, non-allowlisted DNS NXDOMAIN) showed no behavioural difference; the vfkit socket mode change was exercised with a same-uid client under umask 002 and still round-trips. NOT verified here (requires a real VZ guest on an Apple Silicon host; this host is itself a VZ guest, so nested virtualisation is unavailable): - `AUGUR_TEST_LIVE=1 make e2e` -- the live macOS egress E2E: allowlisted host reachable, blocked host denied, SSH via gvproxy's forward. Note for whoever runs that E2E: `make e2e` does not rebuild gvproxy, and augur resolves the binary from disk at runtime, so run `bash install` (or `bash gvproxy/build.sh ~/.augur/augur-gvproxy`) first or the E2E will grade the OLD pin's binary. Fixes #159 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
🧭 Egress drift reminderThis PR changes the egress core ( If this change alters the egress posture, please:
Non-blocking reminder. It does not verify correctness (that is the egress fail-closed E2E + |
Live E2E on Apple Silicon — the gvproxy arms passRan on a real Mac at All three arms the #159 runbook names passed, plus SSH through gvproxy's forward:
The one failure is unrelated to this PRThat is
Two things worth a separate issue
Neither belongs in a pin bump, so nothing here changes. |
Live E2E on Apple Silicon: 28 passed · 0 failed · 1 skipped
This closes the one item both PRs listed as "not verified here". About the earlier red runAn intermediate run failed After That underlying seam ordering is a real latent defect and gets its own PR: the |
Closes #159 — the daily freshness bot's
REVIEWfinding on the gvproxy fork pin.Bumps
gvproxy/build.shPINfrom0fd10515(2026-07-13) to629a4a42(2026-07-29, upstream
main), plus the stale pin reference ingvproxy/README.md.augur-egress.patchis not touched.What actually landed upstream
Eight commits; six are OWNERS/approver churn, a lint comment, and merges. Two
change shipped code:
52d1ec12(PR #683)os.Chmod(path, 0600)on every unix-family listener inpkg/transport, failing closed if chmod fails--listen-vfkit unixgram://…socket is one of them: mode goessrwxr-xr-x→srw-------c5f19126(PR #661)apparentlymart/go-cidr;pkg/tap/ip_pool.gowalks the subnet withnet/netipReserve()gained an error return thatvirtualnetwork.New()propagates — fail-closed improvementThe 0600 change is defense in depth, not a closed hole: on Darwin an
AF_UNIXconnect is gated by the write bit, and the pre-change mode under thedefault
umask 022was0755, which already denied other users. It bites undera loose umask (
002gave the group write,000gave everyone write).Why the patch needs no rebase
git diff 0fd10515 629a4a42 --restricted to the eleven filesaugur-egress.patchmodifies produces empty output. The egress-enforcingsurface —
pkg/virtualnetwork/services.go,pkg/services/forwarder/,pkg/services/dns/,pkg/tap/switch.go,pkg/types/,cmd/— isbyte-identical between the two pins, so I4/I5/I9 are untouched by construction.
The near-misses (
tap/switch.govstap/ip_pool.go,virtualnetwork/services.govsvirtualnetwork/virtualnetwork.go) aredifferent files.
Verified here (Apple Silicon, Go 1.26.5, against the exact new SHA)
git apply --check augur-egress.patchclean at629a4a42go build ./cmd/gvproxyOK,go vet ./cmd/... ./pkg/...OKTestDNSAllowlistMatches,TestDNSAllowlistOversizedLabel,TestPatternsFromConfok:pkg/tap,pkg/transport,cmd/gvproxybash gvproxy/build.shend-to-end with the new PIN produces a binary carryingall five augur flags (
-socks-upstream -deny-direct -dns-allowlist -listen-vfkit -ssh-port)make offline-tests→ ALL GREEN (30 scripts),make shellcheckclean,make version-smokeOKbehavioural difference: DHCP
OFFER/ACKbyte-identical (192.168.127.2,mask
255.255.255.0, router/dns192.168.127.1), TCP forced to the SOCKSupstream, UDP/ICMP dropped, non-allowlisted DNS
NXDOMAIN. The vfkit socketmode change was exercised with a same-uid client under
umask 002and stillround-trips ARP.
NOT verified here
AUGUR_TEST_LIVE=1 make e2e— the live macOS egress E2E (allowlisted hostreachable, blocked host denied, SSH via gvproxy's forward). This host is itself
a VZ guest, so nested virtualisation is unavailable. This is the one thing
that still needs a human on an Apple Silicon host.
Important
make e2edoes not rebuild gvproxy, and augur resolves the binary fromdisk at runtime (
resolve_gvproxy). Runbash install— orbash gvproxy/build.sh ~/.augur/augur-gvproxy— before the E2E, or it willgrade the old pin's binary and pass regardless of this change.
Notes for the reviewer
augur-gvproxycarries no stamp of which PIN built it, so nothing detects theskew above mechanically. Chaining
install/stageahead of thee2etarget,or
-ldflags -X-ing the PIN into the binary, would close it. Out of scopehere.
docs/security-reviews/*.mdstill name0fd10515. Those are datedpoint-in-time snapshots, so they are deliberately left alone.
CURRENT, i.e. the PIN byte-matchesupstream
mainat the next 00:00 UTC run. If upstream has moved on by then itgrades
NOISEand neither updates nor closes the issue — close it by hand inthat case. (
Closes #159on this PR handles it on merge.)🤖 Generated with Claude Code