labunix's blog

labunixのラボUnix

「CVE-2014-6271」、「CVE-2014-7169」について調べてみた(Debian Wheezy)

■「CVE-2014-6271」、「CVE-2014-7169」について調べてみた(Debian Wheezy)

 bashが広く普及していることから、
 bashバグ(bash bug)、シェルショック(ShellShock)とも呼ばれる。

■「CVE-2014-7169」は「CVE-2014-6271」で修正されていなかった修正。
 下記のテストコードは「sh」の実態が「bash」である環境の場合。
 Debianでは、「sh」の実態は「dash」である環境のため、
 そのままでは再現しないので注意。

 https://twitter.com/taviso/status/514887394294652929

■IPAの情報

 bash の脆弱性対策について(CVE-2014-6271 等)
 https://www.ipa.go.jp/security/ciadr/vul/20140926-bash.html

■JPCERTCCの注意喚起

 GNU bash の脆弱性に関する注意喚起
 https://www.jpcert.or.jp/at/2014/at140037.html

■概要
 以下より抜粋

 2014年9月26日号 14.10の開発・“shellshock”とその対応・UWN#384
 http://gihyo.jp/admin/clip/01/ubuntu-topics/291409/26

 環境変数に悪意ある細工が施された文字列が含まれた状態でbashが実行されると、
 攻撃者が与えた任意のコマンドが実行できてしまう

■SSH等のログインシェルやWeサーバが呼び出すCGI等で
 bashが使われていると該当します。

 bashの脆弱性がヤバすぎる件 
 https://x86-64.jp/blog/CVE-2014-6271

■確認方法
 Redhatの情報がきちんとまとめられている。

 bashの脆弱性(CVE-2014-6271) #ShellShock の関連リンクをまとめてみた
 http://d.hatena.ne.jp/Kango/20140925/1411612246

 Bash Code Injection Vulnerability via Specially Crafted Environment Variables (CVE-2014-6271, CVE-2014-7169)
 https://access.redhat.com/articles/1200223

 特別に作成された環境変数を使用した Bash コード挿入の脆弱性 (CVE-2014-6271)
 https://access.redhat.com/ja/articles/1210893

■更新前のDebian Wheezyで確認
 CVE-2014-6271の脆弱性の影響を受ける対象である。

$ cat /etc/debian_version 
7.6

$ bash -version | head -1
GNU bash, バージョン 4.2.37(1)-release (x86_64-pc-linux-gnu)

$ env x='() { :;}; echo Vulnerable CVE-2014-6271' bash -c "echo this is a test"
Vulnerable CVE-2014-6271
this is a test

■「CVE-2014-6271」単体の脆弱性チェック

$ env 'x=() { :;}; echo Vulnerable CVE-2014-6271' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"
Vulnerable CVE-2014-6271
bash: BASH_FUNC_x(): 行 0: 予期しないトークン `)' 周辺に構文エラーがあります
bash: BASH_FUNC_x(): 行 0: `BASH_FUNC_x() () { :;}; echo vulnerable'
bash: `BASH_FUNC_x' の関数定義をインポート中にエラーが発生しました
test

$ export LANG=C; \
  env 'x=() { :;}; echo Vulnerable  CVE-2014-6271' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"
Vulnerable  CVE-2014-6271
bash: BASH_FUNC_x(): line 0: syntax error near unexpected token `)'
bash: BASH_FUNC_x(): line 0: `BASH_FUNC_x() () { :;}; echo vulnerable'
bash: error importing function definition for `BASH_FUNC_x'
test

■「CVE-2014-7169」単体の脆弱性チェック

$ env X='() { (a)=>\' bash -c "echo date"; cat echo
bash: X: 行 1: 予期しないトークン `=' 周辺に構文エラーがあります
bash: X: 行 1: `'
bash: `X' の関数定義をインポート中にエラーが発生しました
2014年  9月 26日 金曜日 21:23:25 JST

$ export LANG=C; env X='() { (a)=>\' bash -c "echo date"; cat echo
bash: X: line 1: syntax error near unexpected token `='
bash: X: line 1: `'
bash: error importing function definition for `X'
Fri Sep 26 21:24:32 JST 2014

