labunix's blog

labunixのラボUnix

CVE-2015-0235(GHOST)対応について(debian wheezy)

■CVE-2015-0235(GHOST)対応について(debian wheezy)

 glibcのgethostbyname関数のバグ。

 The GHOST Vulnerability
 https://community.qualys.com/blogs/laws-of-vulnerabilities/2015/01/27/the-ghost-vulnerability

 Qualys Security Advisory CVE-2015-0235
 https://www.qualys.com/research/security-advisories/GHOST-CVE-2015-0235.txt

■glibcのバージョン 2.17と2.18の間で修正済みで、現在の本家の最新版は2014/09/07版の2.20

 The GNU C Library (glibc)
 http://www.gnu.org/software/libc/

$ w3m -dump http://www.gnu.org/software/libc/ | grep "2\.[0-9]"
The current stable version of glibc is 2.20. See the NEWS file in the glibc
2014-09-07: glibc 2.20 released.
2014-02-08: glibc 2.19 released.
2013-08-12: glibc 2.18 released.
2012-12-25: glibc 2.17 released.
2012-06-30: glibc 2.16 released.
2012-03-21: glibc 2.15 released.
2011-06-07: glibc 2.14 released.
2011-02-04: glibc 2.13 released.

■Wheezyの場合は、2011年にリリースされた2.13の派生なので影響を受ける。

$ cat /etc/*_{release,version} 2>/dev/null
7.8

$ dpkg -l | grep ^ii | grep libc6:
ii  libc6:amd64                           2.13-38+deb7u6                     amd64        Embedded GNU C Library: Shared libraries
ii  libc6:i386                            2.13-38+deb7u6                     i386         Embedded GNU C Library: Shared libraries

■Wheezy、Squeezeでは既に対応済みなので、
 libc6のアップデートで対応出来ます。

 DSA-3142-1
 https://security-tracker.debian.org/tracker/CVE-2015-0235

■「gethostbyname_r」関数でアップデートの前後を比較してみる。

$ wget -O ghost.c \
    https://gist.githubusercontent.com/koelling/ef9b2b9d0be6d6dbab63/raw/de1730049198c64eaf8f8ab015a3c8b23b63fd34/gistfile1.c

$ grep "gethostbyname\|puts" ghost.c 
  retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno);
    puts("vulnerable");
    puts("not vulnerable");
  puts("should not happen");

$ gcc ghost.c -o ghost && ./ghost
vulnerable

$ for opt in update upgrade autoremove autoclean;do sudo apt-get $opt -y -f ;done

$ ./ghost 
not vulnerable

■バージョンの確認とgethostbyname系関数の「系」は似た関数があるから。
 「gethostbyname_r」もある。

$ dpkg -l | grep ^ii | grep libc6:
ii  libc6:amd64                           2.13-38+deb7u7                     amd64        Embedded GNU C Library: Shared libraries
ii  libc6:i386                            2.13-38+deb7u7                     i386         Embedded GNU C Library: Shared libraries

$ dpkg -L libc6:{amd64,i386} | grep libc.so.6
/lib/x86_64-linux-gnu/libc.so.6
/lib/i386-linux-gnu/libc.so.6

$  strings /lib/{i386,x86_64}-linux-gnu/libc.so.6 | \
     grep gethostbyname | sort | uniq -c | sort -k 1 -nr | nl
     1	      4 gethostbyname_r
     2	      4 gethostbyname2_r
     3	      2 gethostbyname4_r
     4	      2 gethostbyname3_r
     5	      2 gethostbyname2
     6	      2 gethostbyname

■共有ライブラリの依存関係を確認。
 動的から、すぐにスタティックリンクされていて、ネストは少ない。

$ ldd /lib/{i386,x86_64}-linux-gnu/libc.so.6
/lib/i386-linux-gnu/libc.so.6:
	/lib/ld-linux.so.2 (0xf7798000)
	linux-gate.so.1 =>  (0xf7797000)
/lib/x86_64-linux-gnu/libc.so.6:
	/lib64/ld-linux-x86-64.so.2 (0x00007f549e0c6000)
	linux-vdso.so.1 =>  (0x00007fffd41ff000)

$ ldd /lib/{i386,x86_64}-linux-gnu/libc.so.6 | awk '/\/lib.*2/ {print "ldd "$1}' | sh
	statically linked
	statically linked

$ ldd -v /lib/{i386,x86_64}-linux-gnu/libc.so.6 
/lib/i386-linux-gnu/libc.so.6:
	/lib/ld-linux.so.2 (0xf779e000)
	linux-gate.so.1 =>  (0xf779d000)

	Version information:
	/lib/i386-linux-gnu/libc.so.6:
		ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
		ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
		ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
/lib/x86_64-linux-gnu/libc.so.6:
	/lib64/ld-linux-x86-64.so.2 (0x00007f905487f000)
	linux-vdso.so.1 =>  (0x00007fff5adc9000)

	Version information:
	/lib/x86_64-linux-gnu/libc.so.6:
		ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
		ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2

■共有ライブラリという名前から、様々な箇所から参照される役割のため、
 アップデート後はシステムの再起動を行うべき。。。

■CUIで構成されたシステムの場合はほとんど使われていないので、念のため程度ですが。。。

$ lsof | grep libc
bash       3469          labunix  DEL       REG    8,1           2449619 /lib/x86_64-linux-gnu/libc-2.13.so
lsof       6055          labunix  mem       REG    8,1  1603600  2449590 /lib/x86_64-linux-gnu/libc-2.13.so
grep       6056          labunix  mem       REG    8,1  1603600  2449590 /lib/x86_64-linux-gnu/libc-2.13.so
lsof       6057          labunix  mem       REG    8,1  1603600  2449590 /lib/x86_64-linux-gnu/libc-2.13.so

■GUIで構成されたシステムの場合はほぼ再起動するしかないかと。。。
 ※

$ lsof | grep libc | awk '{print $1}' | sort | uniq -c | \
    sort -k 1 -nr | awk '{sum+=$1;print}END{print "sum "sum}'
    133 gdbus
     87 dconf
     80 mozStorag
     80 Analysis
     31 threaded-
     31 gmain
     30 firefox
     30 DOM
     20 vlc
     16 gnome-set
     12 gnome-pan
     11 nautilus
     11 gnome-sou
     10 metacity
     10 localStor
     10 URL
     10 Timer
     10 Socket
     10 Proxy
     10 Net
     10 MediaMana
     10 JS
     10 ImageBrid
     10 Image
     10 IPDL
     10 Hang
     10 HTML5
     10 Gecko_IOT
     10 GMPThread
     10 Composito
     10 Cert
     10 Cache2
     10 Cache
      9 uim-toolb
      9 polkit-gn
      9 notificat
      9 gnome-ter
      9 gnome-ses
      9 gnome-scr
      9 gnome-fal
      9 bluetooth
      8 vim
      5 gsd-print
      4 pulseaudi
      4 alsa-sour
      4 alsa-sink
      3 ssh
      3 bash
      2 sort
      2 lsof
      2 gvfsd-tra
      2 gvfsd-met
      2 gvfsd
      2 gvfs-gdu-
      2 gvfs-afc-
      2 glib-pacr
      2 gconfd-2
      2 dbus-daem
      2 awk
      1 xcompmgr
      1 uniq
      1 uim-xim
      1 uim-helpe
      1 mission-c
      1 gvfsd-bur
      1 gvfs-gpho
      1 grep
      1 dconf-ser
      1 dbus-laun
      1 at-spi-bu
sum 908

■GUI構成のシステムの場合、「libc-2.13.so」のピンポイントで絞っても、
 124件あるので再起動しましょう。

$ lsof | grep libc-2.13.so | awk '{print $1}' | sort | uniq -c | \
    sort -k 1 -nr | awk '{sum+=$1;print}END{print "sum "sum}'
     17 gdbus
     10 dconf
      8 mozStorag
      8 Analysis
      4 gmain
      3 threaded-
      3 firefox
      3 bash
      3 DOM
      2 vlc
      2 sort
      2 lsof
      2 gvfs-afc-
      2 awk
      1 xcompmgr
      1 uniq
      1 uim-xim
      1 uim-toolb
      1 uim-helpe
      1 ssh
      1 pulseaudi
      1 polkit-gn
      1 notificat
      1 nautilus
      1 mission-c
      1 metacity
      1 localStor
      1 gvfsd-tra
      1 gvfsd-met
      1 gvfsd-bur
      1 gvfsd
      1 gvfs-gpho
      1 gvfs-gdu-
      1 gsd-print
      1 grep
      1 gnome-ter
      1 gnome-sou
      1 gnome-set
      1 gnome-ses
      1 gnome-scr
      1 gnome-pan
      1 gnome-fal
      1 glib-pacr
      1 gconfd-2
      1 dconf-ser
      1 dbus-laun
      1 dbus-daem
      1 bluetooth
      1 at-spi-bu
      1 alsa-sour
      1 alsa-sink
      1 URL
      1 Timer
      1 Socket
      1 Proxy
      1 Net
      1 MediaMana
      1 JS
      1 ImageBrid
      1 Image
      1 IPDL
      1 Hang
      1 HTML5
      1 Gecko_IOT
      1 GMPThread
      1 Composito
      1 Cert
      1 Cache2
      1 Cache
sum 124