Skip to content
EuroVPSEuroVPS

Tailworm: the Tailscale SSH root escalation, fixed

On nodes running Tailscale SSH, Unix socket forwarding could reach root-only sockets and turn an ordinary SSH session into root. Update to 1.104.4 or later; here is how to check your own hosts.

By EuroVPS EngineeringThe engine room

9 min read
In this article 7 sections
TL;DR
  • On 25 October 2026, researchers published 11 findings against the Tailscale client and the headscale control server under the name "Tailworm", before a fix was available.
  • The most serious (Tailscale bulletin TS-2026-014): on nodes running Tailscale SSH, Unix socket forwarding could reach root-only sockets such as the Docker socket or the tailscaled local API, turning an ordinary SSH session into root on the target.
  • It needs a device that your tailnet policy already allows to SSH in. It is a privilege escalation, not remote code execution for strangers on the internet, and standard OpenSSH reached over a Tailscale network is not affected by this issue.
  • Fixed in Tailscale 1.104.4, released 28 October 2026. Check with tailscale version and update. If you cannot update yet, Tailscale's interim advice is TS_SSH_DISABLE_FORWARDING=1.

What was disclosed

On 25 October 2026, Cyberdione Labs published a report it called Tailworm: 11 findings against the Tailscale client (tested on version 1.104.2) and against headscale, the open-source control server (tested on 0.29.5). The report went public very shortly after it reached Tailscale, so for a few days the details were out before a patch. Tailscale published four security bulletins, TS-2026-014 to TS-2026-017, dated 26 October, and shipped the fixes in client 1.104.4 on 28 October. No CVE identifiers had been assigned at the time of writing.

BulletinWhat it coversWho is affectedFixed in
TS-2026-014Tailscale SSH Unix socket forwarding could grant peers access to root-only socketsNodes running Tailscale SSH where local or remote forwarding is allowed1.104.4
TS-2026-015Memory exhaustion in Tailscale SSH session handling, which can crash the daemon (denial of service)Nodes running Tailscale SSH1.104.4
TS-2026-016Unix socket backends of tailscale serve could reach privileged sockets, including the tailscaled local APINodes using Serve with Unix socket backends1.104.4
TS-2026-017Over HTTP/2, a shared Serve context could send the wrong capability headers across mountsServe with TLS and several mounts with different capability requirements1.104.4

Some of the report's other findings concern headscale itself, such as memory exhaustion on the control server. Headscale is a separate project: updating the Tailscale client does not fix a headscale server, so if you run one, follow the headscale project's own releases.

How the escalation works

Tailscale SSH is not OpenSSH. It is an SSH server built into tailscaled, the Tailscale daemon, which runs as root so it can open sessions as whichever user the tailnet policy allows. Like OpenSSH it supports forwarding, including Unix socket forwarding (ssh -L and ssh -R with a socket path), which joins a socket on one machine to the other end of the SSH connection.

The forwarding code checked the requested socket path by name against what the session's user was allowed to use, but the actual connect, bind and unlink were then carried out by the root daemon. According to the published analysis, a race between the check and the use could defeat that allowlist. The result: a session for an ordinary user could end up connected to sockets that only root is meant to open.

Several root-only sockets are, in practice, root itself:

  • The Docker socket (/var/run/docker.sock): whoever can talk to the Docker daemon can start a container that mounts the host's root filesystem.
  • The systemd and D-Bus sockets: they can create and restart services, and services run as root.
  • The tailscaled local API socket: it controls the node's Tailscale configuration, SSH settings included.

In a lab, the researchers chained these steps from one host to the next, which is where the worm name comes from. As heise and others point out, this is lateral movement by an attacker who already has a foothold, not code that spreads by itself. No exploitation in the wild had been reported at the time of writing.

Who is affected, and who is not

  • Affected: Linux and Unix nodes with Tailscale SSH turned on (tailscale set --ssh, or the SSH setting in the admin console), on a client older than 1.104.4, where the tailnet policy lets other devices SSH in with forwarding allowed.
  • The precondition: the attacker needs a device that your policy already allows to SSH to the target, for example a developer laptop or a CI runner that was itself compromised. It escalates an authorised session; it does not let an unknown device in.
  • Not affected by TS-2026-014: OpenSSH (sshd) that you simply reach over a Tailscale connection. There, Tailscale only carries the traffic; the SSH server is a separate program with its own rules.
  • Not affected: nodes where Tailscale SSH is turned off.
