Linuxを利用している環境は多いと思います。クラウドやVPSなどでも手軽に利用できることから、以前より多くの環境に導入されています。そんなLinuxですが、今月に入り、大きなセキュリティホールが重要なライブラリであるglibcに見つかりました(CVE-2015-7547)。
対処レベルが「緊急」の為、早速、自社のサーバーに対して対応を行いました。まだ対応を行っていないサーバーも多いかと思いますので、glibcの脆弱性 CVE-2015-7547への具体的な対応方法を紹介していきます。
1. 脆弱性の内容
脆弱性の内容は詳細はJPCERTのCVE-2015-7547に関するページ
によると
glibc ライブラリにはバッファオーバーフローの脆弱性 (CVE-2015-7547) があります。本脆弱性を使用された場合、遠隔の第三者によって、任意のコードを実行されたり、サービス運用妨害 (DoS) 攻撃が行われたりするなどの可能性があります
とのこと。
遠隔の第三者によって、任意のコードが実行されるという内容から、かなり危険な脆弱性と分かります。
脆弱性の対象となるglibcのバージョンは、2.9 から 2.22 まで。脆弱性の詳細については、JVNのサイト
に詳しく記載されていますが、ここ最近のLinuxディストリビューション殆どが合致しています。
具体的には、以下のディストリビューションとバージョンが脆弱性をもつglibcを利用しており、脆弱性に合致するようです。
- Red Hat Enterprise Linux Server EUS (v. 6.6)
- Red Hat Enterprise Linux Server AUS (v. 6.5)
- Red Hat Enterprise Linux Server AUS (v. 6.4)
- Red Hat Enterprise Linux Server AUS (v. 6.2)
- Red Hat Enterprise Linux Server EUS (v. 7.1)
- Red Hat Enterprise Linux version 6
- Red Hat Enterprise Linux version 7
CentOS
- CentOS version 6
- CentOS version 7
Debian
- squeeze
- wheezy
- jessie
Ubuntu
- Ubuntu 15.10
- Ubuntu 14.04 LTS
- Ubuntu 12.04 LTS
本記事では、CentOSのversion 6/7を利用している環境を前提として、手順を記載していきます。
Redhatでもほぼ、同様の手順で対応が可能ですので、参考にして頂ければ幸いです。
2. 対応したglibcのバージョン
CentOSのフォーラム
を見ると、CentOSで脆弱性 CVE-2015-7547へ対応するためには、glibc-2.12-1.166.el6_7.7.x86_64の適用が必要になるようです。(x84_64はOSが64bitの場合。)
3. glibcのバージョンアップ
ターゲットとなるバージョンが分かったところで、バージョンアップの具体的な手順について記載していきます。
CentOS、Redhatの場合、yumコマンドで実行します。yumコマンドでのアップデートはインターネットへ
接続している環境が前提となります。ここではyumコマンドが利用できる前提で進めていきます。
(Redhatは有償のディストリビューションのため、Redhat Networkの登録が行われていないと、yumコマンドが利用できません。
「redhat networkをRHN ClassicからRed Hat Subscription Managementへ変更する」
を参考に、redhat networkへ登録を行って下さい。)
3-1. 現バージョンの確認
まず、現状のglibcパッケージのバージョン確認を行います。パッケージのバージョン確認はyumコマンド、もしくはrpmコマンドにて行います。
rpmコマンドの場合
$ rpm -qa | grep glibc
glibc-2.12-1.166.el6_7.3.x86_64
glibc-headers-2.12-1.166.el6_7.3.x86_64
glibc-common-2.12-1.166.el6_7.3.x86_64
glibc-devel-2.12-1.166.el6_7.3.x86_64
yumコマンドの場合
$ yum list installed | grep glibc
glibc.x86_64 2.12-1.166.el6_7.3 @updates
glibc-common.x86_64 2.12-1.166.el6_7.3 @updates
glibc-devel.x86_64 2.12-1.166.el6_7.3 @updates
glibc-headers.x86_64 2.12-1.166.el6_7.3 @updates
上記の場合、glibcが名前に含まれるパッケージがシステムに4つインストールされており、全てのバージョンが 2.12-1.166.el6_7.3であることが分かります。対策済みのバージョンは glibc-2.12-1.166.el6_7.7 ですので、バージョンアップが必要なことが分かりました。
次に、yum check-updateコマンドで、glibcの2.12-1.166.el6_7.7がアップデート対象として表示されるかを確認します。
glibc.x86_64 2.12-1.166.el6_7.7 updates
glibc-common.x86_64 2.12-1.166.el6_7.7 updates
glibc-devel.x86_64 2.12-1.166.el6_7.7 updates
glibc-headers.x86_64 2.12-1.166.el6_7.7 updates
上記の結果から、2.12-1.166.el6_7.7がバージョンアップ後のバージョンであることが確認できました。
3-2. glibcのバージョンアップ
yumコマンドでパッケージのバージョンをアップデートするためには、システムの管理者 (root)へ移行する必要があります。suコマンドで、管理者へ移行します。
$ su -
Password: パスワードを入力
管理者へ移行するとプロンプトが$から#になります。
この状態で、yum updateコマンドを実行してglibcパッケージをアップデートします。
glibc以外のパッケージもアップデートしたい場合は yum updateだけ(パッケージ名の指定なし)を実行すると、全てのパッケージがアップデートされます。本記事ではglibcパッケージのみを対象としていますので、アップデートするパッケージとしてglibcを指定しています。
Loaded plugins: fastestmirror, security
Setting up Update Process
Determining fastest mirrors
epel/metalink | 5.1 kB 00:00
* base: ftp.iij.ad.jp
* epel: ftp.iij.ad.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
base | 3.7 kB 00:00
epel | 4.3 kB 00:00
epel/primary_db | 5.8 MB 00:00
extras | 3.4 kB 00:00
extras/primary_db | 34 kB 00:00
updates | 3.4 kB 00:00
updates/primary_db | 3.9 MB 00:00
Resolving Dependencies
--> Running transaction check
---> Package glibc-common.x86_64 0:2.12-1.166.el6_7.3 will be updated
---> Package glibc-common.x86_64 0:2.12-1.166.el6_7.7 will be an update
---> Package glibc-devel.x86_64 0:2.12-1.166.el6_7.3 will be updated
---> Package glibc-devel.x86_64 0:2.12-1.166.el6_7.7 will be an update
---> Package glibc-headers.x86_64 0:2.12-1.166.el6_7.3 will be updated
---> Package glibc-headers.x86_64 0:2.12-1.166.el6_7.7 will be an update
--> Finished Dependency Resolution
Upgrade 4 Package(s)
Total download size: 20 M
Is this ok [y/N]:y を入力
アップデートの情報が表示されます。内容を確認して問題が無ければ、yを入力してアップデートを実行します。
yを入力すると、パッケージのダウンロードとインストールが開始されます。
(1/4): glibc-2.12-1.166.el6_7.7.x86_64.rpm | 3.8 MB 00:00
(2/4): glibc-common-2.12-1.166.el6_7.7.x86_64.rpm | 14 MB 00:01
(3/4): glibc-devel-2.12-1.166.el6_7.7.x86_64.rpm | 986 kB 00:00
(4/4): glibc-headers-2.12-1.166.el6_7.7.x86_64.rpm | 615 kB 00:00
-----------------------------------------------------------------------
Total 8.9 MB/s | 20 MB 00:02
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Updating : glibc-common-2.12-1.166.el6_7.7.x86_64 1/8
Updating : glibc-2.12-1.166.el6_7.7.x86_64 2/8
Updating : glibc-headers-2.12-1.166.el6_7.7.x86_64 3/8
Updating : glibc-devel-2.12-1.166.el6_7.7.x86_64 4/8
Cleanup : glibc-devel-2.12-1.166.el6_7.3.x86_64 5/8
Cleanup : glibc-headers-2.12-1.166.el6_7.3.x86_64 6/8
Cleanup : glibc-common-2.12-1.166.el6_7.3.x86_64 7/8
Cleanup : glibc-2.12-1.166.el6_7.3.x86_64 8/8
Verifying : glibc-headers-2.12-1.166.el6_7.7.x86_64 1/8
Verifying : glibc-2.12-1.166.el6_7.7.x86_64 2/8
Verifying : glibc-common-2.12-1.166.el6_7.7.x86_64 3/8
Verifying : glibc-devel-2.12-1.166.el6_7.7.x86_64 4/8
Verifying : glibc-devel-2.12-1.166.el6_7.3.x86_64 5/8
Verifying : glibc-headers-2.12-1.166.el6_7.3.x86_64 6/8
Verifying : glibc-2.12-1.166.el6_7.3.x86_64 7/8
Verifying : glibc-common-2.12-1.166.el6_7.3.x86_64 8/8
Updated:
glibc.x86_64 0:2.12-1.166.el6_7.7
Dependency Updated:
glibc-common.x86_64 0:2.12-1.166.el6_7.7
glibc-devel.x86_64 0:2.12-1.166.el6_7.7
glibc-headers.x86_64 0:2.12-1.166.el6_7.7
Complete!
アップデートが完了すると、Complete!が表示されます。
3-3. アップデートの確認
glibcのアップデート後のバージョンを確認します。出力結果として、glibcパッケージ4つのバージョンが 2.12-1.166.el6_7.7になっていれば、完了です。
rpmコマンドでのバージョン確認
glibc-common-2.12-1.166.el6_7.7.x86_64
glibc-2.12-1.166.el6_7.7.x86_64
glibc-devel-2.12-1.166.el6_7.7.x86_64
glibc-headers-2.12-1.166.el6_7.7.x86_64
yumコマンドでのバージョン確認
glibc.x86_64 2.12-1.166.el6_7.7 @updates
glibc-common.x86_64 2.12-1.166.el6_7.7 @updates
glibc-devel.x86_64 2.12-1.166.el6_7.7 @updates
glibc-headers.x86_64 2.12-1.166.el6_7.7 @updates
4. サーバーの再起動
glibcについてはアップデートを行った後に、サーバーの再起動が必要になります。
タイミングをみて、rebootコマンドでサーバーを再起動します。syncコマンドはメモリ内にあるデータをHDDやストレージなどに同期するコマンドです。データベースなどメモリに大量のデータを保存するような環境では実行しておくことをお薦めします。
# sync
# sync
# sync
# reboot
Broadcast message from
(/dev/pts/0) at 10:31 ...
The system is going down for reboot NOW!
再起動後にログイン出来るようになったら、サービスを動作確認を行います。
以下のコマンドはオープンしているtcpポートをプロセス名で表示させます。
Active Internet connections (servers and established)
tcp 0 0 :::80 :::* LISTEN 1398/httpd
tcp 0 0 ::1:53 :::* LISTEN 1032/named
tcp 0 0 :::22 :::* LISTEN 1072/sshd
tcp 0 0 ::1:953 :::* LISTEN 1032/named
tcp 0 0 :::443 :::* LISTEN 1398/httpd
コマンドを実行し、サービスを行っているポートが全てオープンしていることが確認出来れば、アップデートは完了です。
5. まとめ
glibcについては、OSのシステムに関連する部分で、あまり更新を行っていない環境だと、かなりの数の依存関係アップデートでアップデート作業に時間がかかると思われます。
そのようなパッチを適用していない環境や、むやみにサーバーの停止ができない環境の場合は、バックアップを取得した上で、停止時間を調整(余裕をもって)の上、アップデートを実行することをお薦めします。OSレイヤーでの緊急レベル、セキュリティホールは数が少ないこともあり、見逃しがちですが、このような大きなものには是非、対処を行いたいですね。