« | »

2014年9月27日

solarisにbashの脆弱性#ShellShock「CVE-2014-6271」にパッチを適用する

全国1000万のsolarisファンの皆様、本当にお久しぶりです。
本当に久しぶりのsolarisカテゴリの更新です。

SunMicrosystemsがOracleに吸収されてからというもの、いつも心にあった太陽がすっかり沈んでしまったと言う人も多いのではないでしょうか?
Oracle銘のSolarisのロゴを見ると、昔から大好きだった物憂げで繊細だった文学少女に久しぶりに会った時に「夢は起業」とか言っちゃう「意識高い系」に変わってしまっていて嬉々として「お金に働かせるんです!」とか「経営者目線で!」とか言うのを聞いているような残念な心の疼きを感じる人も多いのではないでしょうか?
そして、もうすっかりSolarisを見限ってしまった人も多いのではないでしょうか?

私も公私共にsolarsが大好きでしたが、SunMicrosystemが消滅してから、これからのSolarisに夢や希望どころか興味そのものを全て失ってしまい、職場で構築したクリティカルなサーバーをLinuxに置き換え、自宅サーバーもLinuxで再構築してしまいました。
そしてそれからずっとSolarisとは赤の他人として当たり障りのない距離を保っていたのですが、今日、ちょっと気が遠くなるような、世のUNIXシステム管理者を恐怖のずんどこに叩き込むようなbashの脆弱性である#ShellShock「CVE-2014-6271」を目にしました。
これはbashがデフォルトシェルなら一撃でWebサーバー経由でwebサーバーが動いているユーザー権限で任意のコードが実行可能な恐ろしいものですねー
時々ルート権限で動いているwebサーバーやらsqlサーバーを目にしますが、
こんなサーバーならコマンドひとつでダウンさー♪
YouはSHOCK!シェルでサーバーが落ちてくる!

ShellShock!変数がコマンドに落ちてくる!!
ということになってしまいますね!
世界中のシステム管理者たちが半ばパニックになりながら大喜び大慌てで対応していますが、みんな言及しているのはLinuxやらMac OS Xの事ばかり、誰もSolarisのソの字も言いません。

各Linuxはすばやく対応したパッチをリリースしたので、rpmなりyumなどでアップデートしたらすぐ対応可能ですが、何かの事情で、古いSolarisをWebサーバーとして使い続けている方も多いかもしれません。
solarisのデフォルトのシェルはLinuxのようにbashへのリンクではない素のshなので特に変わったことをせずにそのまま運用している人は問題ないですが、一応bashはsolaris10あたりからデフォルトでイントールされていますし、もしかしたらデフォルトシェルをbashに変えている人もいるかもしれません。

私も公私で何台か古いSolarisサーバーの面倒を見ているので、Linuxへの対応後に念のためこのsolarisのbashパッケージSUNWbashを更新しておこうとしたのですが、私の探し方が悪かったせいかOracleからもどこからも更新版のバイナリパッケージを探すことが出来ませんでした。
というか、そもそも誰もSolarisのことなんか心配してない...
みんなたまにはSolarisのことも思い出してあげてください!

これはあんまりじゃないか。
もう好きでもないし、過去の人だし、むしろ忘れてしまいたい人ですらあるかもしれないけど、それでも昔愛した人じゃないか。
あの時あれだけ傾けた情熱は真実だったはず。
とても恐ろしい病巣を抱え込んでしまっても、特に死にいたるわけじゃないから誰にも気付いてもらえず忘れ去られたままのsolarisさんにちょっとした親切や敬意を向けたって良いじゃないか!

誰もやらないなら俺がやる!
バイナリがなければコンパイルすればいいじゃない!
ソースがなければパッチをあてればいいじゃない!

ということで、本家bashからソースコードをダウンロードし、そのソースコードにパッチを適用し(bash本家のソースツリーにはまだ反映されていないため)コンパイルしたので、その顛末を古いSolarisの心配をする心優しきSolarisユーザーのために公開しておきます。
またunix系OSならMac OS XだろうがBSDであろうが基本的に同じ手順でいけるはず。

0.まず裸になります。
まず、bashのソースコードをダウンロードします

ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3.tar.gz

そしてこのソースコードに対するパッチもダウンロード
ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-025
をbash43-025.patchという名前で保存。

新しくパッチが出たようなのでこいつもダウンロード (2014/ 09/27更新)
ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-026
をbash43-026.patchという名前で保存。

1.ビルドの準備
展開してソースコードのディレクトリに移動


$ gtar zxvf bash-4.3.tar.gz
$ cd bash-4.3

2.ソースコードにパッチを適用
bash本家のソースコードはまだパッチが適用されていないので、自力でバッチをあてる。
solarisはSUNのpatchコマンドしか入っていないので、GNUのパッチで実行の事、GNUパッチがない人は後述)


$ /usr/local/bin/patch -p0 < ../bash43-025.patch
patching file builtins/common.h
patching file builtins/evalstring.c
patching file variables.c
patching file subst.c
Hunk #1 succeeded at 8100 (offset -18 lines).
patching file patchlevel.h
Hunk #1 FAILED at 26.
1 out of 1 hunk FAILED -- saving rejects to file patchlevel.h.rej