Why it matters

The promise of an overlay network is that a stolen laptop or a compromised build server reaches only what policy allows. This flaw turned "allowed to log in as an ordinary user" into "root on the target", and root on one server is a foothold for the next. In a tailnet where many devices may SSH to many servers, a single compromised device could become root across everything it can reach. That is why we treat it as urgent even though it needs a foothold first.

Check your own hosts

Start with an inventory: which of your machines run Tailscale, and which of those have Tailscale SSH turned on. The admin console's Machines list shows an SSH badge on nodes that serve Tailscale SSH. Then, on each server:

On each node
# 1. Which client version? You want 1.104.4 or later.
$ tailscale version

# 2. Update from the Tailscale package repository
# RHEL, AlmaLinux, Rocky, Oracle Linux:
$ sudo dnf upgrade tailscale
# Debian, Ubuntu:
$ sudo apt-get update && sudo apt-get install --only-upgrade tailscale

# 3. Confirm the new version is the one running
$ tailscale version

If you cannot update today, close the door in another way, in this order of preference:

01

Disable SSH forwarding

Set TS_SSH_DISABLE_FORWARDING=1 in the tailscaled environment (on most systemd distributions, /etc/default/tailscaled) and restart tailscaled. This is Tailscale's own interim recommendation; SSH logins keep working, only forwarding stops.

02

Or turn Tailscale SSH off on that node

tailscale set --ssh=false, and reach the server with OpenSSH over the tailnet instead.

03

Tighten the SSH rules in your tailnet policy

Review which sources may SSH to which servers, and as which users. Every device that can reach a root-capable server is part of that server's security.

Harden beyond the patch

  • Keep the client updating itself: tailscale set --auto-update, so the next fix lands without anyone having to remember.
  • Treat SSH rules as privilege grants: the security of the source device is now part of the security of the target.
  • Keep the Docker socket where it is needed: do not add ordinary users to the docker group; it is root by another name.
  • Watch for the unexpected: new containers, new systemd units, or changed Tailscale settings on servers are worth an alert.
  • Check the earlier fixes too: Tailscale 1.98.9 already closed related Tailscale SSH and Serve issues in June and July 2026, for example TS-2026-004 (symlinks that bypassed the socket path checks) and TS-2026-006 (numeric user IDs that bypassed root restrictions). A node still older than that is exposed to those as well.

Context: earlier Tailscale advisories

Tailscale keeps a public security bulletin page and has handled serious bugs before, for example CVE-2022-41924, a critical flaw in the Windows client fixed in 1.32.3, and CVE-2023-28436, where Tailscale SSH on FreeBSD ran commands with wider group permissions than the policy allowed, fixed in 1.38.2. The lesson is not to avoid Tailscale: fixes landed within days and the bulletins are clear. The lesson is to know where you run it, keep it current, and treat any SSH path through it as a privileged one.

Straight answers

Is my server at risk if I only use Tailscale as a VPN and log in with OpenSSH?+

Not from TS-2026-014. That issue is in Tailscale's own SSH server. If sshd handles your logins and Tailscale only carries the traffic, the socket forwarding flaw does not apply. Updating the client is still sensible because of the other bulletins.

Can someone on the internet use this to break in?+

No. The attacker needs a device that your tailnet policy already allows to SSH to the target. The flaw lets that authorised session become root; it does not let an unknown device connect.

Which version fixes it?+

Tailscale 1.104.4, released 28 October 2026, fixes TS-2026-014 to TS-2026-017. Run tailscale version on each node to confirm.

I cannot restart tailscaled right now. What is the least disruptive mitigation?+

Tighten the SSH rules in your tailnet policy, which takes effect without touching the node. Then plan the update, or the TS_SSH_DISABLE_FORWARDING=1 setting, for the next safe moment.

Does updating the Tailscale client fix headscale?+

No. Headscale is a separate control server with its own findings in the report. Update it from the headscale project's releases.

Sources

Running Tailscale on servers we look after?

We can check client versions and SSH settings across them, and apply the update or the interim mitigation for you.

Talk to an engineer

You’ve reached the end.

Put the reading to work

What are
you running?

Tell us about the workload, traffic and recovery requirements. Start with the server builder, or talk through the details with an engineer.

Written by the engineers who build and run the infrastructure it describes.
Talk to an engineer
XIn

9 min left