LoginSignup
8
8

More than 5 years have passed since last update.

Ghost脆弱性対策

Last updated at Posted at 2015-02-11

簡単な説明

  • 最新のglibcを搭載したLinuxの新しいOSは、この脆弱性の影響を受けない
  • glibc 2.2 から 2.17 までのバージョン:要対策
  • Amazon Linux (glibc-static-2.17-55.87.amzn1)は未対策
  • Amazon Linux (glibc-static-2.17-55.93.amzn1)は対策済み

▼参考記事
http://blog.trendmicro.co.jp/archives/10818
http://blog.serverworks.co.jp/tech/2015/01/28/glibc_ghost/

対策の流れ

1. glibcバージョン確認

$ yum list installed | grep glibc

glibc.x86_64                         2.17-55.87.amzn1             @amzn-main
glibc-common.x86_64                  2.17-55.87.amzn1             @amzn-main
glibc-devel.x86_64                   2.17-55.87.amzn1             @amzn-main
glibc-headers.x86_64                 2.17-55.87.amzn1             @amzn-main

バージョン2.17-55.87は要対策。
なお、updateによりタイムゾーンが書き換わる恐れがあるため、事前に「タイムゾーンの確認」をしておくと安全。

$ cat /etc/localtime
TZif2UTCTZif2UTC
UTC0

$ cat /etc/sysconfig/clock
ZONE="UTC"
UTC=true

2. glibcアップデート

$ yum clean all
$ sudo yum -y update glibc
  • yum clean allにより事前にキャッシュ削除する
  • update後は、「glibcバージョン確認」&「タイムゾーン確認」
$ yum list installed | grep glibc

glibc.x86_64                         2.17-55.93.amzn1             @amzn-updates
glibc-common.x86_64                  2.17-55.93.amzn1             @amzn-updates
glibc-devel.x86_64                   2.17-55.93.amzn1             @amzn-updates
glibc-headers.x86_64                 2.17-55.93.amzn1             @amzn-updates

$ cat /etc/localtime
TZif2UTCTZif2UTC
UTC0

$ cat /etc/sysconfig/clock
ZONE="UTC"
UTC=true
  • バージョンは上がっている。タイムゾーンは変化なし。

3. 脆弱性チェック

  • 3-1. 脆弱性チェックプログラム作成
    • ファイル名:GHOST.c
  • 3-2. コンパイル
  • 3-3. 実行

3-1. 脆弱性チェックプログラム作成

cat > GHOST.c << EOF
#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);
}
EOF

3-2. コンパイル

gcc GHOST.c -o GHOST

3-3. 実行

./GHOST
  • 実行結果がnot vulnerable → 脆弱性対策済
  • 実行結果がvulnerable → 要対策

※「glibcアップデート後、インスタンスの再起動を必ずすること」と色々なサイトに載っているが、上記プログラムの実行結果を見ると、再起動しなくても脆弱性対策がなされることが確認できた。

※OSの再起動をする際は、他に影響がないか事前に調べて行いましょう。
(例えばwebサーバであれば最低限ロードバランサから切り離した方がいい、など)

8
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8