サポートの切れた古い Vine Linux の Gnu bash を checkinstall で更新しようとしたところ失敗した。その記録。
Gnu bash に重大な脆弱性が発見された (GNU bash の脆弱性に関する注意喚起)。サーバを公開している場合,外部からのチェックも容易にされてしまうらしく,深刻である。この問題は「Shellshock」という名前がつけられ,関連情報を入手しやすくなっている。
さて,この問題に対し,Linux の各ディストリビューションからは更新版のパッケージが公開されていて,新しい OS であれば更新が簡単なのだが,古い OS は自己対応が必要になる。
このブログサーバは Vine Linux 4.2 であり,bash の更新パッケージの適用範囲外である。そこでソースからビルドしてこれを RPM にパッケージ化して更新することにした。Gnu では,古いバージョンの bash であっても,しっかりとパッチが公開されているというのが素晴らしい。しかし,ソースファイルにはパッケージ管理するためのビルドに必要な SPEC ファイルが用意されていない。そこで,CheckInstall - Wikipedia を利用してパッケージを作り,インストールすることにした。
ただし,この件に関しては,この方法は失敗する。checkinstall のバージョンは 1.6.1 である。
以下はその手順である。
checkinstall に失敗すると,新しい bash がインストールされないだけでなく,現在使用中の古い bash も削除されてしまう。ログインシェルがなくなってしまうのはとても危険である。もしこうなってしまった場合は,ログアウトする前に rpm で新しい bash のパッケージをリストから削除して,古いパッケージを強制的にインストールする必要がある。
まずは確認。
bash のパッケージが2つリストされていて,bash-2.05b-1 が checkinstall で入った新しいパッケージ,bash-2.05b-0vl3 は元から入っていたパッケージである。ただし,リストされているだけでどちらも正しくインストールされていないことに注意する。古いパッケージをアンインストールした後,新しいパッケージのインストールに失敗しているからだ。その祥子に,
となって,/bin/bash が見つからない。新しく入っている「ふりをしている」パッケージをアンインストールする。
そして古いパッケージの強制再インストール。
この一連の手続きは,checkinstall が失敗した直後であれば,古いターミナルが古い bash で動いているので,そのまま実行できる。しかし,新しくログインはできないということに注意しなければならない。したがって,作業する前に前回の記事のように別シェルの root アカウントでログインするか (nlog(n): root 権限の別ユーザを作成する),あらかじめログインシェルを変更しておいた root で作業する必要がある。
今回のこの作業で分かったのは,checkinstall でシェルを更新するのは慎重になった方がいいということである。bash の更新については,SPEC ファイルを書いてパッケージを更新するという「比較的」正しい方法で行うことにする。その方法については次の記事で。
2014年10月15日追記:
書きました (nlog(n): サポート切れ Linux の bash を RPM を自作して更新する)。
Master Archive Index
Total Entry Count: 1957