簡単な説明
- 最新の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サーバであれば最低限ロードバランサから切り離した方がいい、など)