web-dev-qa-db-ja.com

CVE-2014-6271 bashの脆弱性(Shellshock)とは何ですか?どうすれば修正できますか?

最近、Bashの脆弱性である「CVE-2014-6271」( SN-2362-1 を参照)に関するニュースが流れています。この影響を受けているかどうか、どのように修正すればよいか、どうして気にする必要があるのか​​を知るにはどうすればよいですか?

これは、その範囲と重大度のために、この脆弱性に対する標準的な回答として設計されています。

141
hexafraction

Bashとは何ですか?

BashはUbuntuのデフォルトの対話型シェルです。端末とのインターフェース(端末エミュレーター、tty、またはsshのいずれか)を使用している場合、通常、bashが読み取り、実行するコマンドを入力しています。端末をまったく使用しない場合でも、Bashがあります。

Ubuntuでは、/bin/shはbashではありません(ダッシュです)。この脆弱性の影響を受けるのはbashのみです。

エクスプロイトはどのように影響しますか?

BashとOSは、現在のログオンユーザー、ハードディスク上のプログラムの検索場所、およびその他の機能を説明する一連の環境変数を追跡します。特定の構造を持つ環境変数を作成することにより、攻撃者は次にBashを起動したときにコードを実行できる可能性があります。

攻撃者はその環境変数を複数の方法で設定できます。

  • Git over sshなどの特定のセットアップを使用して、SSHなどのサービスにリモートで接続します。 Mitreが警告しているように、sshd ForceCommandオプションの使用は攻撃ベクトルです。シェルがbashでないアカウントは影響を受けません。
  • 環境変数を設定するようにだまします。
  • 別のプログラムに環境変数を設定させ、その細工された値を持たせる。たとえば、特定のユーザーコンテンツで環境変数を設定する必要があるWebサーバーとスクリプトがあるとします。そのスクリプトが独自に作成し、他の環境変数に触れていなくても、それで十分です。 任意の名前と細工された値を持つ単一の環境変数は、エクスプロイトが成功するのに十分です
  • ここで言及していない他の方法。

彼らがこの変数を設定すると、次回bashany reasonで開くと、攻撃者のコードが実行されます。これはSudo -sで特に恐ろしいことです。スーパーユーザー(コンピューターのデータとプログラムをfull制御する管理ユーザールール)としてbashを生成するためです。 bashを標準ユーザーとしてのみ起動した場合でも、そのユーザーのファイルは削除できます。

自分でbashを使用しなくても、多くのプログラムは操作の一部としてbashを自動的に生成することに注意することが重要です。この場合でも、あなたは脆弱です。ただし、Ubuntuの/bin/shはbashではないため、デフォルトのスクリプトシェルではなくbashを明示的に呼び出すプログラムのみが影響を受けます。

Mitreによると:

openSSH sshdのForceCommand機能、Apache HTTPサーバーのmod_cgiおよびmod_cgidモジュール、不特定のDHCPクライアントによって実行されるスクリプト、および環境の設定がBash実行から特権境界を越えて発生するその他の状況を含むベクトル。

私は脆弱ですか?

Dpkgを使用して、インストールされているパッケージのバージョンを確認します。

dpkg -s bash | grep Version

これにより、bashパッケージに関する情報が検索され、バージョンのみが表示されるように出力がフィルタリングされます。修正されたバージョンは 4.3-7ubuntu1.44.2-2ubuntu2.5、および4.1-2ubuntu3.4です。

たとえば、私は見ます:

wlan1-loopback% dpkg -s bash | grep Version
Version: 4.3-7ubuntu1.4

そして、私は脆弱ではないと判断できます。

更新するにはどうすればよいですか?

標準のアップデートマネージャーがこのアップデートを提供します。これは、使用しているOSの種類や保守の程度に関係なく、セキュリティ更新プログラムがどのように重要であるかの典型的な例です。

SN Bulletin は、Ubuntu 14.04 Trusty Tahr、12.04 Precise Pangolin、および10.04 Lucid Lynxの新しいバージョンがリリースされたことを示しています。これらのLTSバージョンのいずれかを使用していないが、かなり新しいバージョンを使用している場合は、ほとんどの場合、パッチが適用されたパッケージを見つけることができます。

