web-dev-qa-db-ja.com

GHOSTバグ:システムが安全かどうかをテストする簡単な方法はありますか?

[〜#〜] ghost [〜#〜]CVE-2015-0235 )がポップアップされました。私のシステムが安全かどうかをどうやってすばやく確認できますか?理想的には、1行のシェルコマンドを使用します。

ZDNetの記事によると、「システムを再起動する必要があります」。理想的には、テストもこれを示します...

61
kqw

システムの脆弱性をテストできるツールを シカゴ大学 からダウンロードできるようです。

これは何も修復または再起動しませんシステムが脆弱かどうかを通知するだけです。

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

私が取得する私のリモートサーバーの1つでこれを実行すると:

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

このスクリプトのソースコードは次のコードブロックのようになりますとにかく最初にOriginコードを検査する必要があります他の人が指摘したように、何をしているのかわからずにインターネットから任意にコードを実行している場合、悪いことが発生する可能性があります

/*
 * 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プレイブックを追加しました here 誰でも使える場合、テストするシステムが多数ある場合、ansibleはあなたはそれを迅速に行う。

また、以下の説明に従って、サーバーに脆弱性があり、利用可能なパッチを適用している場合は、システムを再起動することを強くお勧めしますです。

71
aaronfay

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を与える場合(そう、a Python segfault、珍しい標本)、あなたは脆弱です。あなたがPython aを検討するかどうかわかりません"開発者ツール" PHPは一般的なプログラムです。

ターゲットデバイスがルーターの場合、製造元の仕様を調べたり、製造元からのアドバイスやファームウェアの更新を待ったりすることを除いて、その上で何ができるかわかりません。

15
Ohnana

aaronfayの回答は、基盤となるシステムが脆弱であるかどうかの判断をすでにカバーしていますが、アップグレード後も古いバージョンのglibcを使用して実行されているプログラムがあるかどうかは検出しません。つまり、影響を受けるプロセスを再起動せずにアップグレードでき、古い脆弱なライブラリがまだ使用されている場合でも、スクリプトは「脆弱ではない」と報告します。

古いバージョンのglibcをまだ使用している動的にリンクされたプログラムがあるかどうかを確認する1つの方法は次のとおりです。

Sudo lsof | grep libc- | grep DEL

結果がある場合、glibcの削除されたバージョンが使用されており、それらを使用するプロセスが脆弱である可能性があります。

もちろん、これはglibcが静的にリンクされたケースをカバーしていません。良い(?)ニュースは、サイズと他の不快さと困難の両方のため、バイナリで静的にリンクされたglibcを見つけることは非常にまれです。 doが静的にコンパイルされたglibcを使用するプログラムを持っている場合(ほとんどの場合そうではありません)、それらを再コンパイルする必要があります。

9
Chris Down