EOSなRHEL4/CentOS4で、glibcの脆弱性対策

改定履歴

  • 2015/01/31 PM
    初回投稿

glibcライブラリのバッファオーバーフローの脆弱性(CVE-2015-0235)対策のお話。

Bashの脆弱性のときみたいに、延長サポートには契約してないけど、いろんな事情で稼働しているRHEL4と、サポートが終了しているCentOS4に絞って書いていきます。(といっても今回は時間の都合でRHEL4の手順は検証してませんが…まぁ一緒でしょ、多分(ぁ)

例のごとく、ググればOracle Linux 4の脆弱性対策版Source RPMとか、独自に配布されている方などがあって、そちらを拾ってきてリビルドするほうが確実で簡単だと思います。
ここではあえて、RHEL4またはCentOS4のSource RPMを拾ってきて、Upstream Patchを加工して適用する方法を書いていく感じで。

なお、いつものことですが、内容に関して一切保証することができませんし、利用した結果生じた損害についても一切責任を負いません。
本内容を利用する場合は、自己責任で行う必要がありますので、予めご了承ください。
 

#—– 検証環境 —–#

[root@ghost4 ~]# cat /etc/redhat-release
CentOS release 4.9 (Final)

[root@ghost4 ~]# uname -a
Linux ghost4.lunatilia.net 2.6.9-103.EL #1 Fri Dec 9 04:14:04 EST 2011 i686 i686 i386 GNU/Linux

[root@ghost4 ~]# rpm -qa | grep -e glibc -e nscd
glibc-2.3.4-2.57
nscd-2.3.4-2.57
glibc-kernheaders-2.4-9.1.103.EL
glibc-common-2.3.4-2.57
glibc-headers-2.3.4-2.57
glibc-devel-2.3.4-2.57

 

#—– 前提条件 —–#

  • なんらかの手段でSource RPMを取得できる環境であること
  • gcc、rpm-buildがインストールされていること
  • gd-devel、libpng-devel、zlib-devel、texinfo、libselinux-devel audit-libs-devel、libcap-develがインストールされていること(glibcの依存関係のため)
  • wget、curlなどがあれば、ちょっとは楽かもね、的な

 

#—– 適用手順 —–#

  1. Source RPMを拾ってくる
    [root@ghost4 ~]# cd /tmp
    
    ## CentOS 4の場合
    [root@ghost4 tmp]# wget http://vault.centos.org/4.9/updates/SRPMS/glibc-2.3.4-2.57.src.rpm
    
    ## Red Hat Enterprise Linux 4の場合はこちらかな、と。確認してませんけど。
    [root@ghost4 tmp]# wget http://ftp.redhat.com/redhat/linux/updates/enterprise/4ES/en/os/SRPMS/glibc-2.3.4-2.57.src.rpm
    
    [root@ghost4 tmp]# ls -al
    合計 14632
    drwxrwxrwt   4 root root     4096 1月 31日 22:04 .
    drwxr-xr-x  23 root root     4096 1月 31日 21:59 ..
    drwxrwxrwt   2 root root     4096 1月 31日 21:59 .ICE-unix
    drwxrwxrwt   2 root root     4096 1月 31日 21:59 .font-unix
    -rw-r--r--   1 root root 14934274 2月 13日  2012 glibc-2.3.4-2.57.src.rpm
    
  2. glibc-2.3.4-2.57.src.rpmをインストールする
    [root@ghost4 ~]# cd /tmp
    [root@ghost4 tmp]# rpm -ivh glibc-2.3.4-2.57.src.rpm
    
    # 下記のような警告が出ますが、"/usr/src/redhat/SOURCES" 配下に関連ファイルがあれば、インストールはできているかなと。
    #     warning: user mockbuild does not exist - using root
    #     warning: group mockbuild does not exist - using root
    
  3. Upstream Patchを入手して加工する
    ここでは、glibcのUpstream Patchを何らかの方法で入手したのちに加工して、 “/usr/src/redhat/SOURCES/glibc-cve-2015-0235.patch” として保存します。
    加工内容はとりあえず下記のような感じ。

    [root@ghost4 SOURCES]# diff glibc-upstream-patch.patch glibc-cve-2015-0235.patch
    1,60d0
    < From d5dd6189d506068ed11c8bfa1e1e9bffde04decd Mon Sep 17 00:00:00 2001
    < From: Andreas Schwab <schwab@suse.de>
    < Date: Mon, 21 Jan 2013 17:41:28 +0100
    < Subject: [PATCH] Fix parsing of numeric hosts in gethostbyname_r
    <
    < ---
    <  ChangeLog              |   14 +++++++++
    <  NEWS                   |   12 ++++----
    <  nss/Makefile           |    2 +-
    <  nss/digits_dots.c      |   73 +++++++++++++----------------------------------
    <  nss/getXXbyYY_r.c      |    5 ++-
    <  nss/test-digits-dots.c |   38 +++++++++++++++++++++++++
    <  6 files changed, 83 insertions(+), 61 deletions(-)
    <  create mode 100644 nss/test-digits-dots.c
    <
    < diff --git a/ChangeLog b/ChangeLog
    < index c3b5401..61377cc 100644
    < --- a/ChangeLog
    < +++ b/ChangeLog
    < @@ -1,3 +1,17 @@
    < +2013-05-21  Andreas Schwab  <schwab@suse.de>
    < +
    < +     [BZ #15014]
    < +     * nss/getXXbyYY_r.c (INTERNAL (REENTRANT_NAME))
    < +     [HANDLE_DIGITS_DOTS]: Set any_service when digits-dots parsing was
    < +     successful.
    < +     * nss/digits_dots.c (__nss_hostname_digits_dots): Remove
    < +     redundant variable declarations and reallocation of buffer when
    < +     parsing as IPv6 address.  Always set NSS status when called from
    < +     reentrant functions.  Use NETDB_INTERNAL instead of TRY_AGAIN when
    < +     buffer too small.  Correct computation of needed size.
    < +     * nss/Makefile (tests): Add test-digits-dots.
    < +     * nss/test-digits-dots.c: New test.
    < +
    <  2013-05-21  Siddhesh Poyarekar  <siddhesh@redhat.com>
    <
    <       * benchtests/Makefile: Remove instructions for adding
    < diff --git a/NEWS b/NEWS
    < index b6efba4..420c31e 100644
    < --- a/NEWS
    < +++ b/NEWS
    < @@ -13,12 +13,12 @@ Version 2.18
    <    12723, 13550, 13889, 13951, 13988, 14142, 14176, 14200, 14280, 14293,
    <    14317, 14327, 14478, 14496, 14582, 14686, 14812, 14888, 14908, 14920,
    <    14952, 14964, 14981, 14982, 14985, 14994, 14996, 15000, 15003, 15006,
    < -  15007, 15020, 15023, 15036, 15054, 15055, 15062, 15078, 15084, 15085,
    < -  15086, 15160, 15214, 15221, 15232, 15234, 15283, 15285, 15287, 15304,
    < -  15305, 15307, 15309, 15327, 15330, 15335, 15336, 15337, 15342, 15346,
    < -  15359, 15361, 15366, 15380, 15394, 15395, 15405, 15406, 15409, 15416,
    < -  15418, 15419, 15423, 15424, 15426, 15429, 15442, 15448, 15480, 15485,
    < -  15488, 15490, 15493, 15497.
    < +  15007, 15014, 15020, 15023, 15036, 15054, 15055, 15062, 15078, 15084,
    < +  15085, 15086, 15160, 15214, 15221, 15232, 15234, 15283, 15285, 15287,
    < +  15304, 15305, 15307, 15309, 15327, 15330, 15335, 15336, 15337, 15342,
    < +  15346, 15359, 15361, 15366, 15380, 15394, 15395, 15405, 15406, 15409,
    < +  15416, 15418, 15419, 15423, 15424, 15426, 15429, 15442, 15448, 15480,
    < +  15485, 15488, 15490, 15493, 15497.
    <
    <  * CVE-2013-0242 Buffer overrun in regexp matcher has been fixed (Bugzilla
    <    #15078).
    69,70c9,10
    < -tests                        = test-netdb tst-nss-test1
    < +tests                        = test-netdb tst-nss-test1 test-digits-dots
    ---
    > -tests                        = test-netdb
    > +tests                        = test-netdb test-digits-dots
    234,242d173
    < @@ -288,7 +291,7 @@ done:
    <      /* Either we failed to lookup the functions or the functions themselves
    <         had a system error.  Set NETDB_INTERNAL here to let the caller know
    <         that the errno may have the real reason for failure.  */
    < -      *h_errnop = NETDB_INTERNAL;
    < +    *h_errnop = NETDB_INTERNAL;
    <    else if (status != NSS_STATUS_SUCCESS && !any_service)
    <      /* We were not able to use any service.  */
    <      *h_errnop = NO_RECOVERY;
    287,288d217
    < --
    < 1.7.1
    
  4. specファイルを変更する(変更内容のみ)
    [root@ghost4 SPECS]# diff glibc.spec.orig glibc.spec
    17c17
    < Release: %{glibcrelease}
    ---
    > Release: %{glibcrelease}.1.ln
    315a316
    > Patch1000: glibc-cve-2015-0235.patch
    840a842
    > %patch1000 -p1
    
  5. Source RPMとRPMをビルドする
    [root@ghost4 SPECS]# cd /usr/src/redhat
    [root@ghost4 redhat]# rpmbuild -ba SPECS/glibc.spec
    
  6. できたRPMをインストールする
    [root@ghost4 redhat]# cd SRPMS/i386
    [root@ghost4 i386]# ls -al
    合計 33032
    drwxr-xr-x  2 root root     4096 1月 31日 23:03 .
    drwxr-xr-x  8 root root     4096 1月 31日 21:57 ..
    -rw-r--r--  1 root root 12086247 1月 31日 23:03 glibc-2.3.4-2.57.1.ln.i386.rpm
    -rw-r--r--  1 root root 16552681 1月 31日 23:03 glibc-common-2.3.4-2.57.1.ln.i386.rpm
    -rw-r--r--  1 root root  2026683 1月 31日 23:03 glibc-devel-2.3.4-2.57.1.ln.i386.rpm
    -rw-r--r--  1 root root   604558 1月 31日 23:03 glibc-headers-2.3.4-2.57.1.ln.i386.rpm
    -rw-r--r--  1 root root  1127242 1月 31日 23:03 glibc-profile-2.3.4-2.57.1.ln.i386.rpm
    -rw-r--r--  1 root root   136832 1月 31日 23:03 glibc-utils-2.3.4-2.57.1.ln.i386.rpm
    -rw-r--r--  1 root root   916982 1月 31日 23:03 nptl-devel-2.3.4-2.57.1.ln.i386.rpm
    -rw-r--r--  1 root root   289754 1月 31日 23:03 nscd-2.3.4-2.57.1.ln.i386.rpm
    
    ## 私の即席環境の場合、下記の5パッケージをインストールしました。
    [root@ghost4 i386]# rpm -Uvh glibc-2.3.4-2.57.1.ln.i386.rpm glibc-common-2.3.4-2.57.1.ln.i386.rpm glibc-devel-2.3.4-2.57..1.ln.i386.rpm glibc-headers-2.3.4-2.57.1.ln.i386.rpm nscd-2.3.4-2.57.1.ln.i386.rpm
    
  7. 確認
    正常にインストールされたら、再起動をして確認します。

    [root@ghost4 tmp]# rpm -qa | grep -e glibc -e nscd
    glibc-kernheaders-2.4-9.1.103.EL
    glibc-headers-2.3.4-2.57.1.ln
    glibc-2.3.4-2.57.1.ln
    glibc-devel-2.3.4-2.57.1.ln
    glibc-common-2.3.4-2.57.1.ln
    nscd-2.3.4-2.57.1.ln
    

 

#—– 比較検証 —–#

こちらのプログラムを使用します。

  • パッチ適用前
    [root@ghost4 tmp]# gcc -o ghost ghost.c
    [root@ghost4 tmp]# ./ghost
    vulnerable
    
  • パッチ適用後
    [root@ghost4 tmp]# ./ghost
    not vulnerable
    

とまぁ、こんな感じ。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中