印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
Linux サポート切れ Linux の bash を RPM を自作して更新する

サポートの切れた古いバージョンの 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 を最新版に更新することであるが。

bash 更新の手順

例によって,プロンプト「$」は一般ユーザ,「#」は特権ユーザでのオペレーションとする。

ソースの取得と展開

まず RPM のソースを取得する。

$ apt-get source bash

取得したソース bash-2.05b-0vl3.src.rpm を展開する。展開するためのコマンドはインストールと同じである。

$ rpm -ivh bash-2.05b-0vl3.src.rpm

ソースは ~/rpm/SOURCES に展開される。

SPEC ファイルの修正

~/rpm/SPECS/bash.spec を編集する。リリースが 0vl3 となっているので,0vl3a などに書き換える。

#%define release 0vl3
%define release 0vl3a

パッチの記述を見ると,bash 2.05b のパッチは 007 まで当たっていることが分かるので,これ以降を追記する。Gnu のオフィシャルパッチは現時点で 013 まで公開されている (GNU Project Archives - bash-2.05b-patches)。

記述は,宣言のための記述をして (URL で書くというのは優れた方法だ),

Patch40: ftp://ftp.gnu.org/pub/gnu/bash/bash-2.05b-patches/bash205b-008
Patch41: ftp://ftp.gnu.org/pub/gnu/bash/bash-2.05b-patches/bash205b-009
Patch42: ftp://ftp.gnu.org/pub/gnu/bash/bash-2.05b-patches/bash205b-010
Patch43: ftp://ftp.gnu.org/pub/gnu/bash/bash-2.05b-patches/bash205b-011
Patch44: ftp://ftp.gnu.org/pub/gnu/bash/bash-2.05b-patches/bash205b-012
Patch45: ftp://ftp.gnu.org/pub/gnu/bash/bash-2.05b-patches/bash205b-013

実行のためのコマンドを書く必要がある。

%patch40 -p1 -b .008
%patch41 -p1 -b .009
%patch42 -p1 -b .010
%patch43 -p1 -b .011
%patch44 -p1 -b .012
%patch45 -p1 -b .013

そして,必須ではないが習慣として残しておきたいのはチェンジログである。例えば,次のような形式で書いておく。

%changelog
* Wed Oct 15 2014 Author's Name <author@mail.address.com> 2.05b-0vl3a
- added upstream patch (from 008 to 013)

チェンジログは上に行くほど新しく書かれたものなので,最後の改変は最上位にくる。

パッチのダウンロード

SPEC ファイルにはパッチの URL を書くことができるが,自動的に取得はしてくれないので,手動でダウンロードしておく必要がある。

$ wget http://ftp.gnu.org/gnu/bash/bash-2.05b-patches/bash205b-008
$ wget http://ftp.gnu.org/gnu/bash/bash-2.05b-patches/bash205b-009
$ wget http://ftp.gnu.org/gnu/bash/bash-2.05b-patches/bash205b-010
$ wget http://ftp.gnu.org/gnu/bash/bash-2.05b-patches/bash205b-011
$ wget http://ftp.gnu.org/gnu/bash/bash-2.05b-patches/bash205b-012
$ wget http://ftp.gnu.org/gnu/bash/bash-2.05b-patches/bash205b-013

リビルドの実行

SPEC ファイルをもとにリビルドを実行する。

$ rpmbuild -bb ~/rpm/SPECS/bash.spec

もしも,以下の様にパッチを当てるファイル見つからないというメッセージを出して待ち状態になったら,File to patch の欄にはすぐ上の行にあるファイルへの相対パス (ここでは builtins/common.h) を入力してやればよい (コピペでよい)。

|Patch:
|
|*** ../bash-2.05b.07/builtins/common.h 2002-05-10 12:25:08.000000000 -0400
|--- builtins/common.h  2014-09-25 10:18:20.000000000 -0400
--------------------------
File to patch: builtins/common.h

ビルドが成功すると,RPM が保存されたパスが表示される。

...
書き込み完了: /home/(user)/rpm/RPMS/i386/bash-2.05b-0vl3a.i386.rpm
書き込み完了: /home/(user)/rpm/RPMS/i386/bash-doc-2.05b-0vl3a.i386.rpm
...

bash と bash-doc の RPM ができている。bash は当然であるが,bash-doc は割とどうでもよい (笑)。

RPM のインストール

bash は既にインストールされているので,パッケージを置き換えてアップグレードすることになるため,オプションは -Uvh になる。

# rpm -Uvh ~/rpm/RPMS/i386/bash-2.05b-0vl3a.i386.rpm

これでめでたく終了である。

まとめ

bash の更新をするのために,Gnu オフィシャルパッチの当たった RPM を自前で作成した。やってればそれほど難しくないことが分かった。tarball から直接インストールすることと比べれば,configure の代わりに SPEC ファイルを編集し,make の代わりに rpmbuild し,make install の代わりに rpm -Uvh するだけである。

RPM ファイルができてしまえば,~/rpm 以下のファイルは不要になるので削除してしまってよい。全削除はもったいないと感じるなら,編集した SPEC ファイルだけを残すか,rpmbuild のときに -ba オプションを指定して

$ rpmbuild -ba ~/rpm/SPECS/bash.spec

src.rpm ファイルを作成し,これだけを残すという手もある。こうしておけば,更新した SPEC ファイルだけでなく,パッチも残すことができる。しかも残すファイルは1つだけになるので管理が簡単,というように一石何鳥にもなる。

Posted by n at 2014-10-15 23:00 | Edit | Comments (2) | Trackback(0)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments

ありがとうございます。
このページの情報で対策ができました。

Posted by: 42user at February 22, 2015 14:48

42user さん

Bash Shellshock についてはブログ記事がお役に立てたようで何よりです。

メールでお問い合わせいただいた GHOST 対策に関しては,システムを Vine Linux 6.2 にしてしまったため
検証する環境が現在ありません。
試すとなるとシステム構築からやる必要があり,時間がかかりそうです。

私の記事ではありませんが,
http://sky.ap.teacup.com/debslink/1440.html
が参考になるのではないかと思います。

Posted by: n at February 23, 2015 03:45
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?