人们可以合理地得出结论(见下文),需要进行一些详细的分析来确定任意软件包是否易受攻击,以及可能适用的配置或缓解措施。任何执行名称解析的服务都可能存在风险(补丁,并且是安全的!)。
Qualys 已经提供了一份使用他们目前无法利用的受影响功能的软件列表:
apache、cups、dovecot、gnupg、isc-dhcp、lighttpd、mariadb/mysql、nfs-utils、nginx、nodejs、openldap、openssh、postfix、proftpd、pure-ftpd、rsyslog、samba、sendmail、sysklogd、syslog-ng、 tcp_wrappers、vsftpd、xinetd。
目前,只有 Exim 被证实可以利用。
CVE 详细信息站点跟踪漏洞的供应商详细信息,它还没有启动,但它应该很快就会出现在这里完全完成,你可以在这里找到它:http ://www.cvedetails.com/cve/CVE-2015-0235/
(例如,参见最近的Shellshock CVE-2014-7169页面)。oss-sec电子邮件列表是跟踪突发新闻的好方法。
Qualys POC ( GHOST.c
) 仅表明 glibc 受到影响,应该加速该过程的是 Qualys 即将承诺的 Metasploit 模块(尽管我怀疑会有其他人争先恐后地开发模块)。
(我不购买链接到的 OpenSSH“缓解”,UseDNS
会导致反向查找 TCP 连接的 IP 地址,这当然无法被攻击者充分控制。我会在有机会时更新它验证所采取的步骤。OpenSSH 或 OpenSSH+libwrap 中的反向 DNS 不可利用。)
最初的咨询相当长,预计观众对 libc 和 C 编程的了解会比通过知识更好。通过解释各种复杂性,大量篇幅专门用于不易受攻击的代码和程序。这里的“宣传页”比较容易理解,包含了时下必备的漏洞图。
由于常见的编程习惯以及易受攻击代码的特定代码路径,许多程序并不容易受到攻击。需要明确的是,在 glibc(<2.18) 中存在影响少数 DNS 相关函数的问题,并且 DNS 是将攻击者控制的数据导入系统的好方法,尽管它不是获取任意数据的好方法。但是,与最近的一些高调问题不同,简单地使用库或使用这些函数不会自动使程序易受攻击。
也就是说,这是一个新公开的问题,可能会找到其他触发问题的方法,没有理由推迟补丁。有问题的gethostbyname*
函数被认为是“过时的”,因为它们不支持 IPv6 符号并且已被支持的函数取代,但它们非常普遍。
这种对漏洞的重要利用在咨询中进行了详细说明,以第 4.2 节中的(不可利用)为例:大多数发行版上的 setuid-root 二进制文件,因此是本地特权升级mount.nfs
的好机会:
同样,mount.nfs(一个 SUID 根二进制文件)也不容易受到攻击:
if (inet_aton(hostname, &addr->sin_addr))
return 0;
if ((hp = gethostbyname(hostname)) == NULL) {
nfs_error(_("%s: can't get address for %s\n"),
progname, hostname);
return -1;
}
inet_aton()
上面的before try的调用模式gethostbyname()
就是上面提到的常用习语。给定 in 中的任意字符串hostname
,首先检查它是否可以被视为有效的 IP dotted-quad via inet_aton()
(便宜且低延迟),否则查看它是否是 DNS 主机名 via gethostbyname()
(不便宜,并且可能是高-延迟。请参阅第3 节 - 建议的缓解因素。
这也是 OpenSSH 使用这些功能的方式,请参阅getaddrinfo()
. openbsd-compat/fake-rfc25553.c
该功能仅在主机没有本机getaddrinfo()
(或者您捏造configure
以欺骗它)时才在编译时启用。glibc 自 1996 年(pre v2.0)以来就具有该功能,因此gethostbyname()
不会被 OpenSSH 调用。
如果您的 OpenSSH 是使用 构建的libwrap
,那么sshd
二进制文件将因此具有一些符号依赖gethostbyname*
项—— Qualys 声称 TCP 包装器和 OpenSSH 都是安全的(目前)。OpenSSH 中唯一的其他用途gethostbyname()
是在 HP-UX 特定代码中,其中 XDISPLAY
需要包含 IP 而不是主机名,此处不相关。
在一般情况下,由于符合标准的 DNS 数据不能包含有问题的长/格式错误的 IP 地址,因此反向查找和正向/反向检查不是攻击向量。如果主机名/点分四组地址是更高协议的一部分(例如 SMTP EHLO 名称,用于利用 Exim),那么您可能会有一些东西。对于 OpenSSH,这将建议端口转发中的主机名。关闭,但没有雪茄,即使 OpenSSH 确实gethostbyname()
直接使用:
if (strlen(host) >= NI_MAXHOST) {
error("Forward host name too long.");
return 0;
}
NI_MAXHOST
到目前为止我检查过的版本中的 1025 在哪里。无论如何,这将是一个不太严重的身份验证后攻击向量。