fix: register TCPClientTunnel BindAddress as landlock.BindTCP, not ConnectTCP - #219
Open
bkmz wants to merge 1 commit into
Open
fix: register TCPClientTunnel BindAddress as landlock.BindTCP, not ConnectTCP#219bkmz wants to merge 1 commit into
bkmz wants to merge 1 commit into
Conversation
…nnectTCP TCPClientTunnel listens on BindAddress (net.ListenTCP), but lockNetwork() registered it as a landlock.ConnectTCP rule instead of landlock.BindTCP. On kernels supporting Landlock network ABI v4 (Linux 6.7+), this makes wireproxy's own Landlock self-sandboxing deny its own bind() on BindAddress, regardless of host environment. Fixes windtf#218
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.
What
TCPClientTunnellistens onBindAddressvianet.ListenTCP(routine.go), butlockNetwork()incmd/wireproxy/main.goregistered its Landlock rule aslandlock.ConnectTCPinstead oflandlock.BindTCP— the only listening routine type that got the wrong rule (HTTPConfig,Socks5Config,SNIConfigall correctly useBindTCP).Why it matters
On kernels supporting Landlock network ABI v4 (Linux 6.7+, Jan 2024),
landlock.V4.BestEffort().RestrictNet(rules...)actually enforces these rules. SinceTCPClientTunnel's own bind was never allowlisted as a bind, the kernel denies wireproxy's ownnet.ListenTCPcall onBindAddress:This reproduces on any host/platform once the kernel is new enough — independent of Docker, cloud platform, or any external sandboxing. Full writeup with reproduction and control test in #218.
Fix
One-line: swap
ConnectTCPforBindTCPfor theTCPClientTunnelConfigcase, matching the pattern used by every other listening config type.Verified
go build ./...andgo vet ./...pass. Manually verifiedTCPClientTunnelbinds and accepts connections again after this change, on a host that previously reproduced the bug 100% of the time.Fixes #218