サポートの切れた古いバージョンの Linux の bash を RPM ファイルを自作することで更新する。
Gnu bash の脆弱性が先月報告された (GNU bash の脆弱性に関する注意喚起)。問題がある bash を使っているシステムに対しては,外部からお望みのコマンドが実行できてしまうようだ (更新:bash の脆弱性対策について(CVE-2014-6271 等):IPA 独立行政法人 情報処理推進機構)。この問題に対してパッチが公開され,一時は追加につぐ追加となっていたが落ち着いてきたようなので,自宅の Linux サーバにパッチを適用することにした。
自宅サーバは bash 2.05b で,脆弱性がある版である。OS は Vine Linux 4.2。Vine Linux では,新しい OS である 6.1, 6.2 の更新版のパッケージを公開しているが,古い OS に対してはサポート切れのため提供は行われない。
新しい OS の場合は,Vine Linux や Debian では apt-get,Redhat や Fedora, CentOS などでは yum で簡単に更新ができるようになっている。しかし,古い OS ではそのように簡単にはいかない。
Gnu では古いバージョンの bash のパッチも公開しているので,tarball から直接 make してインストールするという方法もある。しかし,これは乱暴な方法であって,パッケージ管理から外れてしまうので依存関係が崩れてしまうという欠点がある。そこで,tarball から make した後に checkinstall で RPM を作ってインストールするという方法を試してみたのだが,新しい bash も古い bash も削除されてしまうという最悪の事態におちいることが判明した (nlog(n): 古い Linux の bash の更新に checkinstall を使うのは危険)。
そこで,今回は基本に立ち戻り,まず RPM のソースを取得し,これに Gnu のオフィシャルパッチを当てて,SPEC を書き直して RPM を再構築してインストールするという手順をとることにした。これは「比較的正しい」手順である。問題があるとすれば,作成するのは「野良 RPM」であって,Vine Linux の命名規則にしたがっていないため,公式の更新版が公開された場合にその検出ができるかが不明な点である (rpmver で確認できることにはなっているが)。現時点では最善の方法である。もっとも,一番いいのは OS を最新版に更新することであるが。
例によって,プロンプト「$」は一般ユーザ,「#」は特権ユーザでのオペレーションとする。
まず RPM のソースを取得する。
取得したソース bash-2.05b-0vl3.src.rpm を展開する。展開するためのコマンドはインストールと同じである。
ソースは ~/rpm/SOURCES に展開される。
~/rpm/SPECS/bash.spec を編集する。リリースが 0vl3 となっているので,0vl3a などに書き換える。
パッチの記述を見ると,bash 2.05b のパッチは 007 まで当たっていることが分かるので,これ以降を追記する。Gnu のオフィシャルパッチは現時点で 013 まで公開されている (GNU Project Archives - bash-2.05b-patches)。
記述は,宣言のための記述をして (URL で書くというのは優れた方法だ),
実行のためのコマンドを書く必要がある。
そして,必須ではないが習慣として残しておきたいのはチェンジログである。例えば,次のような形式で書いておく。
チェンジログは上に行くほど新しく書かれたものなので,最後の改変は最上位にくる。
SPEC ファイルにはパッチの URL を書くことができるが,自動的に取得はしてくれないので,手動でダウンロードしておく必要がある。
SPEC ファイルをもとにリビルドを実行する。
もしも,以下の様にパッチを当てるファイル見つからないというメッセージを出して待ち状態になったら,File to patch の欄にはすぐ上の行にあるファイルへの相対パス (ここでは builtins/common.h) を入力してやればよい (コピペでよい)。
ビルドが成功すると,RPM が保存されたパスが表示される。
bash と bash-doc の RPM ができている。bash は当然であるが,bash-doc は割とどうでもよい (笑)。
bash は既にインストールされているので,パッケージを置き換えてアップグレードすることになるため,オプションは -Uvh になる。
これでめでたく終了である。
bash の更新をするのために,Gnu オフィシャルパッチの当たった RPM を自前で作成した。やってればそれほど難しくないことが分かった。tarball から直接インストールすることと比べれば,configure の代わりに SPEC ファイルを編集し,make の代わりに rpmbuild し,make install の代わりに rpm -Uvh するだけである。
RPM ファイルができてしまえば,~/rpm 以下のファイルは不要になるので削除してしまってよい。全削除はもったいないと感じるなら,編集した SPEC ファイルだけを残すか,rpmbuild のときに -ba オプションを指定して
src.rpm ファイルを作成し,これだけを残すという手もある。こうしておけば,更新した SPEC ファイルだけでなく,パッチも残すことができる。しかも残すファイルは1つだけになるので管理が簡単,というように一石何鳥にもなる。
Posted by n at 2014-10-15 23:00 | Edit | Comments (2) | Trackback(0)
Master Archive Index
Total Entry Count: 1957
ありがとうございます。
Posted by: 42user at February 22, 2015 14:48このページの情報で対策ができました。
42user さん
Bash Shellshock についてはブログ記事がお役に立てたようで何よりです。
メールでお問い合わせいただいた GHOST 対策に関しては,システムを Vine Linux 6.2 にしてしまったため
検証する環境が現在ありません。
試すとなるとシステム構築からやる必要があり,時間がかかりそうです。
私の記事ではありませんが,
Posted by: n at February 23, 2015 03:45http://sky.ap.teacup.com/debslink/1440.html
が参考になるのではないかと思います。