最近、Bashの脆弱性である「CVE-2014-6271」(USN-2362-1を参照)に関するニュースが流れています。この影響を受けているかどうか、どのように修正すればよいか、どうして気にする必要があるかを知るにはどうすればよいですか
これは、その範囲と重大度のために、この脆弱性に対する標準的な回答として設計されています。
最近、Bashの脆弱性である「CVE-2014-6271」(USN-2362-1を参照)に関するニュースが流れています。この影響を受けているかどうか、どのように修正すればよいか、どうして気にする必要があるかを知るにはどうすればよいですか
これは、その範囲と重大度のために、この脆弱性に対する標準的な回答として設計されています。
回答:
BashはUbuntuのデフォルトの対話型シェルです。端末とのインターフェースをとるとき(端末エミュレーター経由、tty経由、またはsshのいずれか)、通常bash
、読み取りと実行を行うコマンドを入力します。端末をまったく使用しない場合でも、Bashがあります。
Ubuntuでは、/bin/sh
bash ではありません(ダッシュです)。この脆弱性の影響を受けるのはbashのみです。
BashとOS は、現在ログオンしているユーザー、ハードディスク上のプログラムの検索場所、およびその他のそのような機能を記述する環境変数のセットを追跡します。特定の構造を持つ環境変数を作成することにより、攻撃者は次にBashを起動したときにコードを実行できる可能性があります。
攻撃者はその環境変数を複数の方法で設定できます。
ForceCommand
オプションの使用は攻撃ベクトルです。シェルがbashでないアカウントは影響を受けません。彼らがこの変数を設定bash
すると、何らかの理由で次回開いたときに、攻撃者のコードが実行されます。これはsudo -s
、スーパーユーザー(コンピューターのデータとプログラムを完全に制御できる管理ユーザールール)として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を使用している場合でも、どのように適切に管理されている場合でも、セキュリティ更新がどのように重要であるかの典型的な例です。
USN速報は、新しいバージョンはUbuntuの14.04トラスティタール、12.04正確なセンザンコウ、および10.04明晰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はbashをインストールするため/usr/local/bin
、/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を使用しています(および、old-releases.ubuntu.comを使用するように/etc/apt/sources.listを更新しています)ので、ソースからビルドする必要があります。.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-4.2.tar.xz
、bash
ソースに到達するために解凍する必要のあるファイルがあります。と呼ばれるサブディレクトリdebian
。
の依存関係を回避するために、次の変更を行いtexlive
ましたbash-4.2/debian/control
。
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