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:
+2
-1
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user