免责声明

免责声明

是否幽灵漏洞需要访问(如作为登录用户)受影响的操作系统?有人可以澄清“能够进行应用程序调用的远程攻击者”吗?我似乎只找到直接在本地系统上运行的测试,而不是从远程主机运行的测试。

到目前为止我收集到的所有关于幽灵漏洞来自多个来源(归功于这些来源)我已在下面发布答案以防其他人好奇。

编辑,我找到了我的回答:

在代码审计期间,Qualys 研究人员发现 glibc 的 __nss_hostname_digits_dots() 函数存在缓冲区溢出。可以触发此错误本地和远程通过所有 gethostbyname*() 函数。应用程序主要通过 gethostbyname*() 函数集访问 DNS 解析器。这些函数将主机名转换为 IP 地址。

答案1

回答我的问题,来自夸利斯:

在测试过程中,我们开发了一个概念验证,其中我们将专门创建的电子邮件发送到邮件服务器,并可以获得 Linux 计算机的远程 shell。这绕过了所有现有的保护(如 ASLR、PIE 和 NX)在 32 位和 64 位系统上。


我为其他人整理了以下研究:


免责声明

尽管很多其他线程/博客可能会告诉你什么,但我建议不是在没有彻底测试这些更新的情况下立即盲目更新您拥有的每个操作系统glibc。据报道,glibc 更新导致了大量应用程序段错误,迫使人们将 glibc 更新回滚到之前的版本。

人们不会在没有测试的情况下简单地大规模更新生产环境。


背景资料

GHOST 是一个“缓冲区溢出”错误,影响 glibc 库中的 gethostbyname() 和 gethostbyname2() 函数调用。此漏洞允许能够对这些函数进行应用程序调用的远程攻击者,以运行该应用程序的用户的权限执行任意代码。

影响

gethostbyname() 函数调用用于 DNS 解析,这是一个非常常见的事件。要利用此漏洞,攻击者必须通过向执行 DNS 解析的应用程序提供无效的主机名参数来触发缓冲区溢出。

当前受影响的 Linux 发行版列表

RHEL(红帽企业 Linux)版本 5.x、6.x 和 7.x

RHEL 4 ELS              fix available ---> glibc-2.3.4-2.57.el4.2
Desktop (v. 5)          fix available ---> glibc-2.5-123.el5_11.1
Desktop (v. 6)          fix available ---> glibc-2.12-1.149.el6_6.5
Desktop (v. 7)          fix available ---> glibc-2.17-55.el7_0.5
HPC Node (v. 6)         fix available ---> glibc-2.12-1.149.el6_6.5
HPC Node (v. 7)         fix available ---> glibc-2.17-55.el7_0.5
Server (v. 5)           fix available ---> glibc-2.5-123.el5_11.1
Server (v. 6)           fix available ---> glibc-2.12-1.149.el6_6.5
Server (v. 7)           fix available ---> glibc-2.17-55.el7_0.5
Server EUS (v. 6.6.z)   fix available ---> glibc-2.12-1.149.el6_6.5
Workstation (v. 6)      fix available ---> glibc-2.12-1.149.el6_6.5
Workstation (v. 7)      fix available ---> glibc-2.17-55.el7_0.5

CentOS Linux 版本 5.x、6.x 和 7.x

CentOS-5    fix available ---> glibc-2.5-123.el5_11
CentOS-6    fix available ---> glibc-2.12-1.149.el6_6.5
CentOS-7    fix available ---> glibc-2.17-55.el7_0.5

Ubuntu Linux 版本 10.04、12.04 LTS

10.04 LTS   fix available ---> libc6-2.11.1-0ubuntu7.20
12.04 LTS   fix available ---> libc6-2.15-0ubuntu10.10

Debian Linux 版本 6.x、7.x

6.x squeeze              vulnerable
6.x squeeze (LTS)        fix available ---> eglibc-2.11.3-4+deb6u4
7.x wheezy               vulnerable
7.x wheezy (security)    fix available ---> glib-2.13-38+deb7u7

Linux Mint 版本 13.0

Mint 13    fix available ---> libc6-2.15-0ubuntu10.10

Fedora Linux 版本 19(或更早版本应升级)

Fedora 19 - vulnerable - EOL on Jan 6, 2014 (upgrade to Fedora 20/21 for patch)

SUSE Linux 企业版

Server 10 SP4 LTSS for x86                    fix available ---> glibc-2.4-31.113.3
Server 10 SP4 LTSS for AMD64 and Intel EM64T  fix available ---> glibc-2.4-31.113.3
Server 10 SP4 LTSS for IBM zSeries 64bit      fix available ---> glibc-2.4-31.113.3
Software Development Kit 11 SP3               fix available ---> glibc-2.11.3-17.74.13
Server 11 SP1 LTSS                            fix available ---> glibc-2.11.1-0.60.1
Server 11 SP2 LTSS                            fix available ---> glibc-2.11.3-17.45.55.5
Server 11 SP3 (VMware)                        fix available ---> glibc-2.11.3-17.74.13
Server 11 SP3                                 fix available ---> glibc-2.11.3-17.74.13
Desktop 11 SP3                                fix available ---> glibc-2.11.3-17.74.13

openSUSE(早于 11 的版本应升级)

11.4 Evergreen     fix available ---> glibc-2.11.3-12.66.1
12.3               fix available ---> glibc-2.17-4.17.1


哪些软件包/应用程序仍在使用已删除的 glibc?

归功于吉尔斯

对于 CentOS/RHEL/Fedora/Scientific Linux:

   lsof -o / | awk '
   BEGIN {
       while (("rpm -ql glibc | grep \\\\.so\\$" | getline) > 0)
           libs[$0] = 1
   }
   $4 == "DEL" && $8 in libs {print $1, $2}'

