bashの脆弱性(CVE-2014-6271, CVE-2014-7169)
- CVE - CVE-2014-6271
- Bash Code Injection Vulnerability via Specially Crafted Environment Variables (CVE-2014-6271, CVE-2014-7169) - Red Hat Customer Portal
$ env x='() { :;}; echo vulnerable' bash -c "echo hoge" vulnerable hoge
シェル起動時に環境変数を処理しようとしている所で、ある環境変数Xが
() {
の4文字で始まる場合、
X () { ...
という文字列にしてevalしている。関数定義を環境変数経由で行うためだと思われるが、evalしているので関数定義の部分以外もevalしてして実行してしまう。
そのため、外部の入力を環境変数に設定してシェルを起動ということをしているソフトはこの脆弱性に該当する可能性がある。
例えば、CGIはヘッダをHTTP_*環境変数にセットするのでbashで記述されたCGIは該当する。bash以外のperlやpythonやrubyで書かれていても、環境変数を引き継いで子プロセスとしてbashを起動していると該当。つまりsystem/popen関数を使っているとアウトの可能性が高い。ただし、各言語の仕様を読んだほうが良い。
perlの場合、systemはshellのメタキャラクタを含まないとexecvpで実行する。そのためメタキャラクタを含まない文字列に対してsystemを実行している場合は今回の脆弱性に該当しない
Perlの組み込み関数 system の翻訳 - perldoc.jp
- system LIST
- system PROGRAM LIST
- ... スカラの引数が一つだけの場合、引数はシェルのメタ文字をチェックされ、もし あればパースのために引数全体がシステムコマンドシェル (これは Unix プラットフォームでは /bin/sh -c ですが、他のプラットフォームでは 異なります)に渡されます。 シェルのメタ文字がなかった場合、引数は単語に分解されて直接 execvp に 渡されます; この方がより効率的です。
リンク先にあるようにdhclientやopensshも該当するらしい。外部の入力を環境変数にセットするというのはありえなくもないので、さらに他のソフトで脆弱性が見つかる可能性は十分ありそう。
基本的にアップデートした方が良いが、本家のbashで公開されているパッチは不十分らしい。かつUbuntuやCentOSのパッチもこれを元にしている。
それについては以下などに書かれているがまだ確認していない
- CVE-2014-7169
- Bug 1146319 – CVE-2014-7169 bash: code execution via specially-crafted environment (Incomplete fix for CVE-2014-6271)
- oss-security - Re: CVE-2014-6271: remote code execution through bash
そもそも'() {'の4文字で開始するときの特殊な処理が必要な機能なのかという気もするが。