GHOST bug:有没有一种简单的方法来测试我的系统是否安全?

信息安全 glibc
2021-08-08 10:09:28

GHOST ( CVE-2015-0235 ) 刚刚弹出。如何快速检查我的系统是否安全?理想情况下使用一行 shell 命令。

根据 ZDNet 文章“你应该然后重新启动系统”。理想情况下,测试也会表明这一点......

4个回答

看来您可以从芝加哥大学下载一个工具来测试您的系统是否存在漏洞。

这不会修复或重新启动任何东西,它只会告诉您您的系统是否易受攻击。

$ wget https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c
$ gcc GHOST.c -o GHOST
$ ./GHOST
[responds vulnerable OR not vulnerable ]

在我的一台远程服务器上运行它,我得到:

user@host:~# wget https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c
--2015-01-27 22:30:46--  https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c
Resolving webshare.uchicago.edu (webshare.uchicago.edu)... 128.135.22.61
Connecting to webshare.uchicago.edu (webshare.uchicago.edu)|128.135.22.61|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1046 (1.0K) [text/x-csrc]
Saving to: `GHOST.c'

100%[============================================>] 1,046       --.-K/s   in 0s      

2015-01-27 22:30:48 (237 MB/s) - `GHOST.c' saved [1046/1046]

user@host:~# gcc GHOST.c -o GHOST
user@host:~# ./GHOST
vulnerable

该脚本的源代码类似于下一个代码块,但无论如何您都应该先检查源代码正如其他人指出的那样,如果您在不知道它的作用的情况下在互联网上任意运行代码,那么可能会发生不好的事情

/*
 * GHOST vulnerability check
 * http://www.openwall.com/lists/oss-security/2015/01/27/9
 * Usage: gcc GHOST.c -o GHOST && ./GHOST
 */ 

#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);
}

编辑:我在这里添加了一个 ansible 剧本,如果它对任何人都有用,如果你有大量系统要测试,那么 ansible 会让你快速完成。

此外,根据下面的讨论,如果您发现您的服务器易受攻击并应用了可用的补丁,强烈建议您重新启动系统

PHP单线:

php -r '$e="0";for($i=0;$i<2500;$i++){$e="0$e";gethostbyname($e); }'

Python单线:

python -c 'import socket;y="0"*50000000;socket.gethostbyname(y)'

如果那些给你segfaults(是的,一个Python segfault,一个罕见的标本)那么你很容易受到攻击。我不知道您是否认为 Python 是“开发人员工具”,但 PHP 是一个常见的程序。

如果目标设备是路由器,除了深入研究制造商规格和/或等待制造商建议和固件更新之外,我不知道您可以在其上做什么来告诉您。

aaronfay 的回答已经涵盖了确定您的底层系统是否易受攻击,但它不会检测升级后是否有程序仍在使用旧版本的 glibc 运行。也就是说,您可以在不重新启动受影响的进程的情况下进行升级,即使旧的易受攻击的库仍在使用,脚本也会报告“不易受攻击”。

这是检查是否有任何动态链接程序仍在使用旧版本的 glibc 的一种方法:

sudo lsof | grep libc- | grep DEL

如果有结果,则表明已删除的 glibc 版本正在使用中,并且使用它们的进程可能容易受到攻击。

当然,这不包括 glibc 被静态链接的情况。好(?)消息是在二进制文件中找到静态链接的 glibc 是非常罕见的,这既是因为它的大小,也是因为它带来了一些其他的烦恼和困难。如果您确实有使用静态编译的 glibc 的程序(您几乎可以肯定没有),则需要重新编译它们。

如果您有 Redhat 帐户,您可以通过此 URL访问他们的“GHOST 检测器” 。它是一个小的 shell 脚本,它会告诉你你是否glibc容易受到攻击。

Red Hat 现在回来并表示他们的检测器脚本存在缺陷。请注意,在使用 yum --security 修补漏洞时,RHEL6.6 也存在问题,因为根据https://bugzilla.redhat.com/show_bug.cgi?id=1186717已错过该漏洞