shellshock の脆弱性問題 (CVE-2014-6271 および CVE-2014-7169) を軽減する

更新 -

警告

この軽減策には、正しく実行しないと意図しない問題が発生してしまう変更が含まれてます。したがって、このナレッジで記載されている軽減策を適用するのは、経験が豊富で、変更による影響を完全に理解できるシステム管理者に限定されることが推奨されます。Red Hat がこの軽減策に対して行ったテストは限定的です。

重要: 軽減策が提供されている不具合を修正するパッケージアップデートが利用できる場合は、この軽減策を適用するのは例外的な環境に限定し、アップデートされたパッケージをインストールする代替策としては使用しないでください。Bash を使用している場合は、早急にアップデートパッケージにアップグレードすることが推奨されます。

ネットワークベースの軽減策

ネットワークの軽減策 1: mod_security ルール

以下の mod_security ルールを使用すると、その環境で設定された場合に Bash によって関数定義として解釈される可能性があるデータを含む HTTP 要求を拒否できます。このルールを使用すると、CGI アプリケーションへの攻撃など、web サービスへの攻撃を防ぐことができます。
Request Header 値:

SecRule REQUEST_HEADERS "^\(\s*\)\s+{" "phase:1,deny,id:1000000,t:urlDecode,status:400,log,msg:'CVE-2014-6271 - Bash Attack'"

SERVER_PROTOCOL 値:

SecRule REQUEST_LINE "^\(\s*\)\s+{" "phase:1,deny,id:1000001,status:400,log,msg:'CVE-2014-6271 - Bash Attack'"

GET/POST 名:

SecRule ARGS_NAMES "^\(\s*\)\s+{" "phase:2,deny,id:1000002,t:urlDecode,t:urlDecodeUni,status:400,log,msg:'CVE-2014-6271 - Bash Attack'"

GET/POST 値:

SecRule ARGS "^\(\s*\)\s+{" "phase:2,deny,id:1000003,t:urlDecode,t:urlDecodeUni,status:400,log,msg:'CVE-2014-6271 - Bash Attack'"

アップロードのファイル名:

SecRule FILES_NAMES "^\(\s*\)\s+{"  "phase:2,deny,id:1000004,t:urlDecode,t:urlDecodeUni,status:400,log,msg:'CVE-2014-6271  - Bash Attack'"

これらのルールが誤検出される可能性はありますが、通常は誤検出されることはありません。実際に誤検出が行われると、ログファイルのサイズは非常に大きくなります。

ネットワークの軽減策 2: IPTables ルール

攻撃の手段として、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

攻撃者は、署名確認と一致しないように、パケットごとに 1 つまたは 2 以上の文字列を送ることが簡単にできるため、この方法は強力な回避策ではありません。この脆弱性の影響を受けた時の自動化した試みの概要と、そのログが提供されます。

システムベースの軽減策

shellshock 脆弱性は、Bash シェルを呼び出す前に特別に作成された値を持つ環境変数を作成できる問題です。この変数には、シェルが呼び出されるとすぐに実行されるコードが含まれます。CVE-2014-6271 に対処している最初のパッチは不完全であることが分かりました。CVE-2014-7169 のパッチはこの問題に対処しますが、影響を受ける機能を完全に削除するわけではありません。Bash から影響を受ける機能を完全に削除すると、すべての攻撃は緩和されます。

システムベースの軽減策 1: LD_PRELOAD

LD_PRELOAD は、別の場所にある共有ライブラリを検索し、使用されるライブラリを強制的にロードしてリンクすることで、ランタイムのリンクプロセスによって使用される環境変数です。これにより、一部のシンボルまたは関数が強制的にロードされ、プログラムにビルドインされた関数より優先されます。このコードは、gcc "constructor" 属性セットで新しい関数 "strip_env" を作成します。この属性セットを持つ関数は、main() を入力する前に実行します。詳細については、https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html を参照してください。

ダウンロード: bash_ld_preload.c

  • SHA-256 チェックサムを確認します。
