てきとうなメモ

本の感想とか技術メモとか

bashの脆弱性(CVE-2014-6271, CVE-2014-7169)

これはひどい

こんな感じで環境変数に設定したスクリプトを実行してしまう。

$ env x='() { :;}; echo vulnerable' bash -c "echo hoge"
vulnerable
hoge

シェル起動時に環境変数を処理しようとしている所で、ある環境変数Xが

() {

の4文字で始まる場合、

X () { ...

という文字列にしてevalしている。関数定義を環境変数経由で行うためだと思われるが、evalしているので関数定義の部分以外もevalしてして実行してしまう。

そのため、外部の入力を環境変数に設定してシェルを起動ということをしているソフトはこの脆弱性に該当する可能性がある。

例えば、CGIはヘッダをHTTP_*環境変数にセットするのでbashで記述されたCGIは該当する。bash以外のperlpythonrubyで書かれていても、環境変数を引き継いで子プロセスとしてbashを起動していると該当。つまりsystem/popen関数を使っているとアウトの可能性が高い。ただし、各言語の仕様を読んだほうが良い。

perlの場合、systemはshellのメタキャラクタを含まないとexecvpで実行する。そのためメタキャラクタを含まない文字列に対してsystemを実行している場合は今回の脆弱性に該当しない

system LIST
system PROGRAM LIST
... スカラの引数が一つだけの場合、引数はシェルのメタ文字をチェックされ、もし あればパースのために引数全体がシステムコマンドシェル (これは Unix プラットフォームでは /bin/sh -c ですが、他のプラットフォームでは 異なります)に渡されます。 シェルのメタ文字がなかった場合、引数は単語に分解されて直接 execvp に 渡されます; この方がより効率的です。
Perlの組み込み関数 system の翻訳 - perldoc.jp

リンク先にあるようにdhclientやopensshも該当するらしい。外部の入力を環境変数にセットするというのはありえなくもないので、さらに他のソフトで脆弱性が見つかる可能性は十分ありそう。

基本的にアップデートした方が良いが、本家のbashで公開されているパッチは不十分らしい。かつUbuntuCentOSのパッチもこれを元にしている。

それについては以下などに書かれているがまだ確認していない

そもそも'() {'の4文字で開始するときの特殊な処理が必要な機能なのかという気もするが。