control/controlclient,net/tstun,wgengine/magicsock: fix handling of zero keys in TSMP (#20508)

Updates tailscale/corp#45042

Signed-off-by: Claus Lensbøl <claus@tailscale.com>
This commit is contained in:
Claus Lensbøl
2026-07-17 14:02:53 -04:00
committed by GitHub
parent c1edf7f458
commit 82a381e54b
6 changed files with 121 additions and 49 deletions
+2 -1
View File
@@ -1097,7 +1097,8 @@ func (t *Wrapper) filterPacketInboundFromWireGuard(p *packet.Parsed, captHook pa
t.injectOutboundPong(p, pingReq)
return filter.DropSilently, gro
} else if discoKeyAdvert, ok := p.AsTSMPDiscoAdvertisement(); ok {
if buildfeatures.HasCacheNetMap && envknob.BoolDefaultTrue("TS_USE_CACHED_NETMAP") {
if buildfeatures.HasCacheNetMap && envknob.BoolDefaultTrue("TS_USE_CACHED_NETMAP") &&
!discoKeyAdvert.Key.IsZero() {
t.discoKeyAdvertisementPub.Publish(events.DiscoKeyAdvertisement{
Src: discoKeyAdvert.Src,
Key: discoKeyAdvert.Key,
+23
View File
@@ -1213,3 +1213,26 @@ func TestSetPeerRoutesFastPath(t *testing.T) {
t.Fatalf("peerConfig after second uninstall = %v; want nil", got)
}
}
// Drop empty TSMPDiscoAdvert packets inbound via wireguard.
func TestFilterDropEmptyTSMPDiscoAdvertInbound(t *testing.T) {
var memLog tstest.MemLogger
tw := &Wrapper{logf: memLog.Logf, limitedLogf: memLog.Logf}
ipHdr := packet.IP4Header{
IPProto: ipproto.TSMP,
Src: netaddr.IPv4(1, 2, 3, 4),
Dst: netaddr.IPv4(5, 6, 7, 8),
}
tsmpPayload := make([]byte, 33)
tsmpPayload[0] = byte(packet.TSMPTypeDiscoAdvertisement)
pkt := make([]byte, ipHdr.Len()+len(tsmpPayload))
ipHdr.Marshal(pkt)
copy(pkt[ipHdr.Len():], tsmpPayload)
pp := new(packet.Parsed)
pp.Decode(pkt)
got, _ := tw.filterPacketInboundFromWireGuard(pp, nil, nil, nil)
if got != filter.DropSilently {
t.Errorf("got %v; want DropSilently", got)
}
}