Tailscale SSH安全漏洞:一个"-i"参数让攻击者获得root权限

Tailscale披露高危漏洞TS-2026-009,攻击者通过将用户名设为"-i"即可利用getent命令的参数注入获取root权限。该漏洞源于Tailscale SSH未过滤以破折号开头的用户名,导致getent将其解释为命令行标志并打印整个passwd文件。修复方案为拒绝以破折号开头的用户名,升级至1.98.9及以上版本。
2026年7月13日,Tailscale发布了安全公告TS-2026-009,披露了一个影响Linux平台Tailscale SSH功能的高危漏洞。该漏洞允许攻击者通过一个简单的"-i"用户名,绕过ACL策略限制,获得目标主机的root权限。
漏洞的核心机制是argument injection(参数注入攻击)。Tailscale SSH在验证用户身份时,将用户名传递给Linux系统的getent命令以获取对应的passwd条目。然而,getent会将以破折号开头的参数解释为命令行标志,而非用户名查询。这意味着攻击者可以构造特定用户名来控制getent的行为。
当攻击者使用用户名"-i"通过SSH连接时,攻击路径如下:"-i"被传递给getent命令,getent将其解释为--no-idn标志,该标志导致getent打印整个passwd文件的内容,且从root用户开始。Tailscale解析getent的输出后,错误地认为攻击者的身份是root用户,从而为其打开交互式root会话。整个攻击过程无需特殊工具,仅需一个SSH客户端。
该漏洞的影响范围具有明确边界。受影响平台仅为Linux主机,受影响功能为Tailscale SSH,受影响配置为依赖autogroup:nonroot用户限制的ACL配置。攻击前提是攻击者需要已拥有对节点的SSH访问权限,但通过该漏洞可将其权限从普通用户提升至root。对于使用autogroup:nonroot来限制用户权限的团队,该漏洞意味着任何已授权的SSH用户都可能获取完全控制权。
修复方案简洁有效:Tailscale SSH现在拒绝以破折号开头的用户名,从根源上阻止此类参数注入。这遵循了安全设计的基本原则——在信任边界处验证输入,而非依赖下游工具的行为假设。用户需升级至Tailscale 1.98.9或更新版本。该漏洞由Anthropic和Ada Logics联合报告。
这一漏洞的教训值得深思。getent等Unix工具对以破折号开头的参数的特殊处理是众所周知的陷阱,但在将外部输入传递给系统命令时,开发者常常忽略这一边界条件。类似的参数注入漏洞在历史上反复出现,从早期的邮件服务器到现代的容器编排工具,几乎每一层软件栈都曾受其困扰。根本的防御策略是在将任何外部输入传递给命令行工具时,使用"--"分隔符明确标记参数结束,或在传递前验证输入格式。
术语注释
- Tailscale SSH:Tailscale提供的无密码SSH功能,允许用户通过Tailscale网络身份认证直接SSH到任何节点,无需管理SSH密钥。它通过ACL策略控制访问权限,支持autogroup:nonroot等限制。
- getent命令:Linux系统的通用条目查询命令,用于从各种系统数据库(如passwd、group、hosts)中检索条目。它支持以破折号开头的命令行标志,如--no-idn表示不进行国际化域名编码。
- 参数注入(Argument Injection):一类安全漏洞,攻击者通过在输入中嵌入命令行标志(以破折号开头),改变目标程序的行为。与SQL注入类似,但注入目标是命令行参数而非SQL查询。防御方法是使用"--"分隔符或在输入处拒绝特殊字符。
- ACL(访问控制列表):定义哪些用户或组可以访问哪些资源的规则集合。Tailscale的ACL使用autogroup:nonroot来限制SSH会话为非root用户,该漏洞使得这一限制被绕过。
- autogroup:nonroot:Tailscale ACL中的特殊组,表示SSH连接将以非root用户身份建立。TS-2026-009漏洞使得依赖此限制的配置失效,攻击者可获得root会话。
延伸阅读:Codex 加密子代理提示:AI 编程安全的新博弈, Clawk 与一次性沙箱:如何安全地编排 Agent 环境
评论 (0)
加载评论中…