Skip to main content

Cve/tailworm

@swamp/cve/tailwormv2026.10.25.1· AGPL-3.0-or-later· 1d agoBEHAVIORSREPORTSACCEPTED WARNINGS
01README

Finds and mitigates hosts exposed to Tailworm, the security assessment of Tailscale v1.104.2 and headscale v0.29.5 published at tailworm.com on 2026-10-24 (Erica Windisch, Cyberdione Labs). The findings were reproduced in a lab. No CVE or Tailscale bulletin had been issued, and no fixed release existed, when this was written.

  • Tailscale SSH runs ssh -L/-R unix-socket forwarding as root. A rename race defeats its path allowlist, so any device an SSH rule admits can reach docker.sock, /run/systemd/private or tailscaled.sock as root.
  • serve --tcp to tailscaled.sock gives remote peers read/write localapi access (node takeover).
  • conn25 app connectors let entitled peers pick arbitrary egress destinations, including cloud metadata.
  • headscale can be crash-looped and its onboarding blocked without authentication.

Methods

  • scan scans one host (local, SSH, or Docker container or image).
  • scanFleet scans many hosts in parallel over SSH.
  • mitigate scans first, then applies the report's interim mitigations on exposed hosts: removes serve forwards to tailscaled.sock, blocks tailscaled egress to cloud metadata with nftables, installs auditd rules for tailscaled's socket operations, and caps headscale memory. Turning Tailscale SSH or the app connector off is opt-in. dryRun defaults to true.

What it reports

Tailscale version and the earlier 2026 bulletins it misses, SSH, serve forwards to unix sockets, funnel, app connector and conn25, node key expiry, TS_SERVE_ALLOW_ALL_INTERFACES, headscale limits and exposure, and the report's forensic signatures: a tailscaled.sock that is not 0666, tailscaled listening on unix sockets, and root-owned 0755 sockets in the forwarding directories.

Scanning needs no root; the listener, nftables and auditd checks are skipped without it. mitigate needs root, or passwordless sudo for the exact commands it runs (sudo -n, checked per command before anything changes). The SSH policy itself is the main control and is not visible from a host: rewrite it as per-pair grants.

02Behaviors1
@swamp/cve/tailwormv2026.10.24.1tailworm.ts
fn scan()
Scan a single host or container for Tailscale and headscale exposure to the Tailworm findings
fn scanFleet()
Scan multiple hosts in parallel over SSH. Pass a comma-separated list of hosts; each connects as the model's SSH user and key, or as user for a user@host entry.
fn mitigate()
Scan, then apply the report's interim mitigations on affected hosts: remove serve forwards to tailscaled.sock, block tailscaled egress to cloud metadata, add auditd rules, and cap headscale memory. dryRun defaults to true.

Resources

status(infinite)— Exposure assessment for the Tailworm findings (Tailscale v1.104.2 / headscale v0.29.5, tailworm.com, 2026-10-24)

Files

log(text/plain)— Scan execution log
03Reports1
@swamp/cve/tailworm-reportmethod
tailworm_report.ts

Reports on Tailworm (Tailscale/headscale) scan and mitigation results

securityvulnerability
04Previous Versions1
2026.10.24.1AGPL-3.0-or-later
05Stats
A
93 / 100
Downloads
1
Archive size
72.3 KB
Verified by Swamp
  • Has README or module doc2/2earned
  • README has a code example1/1earned
  • README is substantive1/1earned
  • Most symbols documented0/1missing
  • No slow types (deprecated)1/1earned
  • Dependencies pass trust audit2/2earned
  • Docs keep secrets in a vault1/1earned
  • Has description1/1earned
  • Platform support declared (or universal)2/2earned
  • License2/2earned
  • Verified public repository2/2earned

07Platforms
08Labels