■脆弱性のあるbashをインストールしている

$ dpkg -l bash* | grep ^ii | awk '{printf "%-20s%-20s%-12s\n",$2,$3,$4}'
bash                4.2+dfsg-0.1        amd64       
bash-completion     1:2.0-1             all         

■shの参照先はdash

$ readlink /bin/sh
dash

■外部サービスを提供している場合、ロード中のプロセスに含まれる
 bashの文字列すべてが調査対象となる可能性がある。

$ sudo find /proc/*/exe -exec strings {} \; 2>&1 | grep bash | wc -l
144

■共有ライブラリの出力にbashが含まれていないこと。
 ただし、bashを別名で呼び出している場合は除く。

$ sudo strings /proc/*/maps | awk '{print $6}' | grep bash
/bin/bash
/bin/bash
/bin/bash
/usr/share/locale/ja/LC_MESSAGES/bash.mo

■回避策と対応
 こちらもRedhatの情報が詳しい。

 対応:脆弱性修正版へ更新
 回避:他シェル使用
    フィルタリング
    アクセス制限

 Mitigating the shellshock vulnerability (CVE-2014-6271 and CVE-2014-7169)
 https://access.redhat.com/articles/1212303

■フィルタリングについて
 iptablesの場合

# iptables -A INPUT -m string --algo bm --hex-string '|28 29 20 7B|' -j DROP
# ip6tables -A INPUT -m string --algo bm --hex-string '|28 29 20 7B|' -j DROP

■Apache2の「mod_security」を使用
 Redhatも回避ではなく、アップデートを推奨している。

 特別に作成された環境変数を使用した Bash コード挿入の脆弱性 (CVE-2014-6271)
 https://access.redhat.com/ja/articles/1210893

■フィルタリングしてもロード中のプロセスや共有メモリまで
 深く探っているとキリがないので、bashを含めてアップデートをしましょう。

$ grep security /etc/apt/sources.list
deb http://security.debian.org/ wheezy/updates main
deb-src http://security.debian.org/ wheezy/updates main

$ for opt in update upgrade autoremove autoclean ;do sudo apt-get $opt -y ;done
...
apt apt-utils bash libapt-inst1.5 libapt-pkg4.12 libnss3 libnss3-1d
...

■「changelog.Debian.gz」の確認

$ dpkg -L bash | grep change | xargs lv -z | grep "CVE-2014-7169\|CVE-2014-6271"
  * Add CVE-2014-7169.diff diff.
    CVE-2014-7169: Incomplete fix for CVE-2014-6271. (Closes: #762760, #762761)
  * Apply patch from Chet Ramey to fix CVE-2014-6271.

■「CVE-2014-6271」、「CVE-2014-7169」の対応後の確認。

$  bash -version | head -1
GNU bash, バージョン 4.2.37(1)-release (x86_64-pc-linux-gnu)

$ env x='() { :;}; echo Vulnerable CVE-2014-6271' bash -c "echo this is a test"
this is a test

$ env 'x=() { :;}; echo Vulnerable  CVE-2014-6271' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `BASH_FUNC_x'
test

$ export LANG=ja_JP.UTF-8; \
  env 'x=() { :;}; echo Vulnerable  CVE-2014-6271' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"
bash: 警告: x: ignoring function definition attempt
bash: `BASH_FUNC_x' の関数定義をインポート中にエラーが発生しました
test

$ export LANG=C; env X='() { (a)=>\' bash -c "echo date"; cat echo
date
cat: echo: No such file or directory

■ロード中のプロセスや共有メモリにあるbashのためにシステムの再起動を推奨。

$ sudo shutdown -r now && exit