$ sha256sum bash_ld_preload.c
28cb0ab767a95dc2f50a515106f6a9be0f4167f9e5dbc47db9b7788798eef153 
bash_ld_preload.c
  • 以下をコンパイルします。
$ gcc bash_ld_preload.c -fPIC -shared -Wl,-soname,bash_ld_preload.so.1 \
-o bash_ld_preload.so
  • bash_ld_preload.so を /lib にコピーします。
# cp bash_ld_preload.so /lib/

システム全体にこの回避策を適用する場合:

  • /etc/ld.so.preload に以下を追加します。
/lib/bash_ld_preload.so
  • 関連するすべてのサービスを再起動するか、システムを再起動します。

ただし、これは非常に危険であることに注意してください。この回避策は、お使いのシステムで攻撃者が利用できる可能性がある特定のサービスにのみ適用することが推奨されます。これは、サービスを開始するスクリプトの LD_PRELOAD 環境変数に bash_ld_preload.so を追加することで実施できます。ただし、一部の機能 (SUEXEC を使用する httpd) で SUID バイナリを使用するサービスでは有効ではありません。 なぜなら、SUID バイナリは LD_PRELOAD コマンドを受け取らないからです。

  • 以下の 2 行を /etc/init.d/httpd の頭にある shebang 行の後に追加します。
LD_PRELOAD=/lib/bash_ld_preload.so
export LD_PRELOAD
  • httpd.conf を編集して以下のディレクティブを追加し、設定ファイルを保存します。
PassEnv LD_PRELOAD
  • 次に、httpd を再起動します。
# service httpd restart

システムベースの軽減策 2: systemtap

強制的に bash が特権モードを使用するようにすると、この問題を軽減できる場合があります。

bash の debuginfo をインストールします。

$ sudo debuginfo-install bash

systemtap をインストールします。

$ sudo yum install systemtap

以下のコマンドを実行します。

$ nohup sudo stap -g -e '  probe process("/bin/bash").function("initialize_shell_variables") { $privmode=1 }  '

これにより、bash の特権モード (bash -p と同等) は常に有効であることが保証されます。確認するには、オリジナルの脆弱性 (CVE-2014-6271) をテストします。

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

上の例では、影響を受けません。次に、新しい脆弱性 (CVE-2014-7169) をテストします。

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

上の例では、影響を受けません。

特権モードを強制的に有効にすると副次的影響があるため、システム管理者は、以下に示す bash man ページの抜粋を理解しないといけない場合があります。

  -p  Turn on privileged mode.In this mode, the $ENV and $BASH_ENV files
      are not processed, shell functions are not inherited from the
      environment, and the SHELLOPTS, BASHOPTS, CDPATH, and GLOBIGNORE
      variables, if they appear in the environment, are ignored.If the
      shell is started with the effective user (group) id not equal to the
      real user (group) id, and the -p option is not supplied, these
      actions are taken and the effective user id is set to the real user
      id.  If the -p option is supplied at startup, the effective user id
      is not reset.Turning this option off causes the effective user and
      group ids to be set to the real user and group ids.

      (参考訳) 特権モードをオンにします。このモードでは、$ENV 
      および $BASH_ENV ファイルは処理されず、shell 関数を環境
      から受け継ぎません。SHELLOPTS、BASHOPTS、CDPATH、および 
      GLOBIGNORE 変数が環境にある場合は無視されます。実際の
      ユーザー (グループ) id とは異なる有効なユーザー (グループ) 
      id でシェルを開始し、-p オプションが提供されていない場合は
      この操作が行われ、有効なユーザー id が実際のユーザー id 
      に設定されます。起動時に -p オプションが提供されている場合は、
      有効なユーザー id はリセットされません。このオプションをオフに
      すると、有効なユーザー id とグループ id は、実際のユーザーと
      グループ id に設定されます。

このスクリプトは一時的な軽減策であるため再起動後は持続しません。