2026年10月26日,零信任网络厂商 Tailscale 发布紧急安全调查更新,承认内置的 Tailscale SSH 存在多项严重提权漏洞,预计在10月27日结束前发布修复补丁。官方通告写得颇为克制,只说已获授权连接的用户在特定条件下可能执行越权操作,暂不建议所有人彻底关闭服务,但给了一条临时救命指令:在 tailscaled 服务环境变量里加上 TS_SSH_DISABLE_FORWARDING=1 并重启。

官方没把话说透,外部安全研究员却已经把底牌掀了。Cyberdione Labs 的研究员 Erica Windisch 披露了代号为 Tailworm 的漏洞报告(基于 Tailscale 1.104.2 与开源控制面 headscale 0.29.5 测试),直接演示了 root 代码执行 与设备注册凭证窃取。算上今年6月到7月密集发布的4份安全公告,Tailscale SSH 在短短 5个月内连爆5次雷,问题全出在同一个地方——用高权限网络守护进程去重造 SSH 服务器的轮子。

一行救命配置背后的真凶:root 转发与时间差攻击

为什么关掉转发功能(TS_SSH_DISABLE_FORWARDING=1),就能挡住最致命的提权攻击?答案藏在 Tailscale 的源码(ssh/tailssh/tailssh.go)与守护进程的运行机制里。

路径验证与实际操作之间的毫秒空隙被用于偷换高权限套接字(示意图)
路径验证与实际操作之间的毫秒空隙被用于偷换高权限套接字(示意图)

为了帮运维人员省去分发和轮换公钥的麻烦,Tailscale 把自研的 SSH 服务器直接塞进了客户端守护进程 tailscaled。但 tailscaled 需要管理虚拟网卡和路由表,默认以系统的 root 最高权限 运行。当一个低权限的普通用户通过 Tailscale SSH 连上机器,并请求做本地/远程 TCP 转发或 Unix 域套接字(Unix socket)转发时,处理这个转发请求的动作,实际上是由高权限的 tailscaled 代劳的。

Tailworm 漏洞提权链路(TOCTOU 竞争条件) 1. 低权限授权连接 普通用户连入内置 SSH 发起 Unix socket 转发 2. 路径检查与操作时间差 tailscaled 以 root 验证路径 验证与实际连接间被掉包 3. 权限边界击穿 以 root 权限执行代码 窃取设备注册凭证 临时拦截点:设置 TS_SSH_DISABLE_FORWARDING=1 可在步骤 1 进入转发逻辑前直接阻断

Erica Windisch 的 Tailworm 报告点出了核心病灶:Unix socket 转发操作以 root 权限运行,且在路径验证(Path Validation)与实际的套接字操作之间,存在竞争条件(Race Conditions,即经典的 TOCTOU 检查时与使用时时间差漏洞)。

简单说,当普通用户请求转发某个套接字路径时,tailscaled 会先检查这个用户有没有权限访问该路径;但在检查通过后、真正用 root 身份去打开套接字的那几毫秒空隙里,攻击者可以把目标路径偷换成系统高权限套接字。一旦得手,原本受限的普通账户就能直接拿到 root 权限,甚至顺手捞走节点在零信任网络里的设备注册凭证。

在零信任架构里,很多企业会把非 root 的低权限 SSH 访问开放给外包人员、实习生或自动化脚本,指望靠 ACL(访问控制列表)死死卡住权限边界。Tailworm 的出现,意味着只要内部有一个低权限账号失守,或者有一名半信任的内部人员心怀不轨,整台主机的 root 权限就会直接沦陷。

五个月连爆五雷:打地鼠式的边界修补

如果只看10月26日这份更新,很容易以为这只是一次偶发的代码疏漏。但把时间轴拉回2026年6月就会发现,Tailscale SSH 的权限边界已经连续失守了五次。

五个月连发五次安全警报,封堵旧洞后同一管道再次失守
五个月连发五次安全警报,封堵旧洞后同一管道再次失守
2026年下半年 Tailscale SSH 权限边界漏洞时间线 6月3日 TS-2026-004 符号链接绕过转发 6月11日 TS-2026-006 UID 0 绕过 root 限制 7月13日 TS-2026-009 连字符用户名提权 7月24日 TS-2026-010 环境变量泄露机密 10月26日 Tailworm 披露 转发路径竞争条件 注:6月3日与10月26日两次高危漏洞,均发生在以 root 运行的 Unix socket 转发机制上

