先日のセキュリティファイリングCVE-2014-6271で,子プロセスに渡される環境変数に設定された任意のコードを実行可能な,リモートエクスプロイトが発見された。環境変数を通じてWebサーバから子プロセスにCGIスクリプトが転送されて,それが脆弱性を持つバージョンのBashによって実行されるようなケースが考えられる。
DebianとRedHatはすでにアップデートバイナリを提供している。他のオペレーティングシステムベンダについても,間もなくこれらに追随するものと思われる。Appleは攻撃に対して脆弱性のある,非常に古いバージョンのBashを使用しているが,現段階では同社からアップデートの発表は行われていない。
この脆弱性は,環境変数に渡される値によって引き起こされる。
env x='() { :;}; echo vulnerable'
新たに/bin/bashプロセスが起動されるとこのコードが実行されて,コンソールに文字が表示される。この問題は,Bashシェルがこの環境変数を正しく解析できていないことにある。その結果,セミコロン以後のコードが誤って実行されてしまうのだ。Bash(あるいは"/bin/sh"が"/bin/bash"のシンボリックリンクの場合は"/bin/sh")で実行されるCGIスクリプトは,ごく普通にそのコードを実行することになる。
リモートアタックの攻撃者はこれを,CGIスクリプトに引数としてエクスポートされる(USER変数などの)不正なコンテントを渡すために利用する。これがBashスクリプトであれば,マシンで実行中のプロセスをすべてコントロールすることも可能になるだろう。
Bashの開発者が提供している詳細情報は,要約すると次のようなものだ。
脆弱性の技術的な詳細は以下のとおりです。
Bashはシェル変数だけではなく,シェル関数も,プロセス変数を経由して(間接的に)子プロセスにエクスポートする機能をサポートしています。現在のバージョンでは,関数名を変数の名前,"() {"で始まる関数定義を変数の値とする環境変数を使用することで,環境を通じて関数定義を伝搬しています。脆弱性が発生するのは,bashが,関数定義の処理を終了した後も処理を止めないためです。関数定義に続くシェルコマンドも解析されて,実行されてしまうのです。例えば,次のような内容を設定した環境変数
VAR=() { ignored; }; /bin/idがbashプロセスにインポートされると, /bin/idが実行されます。(Bashプロセスは,この時点ではまだ部分的に未定義な状態にあります。
PATH変数がまだ設定されていない可能性があるので,/bin/idを実行後にクラッシュするかも知れません。ですが,その時点ですでにダメージは発生しているのです。)コマンドを後ろに付けた悪意のある関数定義のキャリアとして,任意の名称の環境変数が使用可能であるという事実が,この脆弱性を極めて深刻なものにしています。ネットワークをベースとした悪用が可能だからです。
REMOTE_HOSTやTERMなどの環境変数を使用することで,HTTPとSSHのいずれでも脆弱性の存在する可能性がある。
インターネットに接続されたシステムを担当する開発者や運用関係者は,すでにその実施が報じられているとおり,速やかにBashをアップグレードするか,あるいは考え得る攻撃を軽減する措置を取ることが必要だ。以下のバージョンのBashに対しては,パッチが提供されている。
http://ftp.gnu.org/pub/gnu/bash/bash-3.0-patches/bash30-017 http://ftp.gnu.org/pub/gnu/bash/bash-3.1-patches/bash31-018 http://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-052 http://ftp.gnu.org/pub/gnu/bash/bash-4.0-patches/bash40-039 http://ftp.gnu.org/pub/gnu/bash/bash-4.1-patches/bash41-012 http://ftp.gnu.org/pub/gnu/bash/bash-4.2-patches/bash42-048 http://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-025