对于 Ubuntu/Debian Linux:

   lsof -o / | awk '
   BEGIN {
       while (("dpkg -L libc6:amd64 | grep \\\\.so\\$" | getline) > 0)
           libs[$0] = 1
   }
   $4 == "DEL" && $8 in libs {print $1, $2}'

我的 Linux 系统使用哪个 C 库 (glibc) 版本?

检查版本号的最简单方法是运行以下命令:

ldd --version

RHEL/CentOS Linux v6.6 的输出示例:

ldd (GNU libc) 2.12
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

Ubuntu Linux 12.04.5 LTS 的输出示例:

ldd (Ubuntu EGLIBC 2.15-0ubuntu10.9) 2.15
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

Debian Linux v7.8 的输出示例:

ldd (Debian EGLIBC 2.13-38+deb7u6) 2.13
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

GHOST漏洞检查

芝加哥大学托管以下脚本以方便下载:

$ wget https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c
[OR]
$ curl -O https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c
$ gcc GHOST.c -o GHOST
$ ./GHOST
[responds vulnerable OR not vulnerable ]
/* ghosttest.c:  GHOST vulnerability tester */
/* Credit: http://www.openwall.com/lists/oss-security/2015/01/27/9 */
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define CANARY "in_the_coal_mine"

struct {
  char buffer[1024];
  char canary[sizeof(CANARY)];
} temp = { "buffer", CANARY };

int main(void) {
  struct hostent resbuf;
  struct hostent *result;
  int herrno;
  int retval;

  /*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/
  size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;
  char name[sizeof(temp.buffer)];
  memset(name, '0', len);
  name[len] = '\0';

  retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno);

  if (strcmp(temp.canary, CANARY) != 0) {
    puts("vulnerable");
    exit(EXIT_SUCCESS);
  }
  if (retval == ERANGE) {
    puts("not vulnerable");
    exit(EXIT_SUCCESS);
  }
  puts("should not happen");
  exit(EXIT_FAILURE);
}

编译并运行如下:

$ gcc ghosttester.c -o ghosttester
$ ./ghosttester
[responds vulnerable OR not vulnerable ]

Red Hat Access Lab:GHOST 工具不要使用该工具,它的报告是错误的,Qualys 的漏洞检查器是准确的。


打补丁


CentOS/RHEL/Fedora/Scientific Linux

sudo yum clean all
sudo yum update

现在重启生效:

sudo reboot

或者,如果您的镜像不包含最新的软件包,只需手动下载它们。 *注:对于更高级的用户

CentOS 5

http://mirror.centos.org/centos/5.11/updates/x86_64/RPMS/

操作系统6

mkdir ~/ghostupdate
cd ~/ghostupdate

wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-devel-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-common-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/nscd-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-static-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-headers-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-utils-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-static-2.12-1.149.el6_6.5.i686.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-devel-2.12-1.149.el6_6.5.i686.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-2.12-1.149.el6_6.5.i686.rpm

yum localupdate *.rpm [OR] rpm -Uvh *.rpm

Ubuntu/Debian Linux

sudo apt-get clean
sudo apt-get update
sudo apt-get dist-upgrade

重新开始:

sudo reboot

SUSE Linux 企业版

要安装此 SUSE 安全更新,请使用 YaST online_update。或者根据您的版本使用以下命令:

SUSE Linux 企业软件开发套件 11 SP3

zypper in -t patch sdksp3-glibc-10206

适用于 VMware 的 SUSE Linux Enterprise Server 11 SP3

zypper in -t patch slessp3-glibc-10206

SUSE Linux 企业服务器 11 SP3

zypper in -t patch slessp3-glibc-10206

SUSE Linux 企业服务器 11 SP2 LTSS

zypper in -t patch slessp2-glibc-10204

SUSE Linux 企业服务器 11 SP1 LTSS

zypper in -t patch slessp1-glibc-10202

SUSE Linux 企业桌面 11 SP3

zypper in -t patch sledsp3-glibc-10206

最后运行所有 SUSE linux 版本以使您的系统保持最新状态:

zypper patch

开放SUSE Linux

要查看 OpenSUSE Linux 上的可用更新(包括 glibc)列表,请输入:

zypper lu

要使用较新的可用版本简单地更新已安装的 glibc 软件包,请运行:

zypper up

几乎您机器上运行的每个程序都使用 glibc。您需要重新启动每个使用 glibc 的服务或应用程序以确保补丁生效。因此,建议重新启动。


如何在不重启也不影响系统的情况下重新启动init?

telinit u

' man telinit ' -- U 或 u 请求 init(8) 守护进程重新执行自身。不建议这样做,因为 Upstart 目前无法保留其状态,但在升级系统库时这是必要的。


为了立即减轻威胁有限的方式是在所有面向公众的服务中禁用反向 DNS 检查。例如,您可以UseDNS通过no/etc/ssh/sshd_config.

来源(和更多信息):

  1. https://access.redhat.com/articles/1332213
  2. http://www.cyberciti.biz/faq/cve-2015-0235-patch-ghost-on-debian-ubuntu-fedora-centos-rhel-linux/
  3. http://www.openwall.com/lists/oss-security/2015/01/27/9
  4. https://security.stackexchange.com/questions/80210/ghost-bug-is-there-a-simple-way-to-test-if-my-system-is-secure
  5. http://bobcares.com/blog/ghost-hunting-resolving-glibc-remote-code-execution-vulnerability-cve-2015-0235-in-centos-red-hat-ubuntu-debian-and-suse-linux-服务器
  6. https://community.qualys.com/blogs/laws-of-vulnerability/2015/01/27/the-ghost-vulnerability
  7. https://security-tracker.debian.org/tracker/CVE-2015-0235

相关内容