You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit cb1e0d7
Browse filesBrowse the repository at this point in the historyBrowse files
Like Tailscale itself, use separate node and disco keys. Tailcat had
lazily reused the node key as its disco key as an early implementation
shortcut, and that shortcut was not cleaned up before release.
Because disco frames expose the disco public key on direct UDP paths,
reusing it also exposed the node public key embedded in the unlisted
connection token. Derive an independent disco key, include its public
half in new tokens, and reject legacy tokens when connecting.
Thanks to Heyang Zhou (https://x.com/heyang_zhou) for the report!
Reported-by: Heyang Zhou (@losfair)
Copy file name to clipboardExpand all lines: README.md
+6-3Lines changed: 6 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -451,11 +451,12 @@ ConnBlob internally). It looks like `tcXYZ...` and is a `"tc"` prefix
451
451
followed by base64-encoded [CBOR](https://cbor.io/) containing:
452
452
453
453
- The server's WireGuard public key (Curve25519, 32 bytes)
454
+
- A separate path-discovery public key (Curve25519, 32 bytes)
454
455
- DERP info. Either:
455
456
1. a small integer referencing one of the default [Tailscale-run tailcat servers](https://tailcat.dev/derpmap.json), or
456
457
2. full DERP server metadata, to either use a custom DERP server, or to avoid the client needing a potential round-trip to fetch the latest DERP map (the server's `--full-address` flag and the `tailcat resolve` subcommand produce this form)
457
458
458
-
A typical token with just an integer region ID is around 50 bytes. With embedded
459
+
A typical token with just an integer region ID is around 95 bytes. With embedded
459
460
DERP node details it's longer but self-contained.
460
461
461
462
### Network stack
@@ -483,8 +484,10 @@ without the control plane.
483
484
It then waits for clients.
484
485
485
486
2.**Client parses the token** to learn the server's public key and
486
-
DERP region. It generates its own ephemeral keypair and connects to
487
-
the same DERP relay.
487
+
path-discovery key, plus its DERP region. It generates its own ephemeral
488
+
keypair and connects to the same DERP relay. The separate path-discovery
489
+
key can appear in cleartext direct-path disco frames without revealing the
490
+
WireGuard public key that acts as the unlisted connection capability.
488
491
489
492
3.**Discovery handshake.** The client sends a "**Meow**" ping message
0 commit comments