CVE-2018-10933 - 绕过 SSH 身份验证 - libssh 漏洞

信息安全 验证 SSH 脆弱性
2021-09-02 07:54:58

看起来 CVE-2018-10933 今天刚刚发布,您可以在此处从 libssh 中找到摘要

概括:

libssh 0.6 及更高版本在服务器代码中存在身份验证绕过漏洞。通过向服务器显示 SSH2_MSG_USERAUTH_SUCCESS 消息来代替服务器期望启动身份验证的 SSH2_MSG_USERAUTH_REQUEST 消息,攻击者可以在没有任何凭据的情况下成功进行身份验证。

我试图更多地了解这一点及其影响范围。像 Debian、Ubuntu 这样的操作系统是否依赖 libssh 进行 SSH,如果这样做,是否意味着每台暴露 SSH 的服务器都容易受到这种攻击?此外,OpenSSH 是否依赖于 libssh 或者它们是两个独立的实现?我尝试寻找 OpenSSH 与 libssh 但找不到我要找的东西。这个漏洞听起来像是 SSH 最坏的情况,所以我很惊讶它没有成为头条新闻或爆炸。此漏洞的摘要含糊不清,因此我正在寻找有关影响范围以及我应该担心的情况的任何见解。

3个回答

... OpenSSH 是否依赖于 libssh

OpenSSH(它是大多数系统上的标准 SSH 守护程序)不依赖于 libssh。

我试图寻找openssh vs libssh ...

实际上,对openssh libssh的搜索给了我第一击:OpenSSH/Development其中包括 libssh的以下声明“... libssh 是一个独立项目...”

此外,如果 OpenSSH 会受到影响,您可以确定您会在 OpenSSH 的官方网站上找到此类信息,该网站有明确的关于OpenSSH 安全性的页面。

像 Debian、Ubunutu 这样的操作系统是否依赖 libssh 进行 SSH ......

请参阅libssh 的官方文档了解谁在使用它(至少):KDE、GitHub...

您还可以检查您自己的操作系统上哪些可用或已安装的软件包依赖于 libssh。例如对于 Debian 和类似的(例如 Ubuntu),这将是apt rdepends libssh-4or apt rdepends --installed libssh-4

请注意,使用 libssh 并不一定意味着该产品自动易受攻击。首先,这个问题似乎只在将 libssh 用于 SSH 服务器而不是客户端时才相关。即使在服务器角色中也不一定会受到影响,例如Github 似乎没有受到影响,即使他们在服务器角色中使用 libssh。

像 Debian、Ubuntu 这样的操作系统是否依赖 libssh 进行 SSH,如果他们这样做,是否意味着每台暴露 SSH 的服务器都容易受到这种攻击?

使用 libssh 的应用程序可能会出现这些问题。正如 libssh网站上所述:“libssh 是一个 C 库,使您能够编写使用 SSH 协议的程序。” 因此,容易受到攻击的是使用 libssh 库的用户应用程序,而不是操作系统本身。以下是一些使用 libssh 的应用程序(来自 libssh网站):

  • KDE 使用 libssh 进行 sftp 文件传输
  • GitHub 使用 libssh 实现了他们的 git ssh 服务器
  • X2Go 是适用于 Linux 的远程桌面解决方案

此外,OpenSSH 是否依赖于 libssh 或者它们是两个独立的实现?

不,它没有。他们是分开的。


2018 年 10 月 18 日更新:漏洞发现者撰写的博客文章现已发布,其中包括详细解释和概念验证代码(通过 Paramiko)

链接到的博客文章解释说,该漏洞是由于数据包处理调度表中的代码(在 libssh\src\packet.c 中)执行 SSH2_MSG_USERAUTH_SUCCESS 的处理程序,即使对于服务器也是如此(即使这样的消息只应该是由客户处理)。对代码的进一步调查表明,对 libssh\src\auth.c 中消息的这种错误处理导致服务器将会话状态更改为已验证!

还提供了详细的概念验证代码,显示可以更新 python Paramiko 以发送 SSH2_MSG_USERAUTH_SUCCESS 消息代替 SSH2_MSG_USERAUTH_REQUEST 消息并利用该漏洞。

但是,博客文章还指出:

“并非所有的 libSSH 服务器都必然容易受到身份验证绕过的影响;由于身份验证绕过将内部 libSSH 状态机设置为已验证,而从未给任何已注册的身份验证回调执行机会,因此使用 libSSH 开发的维护额外自定义会话状态的服务器可能会失败如果用户在没有创建此状态的情况下通过身份验证,则可以正常运行。”

要通过命令行查看应用程序的依赖项,您可以运行以下命令:

ldd /usr/sbin/ssh

这将显示所述应用程序的任何依赖关系。执行此命令时,它不显示 libssh,这意味着 libssh 不是 OpenSSH 的一部分。