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対応の部分を更新

  

2010年6月25日

Solaris10上でSun Studioコンパイラを使ったopensslのビルド

なぜか書いていなかった Solaris上でSun Studio コンパイラを使ったopensslのビルドについて。
opennsslのconfigスクリプトはautoconfを使ったconfigureスクリプトではないので、環境変数でCC指定したつもりが無視される。
gccでコンパイルするつもりなら特に問題がないが、Sun Studioのccを使ってコンパイルする場合はconfigスクリプトにコンパイル環境を引数として指定してやる必要がある。
引数はX86なら「solaris-x86-cc」、Sparcなら「solaris-sparcv7-cc」である。このあたりはconfigスクリプトのConfigureを読めば書いてある。
コンパイルオプションなどを変更する場合もこのConfigureを直接編集すればいい。
たとえばX86のSolaris10でSun Studio 12を使ってmakeする時、私の場合は
Configure内のコンパイルオプションを変更するために
「"solaris-x86-cc","cc:-fast -O -Xa 」を「"solaris-x86-cc","cc:-fast -O -Xa -native -mt」と書き換えて「-native」と「-mt」オプションを追加する。
そして/usr/bin/ccではなく、Sun Studioのcc、/opt/sunstudio12.1/bin/ccが優先的に使われるように、
export PATH=/opt/sunstudio12.1/bin:$PATH
と、パスを通し直す。
./Configure solaris-x86-cc
とコンパイル環境を指定してconfiguスクリプトを走らせた後、
gmake && sudo gmake instlall
でバイナリ生成、インストール

2009年10月12日

sennaをsolaris@sparcでコンパイルした

今年の三月に、mysqlなどで利用する組み込み型前文検索エンジンのsennaがsparcで動作しているsolarisでコンパイルできないと書いた。

仕事でなかなかに膨大な量のテキストデータベースを扱っているのだが、このsennaをmysqlに組み込む事で、一万件程度のテーブルでの複数カラム内のテキストデータの検索が一瞬で終わるくらいの恐ろしい速度で、単語ベースの精度の高い日本語インデックス検索が可能になるので、ぜひともsolarisで、しかも大好きなsparcで動作させたかったのだ。
あれから、Sparcには対応してない事を知って以来ずっと気になっていたのだが、最近仕事でSparcのサーバーを入れなおしたのを機会にもう一度チャレンジした。
そして無理やりではあるが、ソースコードにちょっとした手を加える事でコンパイルに成功したのでその方法を書いてみる。
なんというか、ちょっとした悲願達成である。

(続きを読む...)

2009年4月20日

神託が太陽を買う/沈まない太陽/MySqlが沈む太陽に見える

oraclebuysun.jpgちょっと前にIBMと買収交渉に入ったらしいと言う噂のあったSUNであるけど、とうとうオラクルが買ったらしい。
SUNのトップページにもでかでかと載っている。
なんというか、昔から憧れていた人がとうとう結婚しちゃったような感覚である。
オラクルってお硬く真面目なイメージがあったけど、そんなに儲かってたんやなぁ。と言うのに驚いた。
この間SUNがMySqlを買収したところやけど、そのSUNをオラクルが買収したって事でMySqlが目指していたエンタープライズ向けのDBMSの道は完全に閉ざされたことだろう。
ORACLEとMySqlはバーバリーとバーバリーブルーレーベルのような関係になったわけだが、そういえばORACLEがBerkeley DBを買ってから、MySQLやMovable TypeがBerkeley DBへのサポートを廃止したけど、MySqlの運命やこれ如何に。

(続きを読む...)

2009年3月31日

solarisのパッケージコマンド

solarisのパッケージなコマンド一覧
pkgchkですべき所をpkginfoでやって何も見えないってのは、よくある罠。
カレントディレクトリのSUNWcsuからインストール
pkgadd -d . SUNWcsu
パッケージ一覧
pkginfo
SUNWcsuパッケージの詳しい情報
pkginfo -l SUNWcsu
SUNWcsuパッケージによってインストールされたファイル一覧
pkgchk -vn SUNWcsu
/usr/bin/lsをインストールしたパッケージを表示
pkgchk -lp /usr/bin/ls

2009年3月27日

いつも使わないけど、無いと物足りないもの

OSの起動時にapache-tomcatを起動したい場合/etc/init.d/apache-tomcatなどのshスクリプトを書いて「bin/startup.sh」か「bin/catalina.sh start」のどちらかを呼ぶ事になるけど、「JAVA_OPTS」などの環境変数を設定した上で起動したい場合、「/etc/init.d/apache-tomcat」にJAVA_OPTS="-Xmx512M -Xms64M -Dfile.encoding=UTF-8"などと書いても適用されず、サーブレットがまともに動かない。
initスクリプトから呼んでいる「bin/startup.sh」にJAVA_OPTS="-Xmx512M -Xms64M -Dfile.encoding=UTF-8"と書いてもダメ。
わけがわからず数時間悩んだ挙句、「bin/startup.sh」は「bin/catalina.sh start」を呼んでいるだけであることに気づいた…
当然「bin/catalina.sh」にAVA_OPTS="-Xmx512M -Xms64M -Dfile.encoding=UTF-8"などと追加してやると当たり前のように動いた…
つまり、bashのシェル上で環境変数を設定した状態でshのシェルスクリプトを起動すると環境変数はそのスクリプトに渡るけど、shのシェル上から環境変数を設定してshスクリプトを起動しても環境変数は渡らない。
linuxの/bin/shは/bin/bashのシンボリックリンクなのでこの問題は起こらないはずであるが、Solarisにはホンマモノのshが入っているが故にこの問題が起こる。

