TS-2026-017
Description: HTTP/2 shared serve context could send the wrong Tailscale-App-Capabilities values across mounts.
What happened?
Tailscale Serve can proxy requests to local backends allowing private services to be shared on your tailnet. When enabled with TLS, the server advertises HTTP/2 and all streams on one connection shared a single serveHTTPContext. A race condition occurred because the handler wrote AppCapabilities per request while the reverse proxy read them in a shared hook. Concurrent streams on the same connection could race on this field, causing capabilities from one mount to bleed into requests for another mount.
Tailscale now derives request capabilities from a per-request context rather than sharing state across all streams on an HTTP/2 connection.
This vulnerability is fixed in Tailscale version 1.104.4 or newer.
What was the impact?
Applications that inspect a request's Tailscale-App-Capabilities to authorize a peer might have made incorrect decisions based on capability headers intended for another application. A peer holding a capability for one mount could potentially receive privileged responses from a different mount they are not authorized to access.
Who was affected?
This affects nodes with serve TLS enabled and at least two mounts with different capability requirements on the same node. The issue requires concurrent streams multiplexed on a single connection.
What do I need to do?
If you use Tailscale Serve with TLS enabled, upgrade to Tailscale version 1.104.4 or newer.
TS-2026-016
Description: tailscale serve Unix backends could reach privileged sockets, including the tailscaled local API socket.
What happened?
Tailscale Serve can proxy incoming connections to local backends, including Unix domain sockets, making them accessible over your tailnet. Two weaknesses existed in how tailscale serve handled Unix backend targets. First, TCP forwards to Unix sockets lacked a guard and dialed the target as root. This allowed raw bytes to be passed directly into the local API socket using the daemon's own user permissions. Second, the symlink guard for HTTP proxies only ran during configuration reload rather than per dial. A user could replace a benign backend path with a symlink after configuration to defeat this guard.
Tailscale now restricts TCP forwards to the tailscaled socket and revalidates backend targets during each dial.
This vulnerability is fixed in Tailscale version 1.104.4 or newer.
What was the impact?
The first issue allowed full node takeover by providing remote access to the local API. The second issue allowed root-context dials of arbitrary root-only Unix sockets.
Who was affected?
This affects nodes where a local operator has the ability to write serve configurations or where local users have write access to configured backend paths.
What do I need to do?
If you use Tailscale Serve with Unix socket backends, upgrade to Tailscale version 1.104.4 or newer.
TS-2026-015
Description: Memory exhaustion in Tailscale SSH session handling could lead to denial of service.
What happened?
Tailscale SSH provides a secure shell server integrated into tailscaled. An issue in the embedded SSH server's session handling allowed authenticated peers to cause unbounded memory growth in the tailscaled process. This occurred through continuous window-change messages and environment variable appends within a session. These allocations persisted even after the peer disconnected.
Tailscale now bounds the memory used for session handling and releases it when the peer disconnects.
This vulnerability is fixed in Tailscale version 1.104.4 or newer.
What was the impact?
An attacker could exhaust available memory on the host, leading to an out-of-memory (OOM) kill of the tailscaled process. Because tailscaled is central to all node networking state, such a crash disrupts every Tailscale connection on the node.
Who was affected?
This issue affects nodes running the Tailscale SSH server. An authenticated SSH session permitted by policy is required to trigger the condition.
What do I need to do?
If you use Tailscale SSH, upgrade to Tailscale version 1.104.4 or newer.
TS-2026-014
Description: Tailscale SSH Unix socket forwarding could grant peers access to root-only sockets.
What happened?
Tailscale SSH allows the forwarding of TCP and Unix sockets between a client and a host. The SSH server in the root-privileged tailscaled process validated Unix socket paths lexically but would perform the operations as root. This created three vulnerabilities. First, it allowed privileged dials via local forwarding (ssh -L). Second, it allowed socket replacement via remote forwarding (ssh -R) by unlinking root-owned sockets. Third, a race condition defeated the path allowlist because the kernel re-resolves paths after the initial check.
These issues combined to remove the path allowlist as a security boundary. This gave authenticated peers with authorized forwarding access a route to root-only Unix sockets on the node.
Tailscale now performs Unix socket forwarding on behalf of the authenticated user rather than as root.
This vulnerability is fixed in Tailscale version 1.104.4 or newer.
What was the impact?
An attacker could reach root-only sockets such as the Docker socket or the tailscaled local API.
Who was affected?
This issue affects users with Tailscale SSH enabled who also allow local or remote forwarding in their access policies.
What do I need to do?
If you use Tailscale SSH with local or remote forwarding, upgrade to Tailscale version 1.104.4 or newer.
As a mitigation, you can disable SSH forwarding by setting TS_SSH_DISABLE_FORWARDING=1 in the tailscaled service environment and restarting the service. This disables forwarding without disabling all of Tailscale SSH.