セキュリティを楽しく学ぶ、触れる。セキュリティごった煮ブログ

ネットエージェント
セキュリティごった煮ブログ

 コース:元祖こってり

「元祖こってり」記事はネットエージェント旧ブログ[netagent-blog.jp]に掲載されていた記事であり、現在ネットエージェントに在籍していないライターの記事も含みます。

bashにおける脆弱性「Shellshock」について

長谷川陽介

LinuxやMac OS XなどのUNIX系OSで広く使用されているbashに見つかった脆弱性(Shellshockと呼ばれています)が先日から話題になっています。
弊社でもこのbashの脆弱性について調査を行いました。

■概要
環境変数に特定の文字列を設定するだけでその環境変数内の文字列をシェルが関数として実行してしまいます。
シェルを通じてコマンド等を実行する幅広い環境で影響がありますが、特に顕著に影響を受けるのはCGI等のWebアプリケーション環境です。
CGIをはじめとするWebアプリケーションではWebブラウザからのHTTPリクエストヘッダなどに含まれる各種の情報を環境変数を通じて取得するため、攻撃にも応用しやすいからです。

今回の脆弱性は、攻撃者にとっては非常に簡単な方法で攻撃が可能であり、現在すでにこの脆弱性を利用した攻撃が広く観測されているため、早急に対応が必要となります。
特に、CentOSではデフォルトで/bin/shがbashへのシンボリックリンクとなっており、影響を受けやすいため注意が必要です。

■脆弱性のあるbashかどうかの確認方法
コマンドライン上で
$ X='() { :;}; echo vuln' bash -c 'echo'
を実行します。このとき、画面に vuln の文字列が表示されるようであればお使いのbashは脆弱性のあるバージョンとなります。

※vuln の文字列が表示されない場合であっても、脆弱性に対応するために現在リリースされているパッチでは修正が不十分という可能性もありますので、ベンダの情報やJPCERT/CCによる緩和策等を参考にしてください。

参考: GNU bash の脆弱性に関する注意喚起(JPCERT/CC)

■攻撃有無の簡易的な確認
Webサーバのアクセスログから「() {」という文字列を含むリクエストが存在していないかを調べます。

[root@www httpd]# grep '() {' access_log
2xx.1xx.2xx.7x - - [25/Sep/2014:07:15:16 +0900] "GET / HTTP/1.0" 200 2217 "() { :; }; ping -c 11 2xx.xxx.xxx.7x" "shellshock-scan (http://blog.*********.com/2014/09/bash-shellshock-scan-of-internet.html)"
2xx.1xx.2xx.7x - - [25/Sep/2014:13:41:18 +0900] "GET / HTTP/1.0" 200 2217 "() { :; }; ping -c 11 2xx.xxx.xxx.7x" "shellshock-scan (http://blog.*********.com/2014/09/bash-shellshock-scan-of-internet.html)"


これは脆弱性がある場合には攻撃者の用意したサイトへpingを発行するという攻撃の準備のためのコードをリファラに仕込んでいたときのログで、研究を目的としたスキャンのようです。
ただし、このログによる確認方法は簡易的なものであり、User-Agentやリファラ以外の例えばAccept-Encodingやその他のカスタムリクエストヘッダなどに攻撃用コードを仕込んでいた場合には一般的にはログに記録されないため、この確認方法では攻撃の有無を把握することはできません。

そのため、攻撃を確実に把握するためにはすべてのHTTPの通信を記録しておくことが望ましいと言えます。弊社 PacketBlackHole を用いるとHTTPをはじめとする通信の記録、確認が容易に行えます。

■影響の範囲
Webサーバをはじめとし、bashがインストールされているLinuxやUNIX環境すべてが対象となりますが、その脆弱性を利用して外部から実際に攻撃、侵入ができるかどうかについては設定や使用しているプログラムによるところが大きく、すべてのサーバが即座に侵入可能というわけではありません。

脆弱性のあるbashが存在するWebサーバに対しては、攻撃者がHTTPリクエストヘッダに脆弱性を利用した攻撃コードを含めてHTTPリクエストを発行し、それに対してWebアプリケーション攻撃が応答するだけで攻撃が成立してしまいます。

Webアプリケーションが影響を受けるのは、シェルを経由して外部コマンドを起動する部分となります。各言語において外部コマンドを起動するための関数や命令は異なっており、それぞれがシェルを経由するか否かはWebアプリケーション開発者にとっても把握が難しいため注意が必要です。

以下、代表的な事例としてPHPおよびPerlにおける影響点を記載しておきます。

○PHP

PHPではCGIモードで起動させた場合にbashの脆弱性を利用した攻撃が非常に容易に行えることを確認しています。
execやshell_exec、sysytem、proc_open といった明示的に外部コマンドを起動する関数の呼び出しだけでなく、メール送信のために広く利用されている mail 関数や mb_send_mail 関数も内部的にシェルを起動しているため、今回のbashの脆弱性の影響を受けます。これらを利用しているPHPスクリプトの動作環境では早急に対応が必要となります。

○Perl
system、exec、``、open など外部コマンドを利用している場合に影響を受ける可能性があります。特に、open( FH, "| nkf -j | sendmail" ) のように多段にパイプを介している場合にはシェルを起動してのコマンド実行となるため確実に影響を受けることになります。

また、外からみた場合には明示的にWebアプリケーションに見えない、静的なHTMLファイルであったとしても、内部でSSI(Server Side Include)を使用している場合には <!--#exec cgi=... --> などの機能により外部コマンドを呼び出している場合があり、これらもbashの脆弱性の影響を受けるため注意が必要です。


企業内、ファイアウォール内のサーバやBASIC認証等で保護されているサーバなど、攻撃者が直接的にアクセスできない場合であっても、そのサーバ上の攻撃可能なCGIなどのURLが攻撃者にとって既知である場合には、攻撃者はわなページ上のJavaScriptからXMLHttpRequestによって攻撃用のコードをを該当CGIへ送信することで任意コードの実行が可能となります。

以上、bashの脆弱性についての調査結果となります。繰り返しになりますが、現在提供されているパッチでは脆弱性への対応が不十分という話もあるため、パッチの適用に加え、万が一の場合に備えた対策を合わせてとっておくことが大切であり、弊社によるネットワークの監視カメラ「PacketBlackHole」のような製品が重要となります。
また、弊社でもサポートするSaaS型のWeb Application Firewallである「Scutum」ではすでに本攻撃に対するシグネイチャの対応を終えており、導入することにより本脆弱性を利用した攻撃からWebアプリケーションを守ることができます。



メルマガ読者募集 採用情報 2020年卒向けインターンシップ

月別