anchor
Macに久々の大型セキュリティホール!〜ShellShockの脅威について自分なりのまとめと対策〜MavericksだけでなくPowerPCでTiger旧マシンも対策を急げ!【追記あり】
この数日いろいろ忙しかったので更新が止まっていたが、忙しかった理由のひとつがこれだった。
Macにも久しぶりの大型セキュリティホールが発見されたことがニュースになっていたのだが、一般的なMacユーザはどれほど認識しているのだろうか。
UNIXで広く使われているbashのシェルに管理者、アクティブユーザの意図しない任意のコマンドを実行されてしまう脆弱性が発見された。
詳細はこちら。
Shellshock- Bash Bug 脆弱性について知っておくべきこと | Symantec Connect
この脆弱性はbashを使う全てのOSに影響がある。以下のLinuxはパッチを配付している。
Debian
Ubuntu
Red Hat
CentOS
Novell/SUSE
BSDを筆頭にUNIXもbashを使用している。
そしてMac OS Xもその流れなので当然bashを使用している。
故にMacでも危険な脆弱性であるという点では全く同じなのだが、Appleは早々と
「ユーザーが高度なUNIXサービスを設定していない限り、ほとんどのユーザーは安全」
という発表をして逆にミスリードするというチョンボを繰り返している。
bashの脆弱性はシェルの問題なのでShellShockと呼ばれているが、さっそくこれを利用したbotネットが出現している(といううわさ)が登場している。
bashのShellshock脆弱性を利用するボットネットが出現 | スラッシュドット・ジャパン Linux
またこのシェルのセキュリティホールを攻撃するマルウエアも登場している。
【セキュリティ ニュース】「ShellShock」で侵入するマルウェア - DDoS攻撃機能を搭載:Security NEXT
これらの被害の詳細は続報を待たないといけないが、この数日このShellShockの影響やリスクについていろいろ調べていて、決してAppleが言うような「一部の特殊なマニアックなユーザのみの脅威」なんかではなく、全てのMacユーザが脅威にさらされているという確信を持っている。
ファイアウォールで守られたサーバも、ある条件が揃えば任意のコマンドを実行されてしまうOSコマンドインジェクションが可能だということだ。
ファイアウォール内のサーバに対するShellshockを利用した攻撃 - 葉っぱ日記
またどこで読んだのかリンクを探しているのだが、クッキーなどを使用してインジェクションも可能だという記事も見かけた。
だから「高度なUNIXサービスを設定していない」個人ユーザも安全といえないように思う。
このShellShockとはどういうバグなのかの詳細はこちらに詳しい解説がある。
bash の脆弱性 "Shell Shock" のめっちゃ細かい話(CVE-2014-6721)- もろず blog
bashの脆弱性(CVE-2014-6271) #ShellShock の関連リンクをまとめてみた - piyolog
これに対してAppleもbashのパッチをMacのインストーラで簡単に当てられるパッチアップデートを発表したが、一般的なソフトウエアアップデートではなく自分でインストーラをダウンロードしてきて当てないといけない形式の配布にしたところが、いかにも危機感がない。
Apple、Bashの脆弱性を修正する「OS X bash Update」公開 ;マイナビニュース
そのMacのパッチはこちらで入手できる。
OS X bash Update 1.0 - OS X Mavericks
Mavericks以外のバージョンのパッチはこちらから入手できる。
Lion以降がサポートされている。
アップル - サポート - ダウンロード
Appleはおおらかに構えているようだが、いろいろ調べてみてこれは多分Mac OS Xの脆弱性としては2004年のURI脆弱性に匹敵する脅威で、「一般的なユーザにはほとんど関係がない」などと言ってしまっていいものとは私には判断できない。
対策ができる人は速やかに対策をするべきだと思う。
今回の脆弱性はいくつかまとめて見つかっているがその代表のCVE-2014-6271の例
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"という環境変数の文字列を読み込ませる
その変数の入るべきところに「vulnerableと書き出せ」というコマンドを
忍び込ませておくとシェルに「vulnerable」と表示される
これ自体は他愛もないコマンドだが、替わりにもっと悪意のあるコマンドを忍ばせることができる
また環境変数なのでコマンドを打たなくても任意のファイルからbashを呼び出してこれを実行させることができる
上記のAppleのサポートページからパッチをダウンロードしてきてさっそくインストールする
インストール後に同じ文字列をTerminalに置いてみたが
「vulnerableと書き出せ」というコマンドは無効になっているのが分かる
他にもCVE-2014-7169、CVE-2014-7186、CVE-2014-7187などの
ShellShockが発見されているがそれぞれの検証用コードを走らせてみる
「vulnerable」と表示されたらまだ脆弱性が残っているとのこと
この脆弱性の影響を受けるbashのバージョンは上記のリンクまとめサイトに詳細が書かれているが、以下のバージョン。
Bash 4.3 Patch 25 およびそれ以前
Bash 4.2 Patch 48 およびそれ以前
Bash 4.1 Patch 11 およびそれ以前
Bash 4.0 Patch 39 およびそれ以前
Bash 3.2 Patch 52 およびそれ以前
Bash 3.1 Patch 18 およびそれ以前
Bash 3.0 Patch 16 およびそれ以前
Bash 2.0.5b Patch 8 およびそれ以前
Terminalを開いて
bash --version
と打てば現在の自分の使用しているOSに使用されているbashのバージョンを調べることができる。
調べてみると明らかになると思うが現在のMacの全てのバージョンが、この脆弱性の影響を受けるバージョンであることが分かる。
また脆弱性の検証コードは以下の通り(これもbashの脆弱性(CVE-2014-6271) #ShellShock の関連リンクをまとめてみた - piyologさんより)
CVE-2014-6271の検証コード
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
CVE-2014-7169の検証コード
env x='() { (a)=>\' bash -c "echo echo vulnerable"; cat echo
CVE-2014-7186の検証コード
bash -c 'true <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF' || echo "vulnerable"
CVE-2014-7187の検証コード
(for x in {1..200} ; do echo "for x$x in ; do :"; done; for x in {1..200} ; do echo done ; done) | bash || echo "vulnerable"
以上のAppleからのパッチインストーラでMavericksからLionまでのOS Xは 少なくともこれらの公表されている脅威からは解放される。
MacBook ProとVPNサーバにしているintel/Mac miniはさっそくパッチを当てた。
問題は自宅サーバのiBook G4だ。
Webサーバとして使用しているこのPowerPCのMacはOSはTigerでこれ以上にアップすることはできないことは過去に何度か検証している。
上記パッチはLion(OS10.7)以上しかサポートしていないためTiger(OS10.4)にはパッチが適用されない。
上記の影響を受けるバージョンに該当するか調べると、勿論該当していた。
このiBookはもうサーバのみの使用で、これでWebブラウジングとかをしたりもしない。
CGIを動かしてるわけでもないので切迫もしていないと思うが、ネットワークにつなぐMacは全て対象と考えてiBook G4のbashをパッチ込みでコンパイルし直すという方法を選んだ。
必要なのはbashのソースコード。
GNU Project Archives
これを最新版にアップデートするためのMacPorts
The MacPorts Project -- Download & Installation
またコンパイルに必要なXcode
Xcode 2.4.1 Downloads
そして現在ShellShockに対応したパッチを以下からダウンロードした。
GNU Project Archives
インストールの手順は以下を参考にした。
osx - How do I recompile Bash to avoid Shellshock (the remote exploit CVE-2014-6271 and CVE-2014-716…
Webサーバとして上げているiBook G4のTerminalを起動して
例の脆弱性検証コードを走らせるときっちり脆弱性を表示した
そこでbashを無効化して再コンパイルするためにbashのソースコード、
MacPorts、Xcode、bashパッチをダウンロードする
パッチは上記のプロジェクトリンク先から3.2.49〜3.2.54をダウンロードしてくる
パッチはテキストなので右クリックでダウンロード先に保存する
これらのパッチは上記の通りテキストなので拡張子を.txtから.patchに変更する
コンパイルの都合でファイル名も「bash3.2.49.patch」
というように元ファイル名を確認しながら書き換える
さて脆弱性が該当するG4のbashバージョンを確認した
コマンドbash --versionと打つ
バージョンは2.05b.0でかなり古い
PowerPC向けのXcode、v2.4.1をダウンロードしてきてインストール
Xcodeをインストール成功したらライセンスオプションでビルドすると
書いてあるが「不明なオプション」と表示されて失敗した
さらにMacPortsをアップデートするコマンドは「コマンドが見つからない」…
そう先にMacPortsをインストールしないとこうなります…
MacPortsはプロジェクトページからTiger向けのバージョン2.3.1-10.4-Tiger
のディスクイメージをダウンロード
pkgを起動してインストールした
インストールが完了したらTerminalでsudo port selfupdate
と打ってPortsを最新版にアップデートしておく
といってもさすがにPowerPC版にアップデートはないようだが…
sudo port upgrade outdatedでアップグレードも探るが何も無し
一応の手続きなので…
bashのソースコードを解凍する
入手したのはbash-3.2.48.tar.gzなのでデスクトップに置いた場合は
まずcd ~/Desktopとしてカレントディレクトリを移動しておいて
tar xzvf bash-3.2.48.tar.gzと打って解凍する
少し待たされる
解凍が完了したらcd bash-3.2.48と打って
解凍したbashソースコードフォルダの中にカレントディレクトリを移動しておく
次に先にダウンロードして.patchの拡張子にリネームしていたパッチファイルを
コマンドはcp ../*.patch .と打ってこのbashソースのフォルダの中にコピーする
次に既存のbashコマンドバイナリをアーカイブ化しておく
すべて_oldとファイル名のあとについたファイル名に変更して無効化しておく
削除しないでアーカイブ化しておくのは失敗した時にもとに戻せるように…
コマンドはsudo cp /bin/bash /bin/bash_old
sudo cp /bin/sh /bin/sh_old
sudo chmod -x /bin/bash_old
sudo chmod -x /bin/sh_old
そしてmake、installして失敗した…ひとつ手順を抜かしていた
makeする前に先のパッチのコピーが成功しているかどうかも確認しておこう
成功していたらこのようにbash3.2.49.patch〜bash3.2.54.patchのパッチが並んでいる筈だ
ここでfor file in *.patch ; do
patch -p0 < $file
done
とコマンドを打っておく
途中y/nをいくつか聞いてくるがnで進んでリジュームをyで抜けるとうまくいった
先ほど失敗したmake, installのコマンドを実行する
コマンドは./configure --prefix=/ ; make ; sudo make install
結構待たされるが完了したらbash --versionと打ってbashのバージョンを確認する
パッチの適応に失敗したらversion 3.2.48と出るが成功したらversion 3.2.54と出る筈だ
上記の脆弱性検証コードを実行してみる
全滅だったのがひとつをのぞいて全て無効化に成功した
CVE-2014-7187に関しては後日対処する
少し面倒だがPowerPCのMacを引き続きサーバとして使用したいなら必要な手続きだと思う
【追記】Leopard〜SnowLeopardにもパッチを適用する
BBSに「安野遠」さんより指摘いただいた。
『『上記パッチはLion(OS10.5)以上しかサポートしていないためTiger(OS10.4)にはパッチが適用されない』
と書いてあるのですが、
Lionは(OS10.7)ではないかと。』
おっしゃる通りです。
またもやうっかりミスです。
Apple配布のパッチは、OS10.7〜10.9を対象にしていました。
ということは10.5〜10.6のインストール法にも触れないといけない…といっても原則は同じなので10.4でやったのと同じ方法が適用できる。
またBBSに「森本敦」さんからいただいた情報によるとPacifistからインストールファイルを摘出してインストールすれば、10.5、10.6でもインストールできるとのこと。
私のところには検証できる環境がないので、確認できないが「森本敦」さんはSnowLeopard環境でうまくいったとのことだ。
bashアップデートをダウンロードしてきたら、Pacifistで中をのぞくと
インストールすべきディレクトリに必要なファイルが入っているのが分かる
これをそこにインストールする手順は1)bashのインストール先の
ファイルをリネームなどでアーカイブ化してバックアップを取る
2)Pacifistでインストーラを開いて中のサブパッケージの中の
最初の階層のフォルダを全て選択して左上のInstallボタンでインストール
これでサポート外のSnowLeopardでも動いたそうだ
2014年10月1日