New OpenSSH Vulnerability
这是个严重的漏洞,而且已经在代码中存在了十年:
一个新披露的、涉及 OpenSSH 与 musl 的漏洞,被戏称为“*sshole”,它允许攻击者仅通过输入一个超长密码,就能登录到某些 Alpine Linux 及其他基于 musl、且配置为禁止密码认证的 Linux 账户。
“超长”指的是超过 256 字节。详情。
Slashdot 讨论帖。还有另一篇新闻报道。
标签:Linux、密码、SSH、漏洞
发布于 2026 年 11 月 10 日上午 7:02 • 13 条评论
评论
Clive Robinson • 2026 年 11 月 10 日上午 11:22
这个漏洞被命名为“*sshole”并不应被视为“粗鲁”。
“sshole”实际上是“SSH hole”的缩写。开头的“”是让该漏洞得以生效的一部分。它源自 nix 密码文件,在其中“*”被放在密码字段中,用来表示某个账户不允许通过 login 程序登录。
开头使用“*”的原因是,它在密码字段中不是有效字符,因此可以被用作“带内信令”。
你们中有些人可能年纪足够大,还记得关于“C 字符串还是 Pascal 字符串”哪个更好的争论。
C 字符串使用带内信令,字符串可以是任意长度,但它总是以 ASCII NUL 字符结尾(自 1962 年起,该字符在基于更早的 Baudot 和 ITU 2 的“一次性纸带”的“超级加密”设备中有重要用途)。
Pascal 字符串使用带外信令,简单说就是首字节用于存储字符串的长度。
两者各有优缺点。一个优点是字符串运算更快,字符串的第一个字符不在位置零,而是在某个位置,这对很多人来说更容易理解,更重要的是所有字符都有效。缺点是字符串长度必须为 255 个字符或更少。起初这似乎不算什么大缺点,但深入研究会很快发现,使用无限长度字符串的代码更容易做得更通用,速度更快,占用的程序“代码”存储/内存更少,并且便于使用机器码技巧……
当时的另一个问题是函数的“返回值”。最初它是一个类型 int,大小等于机器数据字。由于原因太长不便细说,这后来被证明是个坏主意……
于是在 *nix 下“带内信令”成为常态,用一个整数保存返回/错误码。实际数据通常通过调用代码传入函数的指针所指向的内存数组返回。
从安全角度看,这是一种糟糕的做法,尽管它可能相当高效。
Celos • 2026 年 11 月 10 日下午 12:52
而这正是我们需要冗余、有弹性的安全机制的原因。在本例中,本应有一个独立于 C 库的长度限制,并强制执行正确行为。思维方式需要是:如果至少没有两个独立机制来强制保障每一项安全属性,那么它很可能应被视为已损坏。而且,显然,这必须成为任何可从互联网访问的东西的绝对最低标准。
freedom • 2026 年 11 月 10 日下午 2:39
配置为用 阻止密码登录的 ssh 账户。musl C 库的 crypt() 函数在密码哈希失败时返回 ,攻击者可以提交超长密码,导致 OpenSSH 将返回的 与账户中存储的 进行比较,从而成功登录。
配置为用 * 阻止密码登录的 ssh 账户。
musl C 库的 crypt() 函数在密码哈希失败时返回 *
攻击者可以提交超长密码,导致 OpenSSH 将返回的 与账户中存储的 进行比较,从而成功登录。
哈哈。“计算机安全”这个领域根本不严肃……
anonymouse random • 2026 年 11 月 10 日下午 3:36
musl C 库的 crypt() 函数在密码哈希失败时返回 *
文章标题:新的 OpenSSH 漏洞
正文: 最初并非如此,但开发者改变了 crypt() 函数的约定(这对库函数来说可是个大忌),这才使得漏洞利用成为可能:
“crypt() 函数用于生成密码哈希,以便与存储的值进行比较;如果无法计算哈希,它可以返回 NULL。未能检查该结果的应用程序可能会崩溃。而 Musl libc 的开发者却选择在某些失败情况下返回单个字符,他们选的是星号。”(摘自 The Register ;搜索“musl”。链接已省略,因为自动审核不喜欢它。有人能修一下自动审核吗?)
lurker • 2026年11月10日 下午3:42
我隐约记得上世纪80年代的某个时候,我在某种 nix 系统上获得了一个 shell 账户,并被告知我的密码最大长度是55(还是56?)个字符。所以显然那种 nix 系统在40年前就已经把这个问题搞清楚了。人们从不吸取历史教训,永远在重蹈覆辙……
当没有人负责时,就没有监督,那些点或者 * 号,就不会被连起来。
Blinky • 2026年11月10日 下午3:47
我认为这很可能是个“双关语”。
Uh, Mike • 2026年11月10日 下午5:50
SSH 已经变得太复杂了。把那些遗留的破烂砍掉吧。缩小攻击面。
anonymouse random • 2026年11月10日 下午6:54
SSH 已经变得太复杂了。把那些遗留的破烂砍掉吧。缩小攻击面。 <
SSH 是被极其广泛使用的遗留代码。我相信自大约2006年以来它就没怎么变过。
这个 bug 源于少数几个 SSH 实现所使用的一个库的约定变更。不用说,库的发布者不应该以任何破坏向后兼容性的方式更改其库的约定。
Smooth Operator • 2026年11月10日 下午11:00
@Scott • 2026年11月10日 下午1:24,
如果他哪怕对这些圈子的文化有一丁点了解,他就会知道黑客社区文化会优先使用这类术语,无论何时何地,只要有可能就用,而且这方面的例子在到处都多得是。你只要 google 一下“deep throat”或“back orifice”(这还只是众多例子中的几个)就知道了。
他当然知道这一点。就看着他跟我们耍聪明吧。他无所不知。他就是那个他妈的 clive robinson——呃,我刚才在想什么???
Anonymous • 2026年11月10日 下午11:08
@Smooth Operator,
正是如此。我记得 Deep Throat https://threats.kaspersky.com/en/threat/Backdoor.Win32.DeepThroat/
Clive Robinson • 2026年11月11日 上午2:08
“是什么光从那边的窗户透进来……”
关于你的说法,
“*sshole 当然就是为了让人联想到指屁股的那个脏话。当然是。你在开玩笑吗?”
针对我的这条评论,
“给这个漏洞起的名字‘*sshole’不应该被视为‘粗鲁’。”
这就是为什么我随后给出了那个你可以板着脸对老板等人说的解释……但我想有些人没听懂。
停下来想一想,这两句话怎么会同时成立,又为什么成立?
你现在明白了吗?
但对其他后续跟帖、显然没听懂也从来没听懂、还让别人看了笑话的人,给个线索,
这是一个至少从英格兰女王伊丽莎白一世时代、以及她对大法官禁演戏剧的审查时期就开始玩的游戏。这也是为什么莎士比亚的作品在原文中有几处有点古怪。
哦,还有为什么在编辑被设立后不久,你依然能在已出版的文字世界里看到它……
不妨听听这个,
https://m.youtube.com/watch?v=bPduoU826ew
它可以追溯到20世纪50年代初,展示了其中的一小部分。
如果你搜索这个网站,你会发现我已经叫某些人
“温习一下你的莎士比亚”
好几年了,但他们就是一直往坑里跳。
再搜索一下“Yellow Card”,你会发现 @Wael 和我多年来一直在这个博客的“星期五鱿鱼”栏目里做着同样的事。
Clive Robinson • 2026年11月11日 上午2:19
但我上面给出的那个歌曲版本差不多只是“适合工作时听”的,因为它被“砍掉”了不少。
如果你不是在工作,那么,
https://m.youtube.com/watch?v=EUthszWDgRo
是的,过去我曾在伦敦西南边缘的一家酒吧里,为了“免费啤酒”唱过它……
cls • November 11, 2026 3:41 PM
心态必须是,如果至少没有两个独立的机制来强制执行每一项安全属性,
呃,不。就是不。
拥有两个时钟的人永远无法确定时间。
最近我们看到了相当多严重缺陷,它们是由这里的一个长度和那里的另一个长度(通常是未检查的用户数据)以及随后的缓冲区下溢或溢出造成的。
或者,由于在不止一个地方保留长度而加剧的 ToC/ToU 间隙所导致的漏洞。
你帖子的第一部分方向是对的:纵深防御、分层、每一层中简单可靠的代码。不要瑞士奶酪式的漏洞。
订阅此条目的评论

发表评论 取消回复
博客审核政策
Bruce Schneier 的侧栏照片,由 Joe MacInnis 拍摄。
由 WordPress 提供支持 由 Pressable 托管