まず、あなたが

脆弱な場合は、最初に最新のパッケージリストを取得する必要があります。

Sudo apt-get update && Sudo apt-get install bash

最初のコマンドは、修正バージョンを含む最新のパッケージリストがあることを確認し、2番目のコマンドはbashの最新(修正済み)バージョンをインストールします。

バグはbashが生成されたときにのみ作用するように見えますが、可能であればすぐに再起動することをお勧めします。

126
hexafraction

これを Hacker Newsで盗み見 から盗みました。 me(Odroid-XU)のようなリポジトリに問題がある場合、ソースからパッチ/ビルドしたい場合、これはうまく機能するはずです。

TMPDIR=/tmp/bash-src
mkdir $TMPDIR
cd $TMPDIR
#download bash
wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
#download all patches
for i in $(seq -f "%03g" 1 999); do 
  wget http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i
  if [[ $? -ne "0" ]]; then
    MAX=$(expr $i - 1)
    break;
  fi
done
tar zxf bash-4.3.tar.gz 
cd bash-4.3
#apply all patches
for i in $(seq -f "%03g" 1 $MAX);do
  echo apply patch bash43-$i
  patch -p0 < ../bash43-$i
done
#build and install
./configure && make
Sudo make install
cd ../..
rm -r $TMPDIR

次に実行します:

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

そして、あなたが得るなら:

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test

その後、あなたはすべて元気です!


警告:make installは/usr/local/binにbashをインストールするため、/bin/bashは変更されず、curlから呼び出すことができます!!

27
Bobby Saget

注:CVE-2014-7169のセキュリティパッチは、標準のセキュリティアップデートとしてリリースされています。このパッチを受け取るために追加のPPAを追加する必要はありません。以下のみが必要です。

Sudo apt-get update

Sudo apt-get upgrade

Bashに正しくパッチを適用したことを確認するには、次のコマンドを実行します

dpkg -s bash | grep Version

14.04 LTSを使用している場合、次の出力が表示されます。

Version: 4.3-7ubuntu1.4

12.04 LTSを使用している場合、出力は次のようになります。

 Version: 4.2-2ubuntu2.5
9
branch.lizard

11.04を使用している場合:以下の手順を使用します(私にとってはうまくいきました)

cd ~/
mkdir bash
wget https://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
for i in $(seq -f "%03g" 0 25); do wget https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done

必要なパッチがダウンロードされていない場合は、ftpパッケージをインストールします

apt-get install ftp
for i in $(seq -f "%03g" 0 25); do wget https://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done
tar zxvf bash-4.3.tar.gz
cd bash-4.3
for i in $(seq -f "%03g" 0 25);do patch -p0 < ../bash43-$i; done
./configure && make && make install
apt-get install build-essential
./configure && make && make install

パッチが適用されたかどうかを確認するには:

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

私はEOLであるNatty 11.04を使用しています(そして、/ etc/apt/sources.listをold-releases.ubuntu.comを使用するように更新しました)ので、ソースからビルドする必要があります。 .debをビルドしたかったので、少なくともパッケージ管理は「認識」され、bashバージョンはデフォルトではありません。 100%成功したわけではありません-ただし、パッケージは「新しい」として登録され、bashバイナリは修正されてしまいます。

apt-get source bash
wget https://Gist.githubusercontent.com/drj11/e85ca2d7503f28ebfde8/raw/31bd53ed2e47b220d3c728f5440758e0f76769de/gistfile1.c -O bash_CVE-2014-6271.patch
wget https://Gist.githubusercontent.com/drj11/239e04c686f0886253fa/raw/046e697da6d4491c3b733b0207811c55ceb9d927/gistfile1.c -O bash_CVE-2014-6271_plus.patch
cd bash-4.2/

さて、(サブ)ディレクトリbash-4.2/には、_bashソースに到達するために解凍する必要があるファイルbash-4.2.tar.xzがあります。およびdebianというサブディレクトリ。

