2014年9月29日月曜日

【備忘録】bashをソースからパッチをあてて導入

最近bashの致命的な脆弱性で、CGIにてpopenとかsystemコール、sendmailとかやってると、そこ経由でコマンドを実行されてしまうというのが流行ってますよね。
今年はOpenSSLなどホント致命的な脆弱性がてんこ盛りな年ですな...

  • シェルにbashは使わんとこ〜(sh, zsh, tcshとかへ変更)

/etc/passwdを見ると、利用しているシェルが出てきます。
私は普段ルートはsh、ログインが必要なユーザーはtcshにしてます。ですがMacOSXとかbashがルートに使われているものもあり、そういうのは抜けてました。

脆弱性の有無診断


  1. シェルコマンド「env x='() { :;}; echo vulnerable' bash -c "echo this is a test"」
    を叩いて、vulnerableが表示されないこと
  2. CGIスクリプトテスト「BASHの脆弱性でCGIスクリプトにアレさせてみました(ワルブリック株式会社)」

以下、特にソースからbashを入れるときのメモを残しておきますね。

MacOSXの場合(9月30日)

パッチがでました。

これ見る限り、MacOS 10.6はもうサポート対象外なのでしょうね。

パッケージ管理ツールを使っている場合

  • yum update bash

とかお使いのツール経由でアップデートしてください。
ただし、bash --versionでバージョンを確認した上で、

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

でvulnerableが表示されないことは確認を!!

ソースからインストール/アップデートする場合

パッケージでも脆弱性が残ってしまっているなら、ソースからするほうが簡単です。
MacOSXでも簡単ですよん。とはいえパッチ当ては超面倒です。ここではいくつかの短縮コマンドを使います。以下全部コマンドでやります。

curlは入っていると仮定します。
MacOSXの場合には、「プラグインのリポジトリ登録について」P12などを参考に、「Xcode」のインストールと、Xcode上の「Command Line Tools」のインストールをしておいてください。これらによってソースからコンパイルする環境を整えられます。

※MacOSXの場合には、OSアップデートで、/bin/bashは上書きされるでしょう。
その度に確認と修正が必要ですね。。。まぁ早く脆弱性がなおってほしいものですが。

Step 1. 作業用ディレクトリを作成


仮に/usr/local/src/bash にするとします。
  1. mkdir -p /usr/local/src/bash
  2. cd /usr/local/src/bash

Step 2. bash-4.3.tar.gzのダウンロード

  • curl -O https://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz -k

Step 3. bashのパッチ 1-27の27個ダウンロード


頑張れ〜
以下をコピーして、ファイルに保存(download-bash-4.3-patches-001-027.sh)とかにして、sh download-bash-4.3-patches-001-027.sh を実行したら一括でとってくれますよん。

curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-001 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-002 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-003 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-004 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-005 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-006 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-007 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-008 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-009 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-010 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-011 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-012 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-013 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-014 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-015 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-016 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-017 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-018 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-019 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-020 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-021 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-022 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-023 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-024 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-025 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-026 -k
curl -O https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-027 -k

STEP 4. bashソースを展開(解凍)し、パッチをあてる


  1. tar -xzvf bash-4.3.tar.gz
  2. cd bash-4.3
  3. ls ../bash43-* | awk '{print "patch -p0  <  ../"$1}'
    で一度、

     patch -p0 < ../bash43-001
     patch -p0 < ../bash43-002
     patch -p0 < ../bash43-003
     ....
     patch -p0 < ../bash43-027

    が表示されることを確認

    ※MacOSXの場合には、
    ls ../bash43-* | awk '{print "patch -p0  <  "$1}'
    ですね。
  4. ls ../bash43-* | awk '{print "patch -p0 < ../"$1}'  | sh
    ※MacOSXの場合には、
    ls ../bash43-* | awk '{print "patch -p0  <  "$1}'  | sh 
    ですね。
でパッチを一括適応

Step 5. bashのコンパイルとインストール


/usr/local/bin/bash にインストールされるようにします。
標準は、大体/bin/bashであり、アプローチとしては、
/bin/bashをバックアップして、これを削除し、
/bin/bash → /usr/local/bin/bash となるようにシンボリックリンクをはるってことです。
  1. ./configure
     通常は、/usr/local/ 以下にインストールされます。
     いやなら、./configure --prefix=/usr/local/hogehoge
     など変更したらよいかと。ここでは割愛
  2. make
  3. make -n install
     でインストール先を確認(/usr/local 以下にインストールされるかどうか)
  4. sudo make install
     ※root権限か、/usr/local/ 以下に書き込み権限があるユーザーで実行
  5. /usr/local/bin/bash
  6. env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
    でvulnerableが表示されないことを確認
  7. mv /bin/bash  /bin/bash.org
  8. ln -s /usr/local/bin/bash /bin/bash
  9. でターミナルを起動しなおして、
    env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
    でvulnerableが表示されないことを確認



0 件のコメント: