最近、Bashの脆弱性である「CVE-2014-6271」( SN-2362-1 を参照)に関するニュースが流れています。この影響を受けているかどうか、どのように修正すればよいか、どうして気にする必要があるのかを知るにはどうすればよいですか?
これは、その範囲と重大度のために、この脆弱性に対する標準的な回答として設計されています。
BashはUbuntuのデフォルトの対話型シェルです。端末とのインターフェース(端末エミュレーター、tty、またはsshのいずれか)を使用している場合、通常、bash
が読み取り、実行するコマンドを入力しています。端末をまったく使用しない場合でも、Bashがあります。
Ubuntuでは、/bin/sh
はbashではありません(ダッシュです)。この脆弱性の影響を受けるのはbashのみです。
BashとOSは、現在のログオンユーザー、ハードディスク上のプログラムの検索場所、およびその他の機能を説明する一連の環境変数を追跡します。特定の構造を持つ環境変数を作成することにより、攻撃者は次にBashを起動したときにコードを実行できる可能性があります。
攻撃者はその環境変数を複数の方法で設定できます。
ForceCommand
オプションの使用は攻撃ベクトルです。シェルがbashでないアカウントは影響を受けません。彼らがこの変数を設定すると、次回bash
がany 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.4
、4.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が生成されたときにのみ作用するように見えますが、可能であればすぐに再起動することをお勧めします。
これを 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から呼び出すことができます!!
注: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
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"
私は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/control
のtexlive
:への依存関係を回避するために、次の変更を行いました。
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