bash-4.2/debian/controltexlive:への依存関係を回避するために、次の変更を行いました。

Source: bash
...
Build-Depends: autoconf, autotools-dev, patch, bison, libncurses5-dev,
# texinfo, debhelper (>= 5), texi2html, locales, gettext, sharutils, time, xz-ut
ils
 debhelper (>= 5), locales, gettext, sharutils, time, xz-utils
# Build-Depends-Indep: texlive-latex-base, ghostscript
Build-Depends-Indep: ghostscript

...およびbash-4.2/debian/rules

binary-doc: bash-install #bash-doc-build
        dh_testdir
        dh_testroot
        mkdir -p $(d_doc)/usr/share/doc/$(p)
        dh_installdocs -p$(p_doc) 
ifeq ($(with_gfdl),yes)
        #cp -p build-bash/doc/bashref.pdf $(d_doc)/usr/share/doc/$(p)/.
        #dh_link -p$(p_doc) \
        #    /usr/share/doc/$(p)/bashref.pdf /usr/share/doc/$(p_doc)/bashref.pdf
else
        rm -f $(d_doc)/usr/share/doc-base/bashref
endif
        rm -f $(d_doc)/usr/share/info/dir*
        #cp -p build-bash/doc/bash.html build-bash/doc/bash.pdf \
        #    $(d_doc)/usr/share/doc/$(p)/
        #dh_link -p$(p_doc) \
        #    /usr/share/doc/$(p)/bash.html /usr/share/doc/$(p_doc)/bash.html \
        #    /usr/share/doc/$(p)/bash.pdf /usr/share/doc/$(p_doc)/bash.pdf
        dh_installchangelogs -p$(p_doc) bash/CWRU/changelog
        ...

バージョンを変更するには、このbash-4.2/ディレクトリで、次を実行します。

bash-4.2$ dch --local patchCVE

...そして、求められたら、変更ログにメモを記入します。これにより、.deb(および関連するメタデータ)が(私の場合は)bash_4.2-0ubuntu3patchCVE1_i386.debと呼ばれるようになります。

その後、dpkg-buildpackage -us -ucまたはdebuildコマンドを使用してビルドを試すことができます。注-これらのいずれかは、Zipからソースを再解凍します-したがって、あなたが持っていたかもしれないパッチを上書きします!それでも、これらのいずれかを1回実行して、ソースをアンパックしてビルドします(debuildはtexliveにより最終的に失敗する場合がありますが、ソースをアンパックしてビルドする必要があります)。

次に、パッチを適用します。現在-p1ディレクトリにいるため、ここでbash-4.2/を使用する必要があります。

bash-4.2$ patch -p1 < ../bash_CVE-2014-6271.patch 
bash-4.2$ patch -p1 < ../bash_CVE-2014-6271_plus.patch 

次に、次を実行して、パッチを適用したバージョンを再構築します。

bash-4.2$ fakeroot debian/rules build 

これにより、実行可能ファイルが再構築されます。テストするには:

bash-4.2$ env VAR='() { :;}; echo Bash is vulnerable!' ./build-bash/bash -c "echo Bash Test"

.debファイルをビルドするには、次を実行します。

bash-4.2$ fakeroot debian/rules binary

これにより、親ディレクトリに.debファイルが保存されます。内容をリストするには:

bash-4.2$ dpkg -c ../bash_4.2-0ubuntu3patchCVE1_i386.deb

.debをインストールするには:

bash-4.2$ Sudo dpkg -i ../bash_4.2-0ubuntu3patchCVE1_i386.deb

ただし、何らかの理由で、この.debにはパッチが適用されていないバイナリ(?!)が含まれているため、さらに次の操作を行う必要がありました。

bash-4.2$ Sudo cp bash-4.2/build-bash/bash /bin/

...そしてその後、テストは私のために正しく合格し始めました:

$ env VAR='() { :;}; echo Bash is!' bash -c "echo Bash Test"
bash: warning: VAR: ignoring function definition attempt
bash: error importing function definition for `VAR'
Bash Test
0
sdaau