On this page · 7 sections
  1. The Four Bulletins, Their Impact and Who Is Affected
  2. TS-2026-014: SSH Forwarding Ran as Root
  3. TS-2026-015 and the Two Serve Flaws
  4. What the Tailworm Report Did Not Show
  5. Updating Tailscale and Narrowing SSH Access
  6. Checking a Node: Version, Serve Backends and SSH Forwarding
  7. Sources

Warning

Tailscale v1.104.4, released on October 28, fixes four vulnerabilities described in security bulletins TS-2026-014 to TS-2026-017, which followed a researcher's report called "Tailworm". The most serious, TS-2026-016, could allow full node takeover through the tailscaled local API on nodes where Tailscale Serve uses Unix socket backends and a local user can change them. The SSH flaws need an authenticated session that the tailnet policy already allows, so they widen what an existing peer can do rather than let outsiders in.

The Four Bulletins, Their Impact and Who Is Affected #

Each bulletin states that the flaw is fixed in Tailscale 1.104.4 or newer, and each names its own conditions. They differ more than the shared fix version suggests.

BulletinFeatureImpactAffected nodes
TS-2026-014Tailscale SSH forwardingPeers reach root-only Unix sockets such as the Docker socket or the tailscaled local APITailscale SSH with local or remote forwarding allowed in the access policy
TS-2026-015Tailscale SSH sessionsMemory exhaustion and an out-of-memory kill of tailscaled, which drops every Tailscale connection on the nodeNodes running the Tailscale SSH server; needs an authenticated session permitted by policy
TS-2026-016Tailscale Serve, Unix backendsFull node takeover through remote access to the local API, and root-context dials of other root-only socketsNodes where a local operator can write Serve configuration or local users can write configured backend paths
TS-2026-017Tailscale Serve over TLSCapability headers meant for one mount sent with requests to anotherServe with TLS and at least two mounts with different capability requirements on one node

TS-2026-014: SSH Forwarding Ran as Root #

The SSH server inside the root-privileged tailscaled checked Unix socket paths by their text but then performed the socket operations as root. The bulletin lists three resulting flaws: local forwarding with ssh -L could dial privileged sockets, remote forwarding with ssh -R could replace sockets by unlinking root-owned ones, and a race defeated the path allowlist because the kernel resolves the path again after the check. Together they removed the allowlist as a security boundary. The v1.104.4 changelog says forwarding now runs on behalf of the authenticated user rather than as root.

For nodes that cannot update at once, the bulletin gives a mitigation: set TS_SSH_DISABLE_FORWARDING=1 in the tailscaled service environment and restart the service, which turns off forwarding without turning off Tailscale SSH.

TS-2026-015 and the Two Serve Flaws #

In TS-2026-015, continuous window-change messages and appended environment variables made tailscaled allocate memory without limit, and the memory stayed allocated after the peer disconnected. v1.104.4 bounds that memory and releases it on disconnect.

TS-2026-016 has two parts. TCP forwards to Unix socket backends had no guard and dialed the target as root, which let raw bytes reach the local API socket with the daemon's own permissions. The symlink guard for HTTP proxies ran only when the configuration was reloaded, so a backend path could be swapped for a symlink afterwards. v1.104.4 restricts TCP forwards to Unix socket backends and checks the backend path on every connection.

TS-2026-017 is a race in Serve over HTTP/2: all streams on one TLS connection shared one context, so Tailscale-App-Capabilities values for one mount could be sent with a request to another. An application that authorizes peers by that header could then answer a peer it should have refused.

What the Tailworm Report Did Not Show #

Tailscale's findings post, written by Mike Shaver, states that the SSH flaws do not let an unauthenticated attacker connect to arbitrary Tailscale SSH servers. An attacker needs a foothold on an authorized peer, SSH access granted in the tailnet policy file and the conditions each flaw requires, and could reach only machines that policy already allowed. Tailscale therefore describes the scenario as lateral movement within policy, not a self-replicating worm.

The report also listed five Serve and Funnel findings. Three were bugs fixed in v1.104.4; Tailscale treats the other two as intended behavior, since bypassing the Funnel attribute check requires local admin access and TS_SERVE_ALLOW_ALL_INTERFACES is an opt-in setting. A vulnerability in Conn25, the next generation of app connectors, concerns a feature that has not been released; the current app connectors are not affected. Tailscale says it received the report on October 24, two hours before the researcher published it, and released the fixes four days later.

Updating Tailscale and Narrowing SSH Access #

  1. Update every node that runs Tailscale SSH or Tailscale Serve to v1.104.4 or a later 1.104 release. v1.104.5 on November 2 also fixes SSH sessions that disconnected when a check mode approval expired and SSH restarts that could hang.
  2. On Windows, install new nodes with the v1.104.5 or later .exe installer, which fixes a privilege escalation at install time; existing installations do not need to be reinstalled.
  3. Until a node is updated, set TS_SSH_DISABLE_FORWARDING=1 for tailscaled and restart it, and remove forwarding from SSH rules that do not need it.
  4. On nodes with Serve Unix socket backends, check who can write the Serve configuration and the backend paths, and restrict both to administrators.
  5. Review the SSH section of the tailnet policy file so access is limited to the users and devices that need it, and use check mode for sensitive systems, as the findings post recommends.

Checking a Node: Version, Serve Backends and SSH Forwarding #

The version shows whether the node has the fixes. The Serve status lists the backends, including Unix sockets, and the environment check shows whether the forwarding mitigation is set on a systemd host.

Bash
tailscale version
tailscale serve status
systemctl show tailscaled --property=Environment
grep -n "TS_SSH_DISABLE_FORWARDING" /etc/default/tailscaled

The Sentinel’s Call

Nodes that run Tailscale Serve with Unix socket backends should update first, since TS-2026-016 could hand the local API to anyone who can change those backends. Nodes with Tailscale SSH and forwarding allowed come next, or should set TS_SSH_DISABLE_FORWARDING=1 until they update. Every SSH rule in the tailnet policy file is worth a review, because each of the SSH flaws starts from access that policy already grants.

Our judgement, drawn only from the facts and sources above.

Sources

  1. Tailscale v1.104.5 — Changelog · Tailscale tailscale.com · Nov 2, 2026
  2. Tailscale SSH: Findings and fixes tailscale.com · Oct 28, 2026
  3. Tailscale v1.104.4 — Changelog · Tailscale tailscale.com · Oct 28, 2026
  4. TS-2026-017 — Security Bulletins · Tailscale tailscale.com · Oct 26, 2026
  5. Security Bulletins · Tailscale tailscale.com · Reference

More on Tailscale

1 other article, newest first

Next reading

Edited and approved by Jarosław Krzemiński. Spotted a mistake? Report a correction or read the corrections policy.