$ /usr/local/bin/patch -p0 < ../bash43-026.patch
patching file parse.y
patching file y.tab.c
Hunk #2 succeeded at 8540 (offset -2 lines).
patching file patchlevel.h
Hunk #1 FAILED at 26.
1 out of 1 hunk FAILED -- saving rejects to file patchlevel.h.rej

って感じで終わればパッチ適用完了
patchlevel.hのエラーが出てるけど、これはパッチレベル表記の変更だけなので、今回の対応のレベルでは問題なしかと思うけど、
気持ち悪いようなら、
ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-001
から順繰りにパッチあてていけばいいかと…

3.ビルドする
 prefixでインストール先を/usr/local/bash以下にした。

$ ./configure --prefix=/usr/local/bash
$ make

4.ビルドしたバイナリをテスト
次にビルドできたバイナリに脆弱性がないかテストする。

$ env x='() { :;}; echo vulnerable' ./bash -c "echo this is a test"  
./bash: warning: x: ignoring function definition attempt
./bash: error importing function definition for `x'
this is a test

赤文字の「./」をお忘れなく。これなしだとコンパイルしたbashではなくパスが通っているbash(つまりは入れ替える前のbash)が実行される。
上記のピンクの行が出力されていばOK

vulnerable
this is a test

って赤の行が出力されるとアウト、"echo this is a test"ってコマンドをbashで実行しただけなのに、
環境変数に埋め込まれた"echo vulnerable"まで実行されてます。
恐ろしいですねー!YouはSHOCK!! 変数からコマンドが落ちて来てますね!

5.ビルドしたbashをインストール
ちゃんと動作したならインストールする。rootユーザーなりsudoなりで

# make install

6.バイナリ入れ替え

そして古いバイナリをリネームして実行権限を落とし、
新しいバイナリのシンボリックリンクに置き換える。

# cd /usr/bin
# mv bash bash.old.nopatch
# chmod 444 bash.old.nopatch
# ln -s /usr/local/bash/bin/bash ./

7.インストールしたbashをテスト
そしてちゃんとbashが更新されているかテスト

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
 bash: error importing function definition for `x'
this is a test

これでOK

パッチがちゃんとあたらないと言う人やpatchコマンドがないと言う人のためにパッチ済みのソースコードを「bash-4.3-026.patched.bydogu.tar」としてあげておいた。
これをダウンロードして
「2.ソースコードにパッチを適用」以外の手順でOKなはずー

しかし、久しぶりにsolarisでコンパイルしていてとても懐かしい親密な感覚にずっと包まれていた。
シェル上でコマンドを実行するのはsolarisさんとの対話であり、ソースコードをコンパイルするのは二人だけで行われるひとつの新たな試みなのだ。
Solarisを触っていて、スタニスワフ・レムの『ソラリスの陽のもとに』のように惑星ソラリスで死んだはずの人と出会う体験をしているような気分だった。
そして、ひとしきりsolarisさんと言葉を交わし、Linuxのように便利だからとか使いやすいからとかいう理由でbashを標準シェルにするのではなく、最低限の機能に限った安全で軽くて何にもリンクしていないshがデフォルトのシェルになっている設計など、solarisさんの良い所を再認識したなー

ああ、過ぎ去った時代は、過ぎ去ったからこそ美しい。

更新履歴

  • 2014 09/25 投稿
  • 2014 09/27 パッチレベル26対応の部分を更新

  

Trackback URL

Comment & Trackback

非常に参考になります。
本当にありがとうございます。

私もOracleの公式パッチを待っているのですが、一向にパッチが出る気配がなく・・・。
https://community.oracle.com/message/12650193#12650193
そもそもOracleの対応はとても遅いようですね。
http://www.oracle.com/technetwork/topics/security/thirdparty-patch-map-1482893.html

Bashはデフォルトシェルとしては使っていないので、様子見を続けていましたが、Solaris10なのでインストールされてしまっているし、こちらを参考に入れ替えようかな・・・と思い始めています。。

参考になりましたようで幸いです。

本当にボラクル…じゃなかったオラクルの対応遅いですよね…
私はもう勝手にsolaris10用のパッケージ作って配布しちゃおうかとも考えてます(笑)

本家bashのパッチ自体の決定版がまだという状況ですので、もうしばらくは静観する必要ありですねぇ。

ありがとうございます。

参考というかそのまんまやらせていただきました。

ども。
昨日パッチレベル26のコードがツリーにアップされたようですのでこいつも適用しちゃってください。

確認が遅くなりました・・・。
出ましたね!
http://www.oracle.com/technetwork/topics/security/alert-cve-2014-7169-2303276.html

おおっ!とうとう出ましたね!
Solarisは8からパッチがあるようですが、solaris7の人は…さすがに自分でコンパイルしているでしょうね。

Solaris7!確かに出ていないですね・・・。
幸いにも会社のサーバーはSolaris8&10だったので、助かりました。と言っても、私たちも便利さからLinuxに乗り替える予定で、新環境を構築しています。何だか寂しいです。

そうですよねぇ。私の方もサポートの形態が変わってしまったので乗り換えざるを得ません。
本当に寂しいですねぇ…

Comment feed

Comment





XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>