しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Web サイトと bash の脆弱性 (CVE-2014-6271) について調べてみた

世間では iOS 8.0.1 のバグと bash の脆弱性が話題になっています。そこで気になるのが Azure Web サイトにも bash がインストールされていて、普通に使える状態になっている点です。

やはり Web サイト界の赤い(鳥帽子)の男としては気になるので、少し調べてみました。まずは今回の脆弱性についてよくまとまっているこちらの記事を参考に、インストールされている bash が対象バージョンなのか確認してみました。

簡易的なチェックでは、以下のコマンドを実行するだけで分かるらしいので、早速 Kudu から叩いてみます。

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

実行した結果はこっち。残念ながら脆弱性を含むバージョンがインストールされているようです。

f:id:shiba-yan:20140927000812p:plain

ちなみに Web サイトの bash は msysgit と同時にインストールされているものになります。バージョンはこんな感じで、そこそこ古いものが載ってます。

f:id:shiba-yan:20140927142915p:plain

既にいろんな検証方法が公開されているようですが、試すのが簡単そうな以下の方法を行ってみます。

まずは同じように PHP で試したところ、exec 関数で bash を使ったシェルスクリプトの実行はシステムに止められてしまいました。

PHP Warning:  exec(): Unable to fork ["D:\Program Files (x86)\Git\bin\bash.exe" D:\home\site\wwwroot\test.sh] in D:\home\site\wwwroot\test.php on line 6

軽く検索してみると、cmd 周りを実行する行為をシステム側で禁止しているようです。

PHP - Warning: exec(): Unable to fork

というわけで、Azure Web サイトでは bash を使おうとしても、そもそも動かないので安全だと言えますね。

これだとあまりにも内容が無いので、とりあえず sh を CGI として動くようにして試します。

<?xml version="1.0"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="bash"
           path="*.sh" verb="*"
           modules="CgiModule" scriptProcessor='"D:\Program Files (x86)\Git\bin\bash.exe" "%s" %s'
           resourceType="Unspecified" />
    </handlers>
    <cgi createProcessAsUser="false" />
  </system.webServer>
</configuration>

これを Web.config として保存すれば、Web サイトでも *.sh なファイルを CGI として動かせます。良い子は真似をしてはいけません。

そして、curl から怪しげな User-Agent を付けてリクエストを投げてみます。

curl -s -A "() { :;}; echo 'Content-type: text/plain';echo;echo hogehoge;" http://****.azurewebsites.net/test.sh

すると、見事に User-Agent につけたコマンドが実行されました。やったね。

f:id:shiba-yan:20140927151952p:plain

しかし、普通に考えて Azure Web サイトでシェルスクリプトを CGI として公開している人はいないと思うので、この方法は現実的ではありません。

1 つ気になるのが、Web サイトの WebJobs では、標準で bash を使ったシェルスクリプトの実行を許可している点です。検証のために WebJobs として sh ファイルを登録して、curl からそれっぽいリクエストを投げてみました。

curl -u user:pass -d "" -X POST -A "() { :;}; echo Content-type:text/plain;echo;cat test.sh" https://****.scm.azurewebsites.net/api/triggeredwebjobs/bash/run

実行結果はこんな感じです。IIS のプロセスと WebJobs の実行プロセスは分離されているようで安心です。

f:id:shiba-yan:20140927144350p:plain

念のためにソースを確認してみると、環境変数は独立した別のものとして WebJobs のプロセスを上げるようになっていました。結論としては bash の脆弱性の影響を Azure Web サイトは受けないということでした。

影響を受けるバージョンの bash も気が付かない間にアップデートされるでしょう。PaaS ですからね。

追記

Azure 界の抱かれたい男 No.1 こと @kamebuchi 氏から、このリンクも載せてくれと言われたので追記とステマをすることにしました。

恐らく No.1 がメールで聞いたのでしょう、David Ebbo から以下の Stack Overflow の回答を教えてもらったようです。

Impact of BASH bug on Azure Websites, Cloud Services and SQL Database? - Stack Overflow

要約すると「Azure Web サイトは bash の脆弱性の影響を受けないが、CGI とかで bash 叩けるようなことをするな。念のためにも bash は更新する予定。」ということでした。