把前四次事故排开,几乎是一部小型的 Unix 权限踩坑教科书:

  1. TS-2026-004(6月3日)dtrsecurity 的 Tim Sageser 发现,Unix socket 转发只做了字面路径检查,没解析符号链接(Symlink),攻击者建个软链接就能越权访问受限套接字(1.98.9 修复)。
  2. TS-2026-006(6月11日)GM 的 Tim Hoffman 发现,数字 UID 处理存在漏洞,即使 ACL 禁止了 root 登录,攻击者依然可以用 UID 0 绕过限制直接拿 root(1.98.9 修复)。
  3. TS-2026-009(7月13日)Anthropic 与 Ada Logics 联合发现,以连字符(-)开头的用户名会被系统底层 getent 命令当成命令行选项解析,从而绕过 ACL 选定 root 账户(1.98.9 修复)。
  4. TS-2026-010(7月24日)acceptEnv 在转发环境变量时,把敏感机密泄露给了本地用户和系统日志(1.102.1 修复)。

最耐人寻味的是6月3日的 TS-2026-004 与10月26日的 Tailworm。6月份,Tailscale 刚刚因为在 Unix socket 转发里漏掉了符号链接解析而挨了一记闷棍;当时他们在 1.98.9 版本里补上了路径检查。结果到了10月份,攻击者不搞静态的符号链接欺骗了,直接利用动态的时间差(TOCTOU)在路径检查和实际操作之间打穿防线。

为什么同一个转发机制会修而复发?因为只要 由 root 进程代为发起套接字操作 这个大前提不变,防御方就必须在用户态代码里穷举所有的路径欺骗、符号链接和竞争条件,这在现代操作系统安全里几乎是一场必输的打地鼠游戏。


重造 OpenSSH 的代价与运维自救指南

《韩非子》有云:“千丈之堤,以蝼蚁之穴溃。” 放到基础设施软件里,这个蝼蚁之穴往往就是为了追求用户体验而妥协掉的权限隔离。

传统权限分离双舱架构与内置服务单体高权限架构的边界对比(剖面示意)
传统权限分离双舱架构与内置服务单体高权限架构的边界对比(剖面示意)

传统 OpenSSH 的 sshd 之所以能在公网裸奔几十年而极少出现此类低级提权,靠的是2002年就引入的 权限分离(Privilege Separation) 架构。OpenSSH 接收网络连接后,会立刻把处理未授权流量和用户会话的工作剥离给低权限的子进程,哪怕解析代码或转发逻辑写出漏洞,攻击者拿到的也只是一个空壳子进程的权限,碰不到 root。

Tailscale 的思路则是另一条路:用一套 Go 语言写的 tailscaled 守护进程包揽一切,既管底层 WireGuard 虚拟网卡,又管上层 SSH 会话与套接字转发。这种一体化设计确实爽快,一行配置就能免密钥登录;但它把网络层的高权限与会话层的复杂解析揉进了同一个进程边界,一旦降权逻辑或代转发检查慢了半拍,就是直接送 root 的大洞。

省下分发密钥的工夫,欠下的是权限隔离的技术债。

这里必须帮运维团队厘清一个极易混淆的盲区:用 OpenSSH 客户端连接,不等于服务端跑的是 OpenSSH。

Tailscale 工程副总裁 Mike Shaver 于10月25日在 Reddit 明确澄清,本次调查的漏洞 仅影响内置的 Tailscale SSH 服务端,完全不影响通过 Tailscale WireGuard 隧道访问的常规 OpenSSH sshd。也就是说,如果你的服务器只是装了 Tailscale 组网,但 22 端口依然由系统自带的 sshd 监听,那你这次是安全的。

针对正在使用内置 Tailscale SSH 的团队,眼下无需恐慌,按以下三步处理即可:

  • 立刻止血(关闭转发).如果不依赖 SSH 端口或套接字转发,马上在目标主机的 tailscaled 服务环境变量中加入 TS_SSH_DISABLE_FORWARDING=1 并重启服务,这能直接掐断 Tailworm 的利用链。
  • 彻底剥离(回退传统 sshd):如果机器上有外包或低权限账号共享访问,且对安全极度敏感,直接在目标主机执行官方指令 tailscale set --ssh=false 关闭内置 SSH,改用传统 OpenSSH sshd 配合 Tailscale 隧道内网 IP 访问。
  • 盯紧补丁与架构表态.关注10月27日发布的客户端补丁(版本号高于 1.104.2)并及时升级。

比起10月27日那版补丁能不能按时发出来,我更在意的是随后的技术复盘博客。Tailscale 究竟是打算在路径验证上继续打第二个补丁,还是肯痛下决心,把 Unix socket 转发从 root 权限里彻底剥离出去?如果是前者,那第6份安全公告恐怕已经在路上了。