(続きを読む...)

2009年3月26日

SUN, SUN, lama asabthani

mysqlバインディングされたsennaが入ったシステムを作る必要があってsennaをコンパイルしていたのだが、solaris10 X86でちゃんとコンパイルして動作確認の取れているバージョンであるsennnaの1.0.5がsparcマシンで動作するようにコンパイルできないことが判明した。
二年前の情報でちと古いけど、開発者である未来検索ブラジルの中の人の話によれば、sourceforge.netが用意しているSparc用のコンパイルファームのサービス停止が決定したようで、二年前現在では開発のめどがたたなくなっていた状態であったらしい。

未来検索ブラジルの従業員の立場としては、
SPARC Solarisを用いた案件がないので、
実装の優先順位は低い状態のままです。

ということなので、試みに最近のソースをコンパイルしても通らないという事はもう対応されていないのかも。それとも私のコンパイルが悪いのか?
しかし、ソースツリー上の問題のある該当ヘッダファイルをどうにかすればどうにかなってsolaris10のsparcでコンパイルできたという情報もあるものの、とにかく既に二年前の段階でSparcアーキテクチャってのはマイナーになっているのだということを強く感じた。

(続きを読む...)

2009年3月19日

黒いボディに赤い突起を持ったヤツがSunを買う。らしい。

IBMがSun Microsystemsを買収する交渉を進めているという話があるらしく、Sun好きとしては「えぇーっ!」と言う感じである。
昔からIBMのサーバー(というかAIX)に良いイメージを持てない偏見があったのだが、それでもIBMが手がけていたThinkpadには昔から悪からぬ印象を持っており、最近その保守マニュアルの素晴らしさに惚れてからというもの、Thinkpadの設計思想に感服してIBMに好感を持ち始めたところである。
職場でもIBMのハードにSolarisを乗せてグリグリ動かしているし、家でもThinkpadにsolarisを入れて使っている。
もう完全に個人的な趣味であるが、ラップトップはIBMのThikpadが一番だし、X86のSolarisにIBMは結構似合うやねーと思い始めた。おまけに私が初めて買ってもらったパソコンがIBMのaptivaである。
しかし、あれだけ素晴らしかったThikpadを採算が取れないと言うことでブランドごと売り払ってしまうような会社だし、Sunを買収した暁にはSparcなど二束三文で売り払いそうな気がする。
IBMのイメージは黒いボディに毒々しく赤い突起である、とてもSunを窮地から救う白馬の騎士には見えないと思った、世の中の世知辛さを感じた日であった。
「fujitsu」ロゴのSparcは「不実」に見えてちょっとモッサいけど、もういっそ富士通がSun買えばいいと思うよ。
がんばれ富士通。とりあえずSparcだけでも…

2009年3月11日

Solaris10 u6で大体止めるべきサービス/デーモン一覧

Solaris 10 10/08 u6でサーバー使いの場合に止めるべきサービス一覧はこんな感じ。
デフォルト状態だとXサーバーやフォントサーバーどころかATOKまで起動しているので、この状態から殆ど何も起動していない状態にする。
/etc/rc3.d/以下のもの、/etc/rc2.d/のもの、さらにSMFとinetdから起動されるもので一般的にいらないであろうものを書いてみる。
コピペして利用し易いように、コマンドにしておいた。

(続きを読む...)

2009年3月9日

solarisでCHAP 認証つきのiSCSIターゲットをZFSで作る

前に買ったノートPCのディスク容量が少ないので、家にいる間は家庭内サーバーのSolarisからiSCSIディスクをマウントして使っている。
SolarisでiSCSIターゲットを使う方法はネット上に結構沢山の情報があるのだが、実際の使用というよりもテストを想定して書かれたドキュメントが多く、私が探した限りマウントの際に認証をかける方法は見つからなかった。
ということで、solarisで認証つきのISCSIターゲットを構成し、WindowsクライアントをISCSIイニシエーターとして利用する方法を書いてみる。
概要:
とりあえずWindows XP にMicrosoft iSCSI initiatorが入っているのを前提に、
SolarisのストレージプールからZFSボリュームを割り当て、そのボリュームをiSCSIターゲットとして公開し、iSCSIイニシエーターのノード名とCHAP認証でアクセス制限をかける。
ところを書いてみる。

(続きを読む...)

Next »