第32回 PHPセキュリティ月間
今回は静的にPHPソースコードを分析しセキュリティ脆弱性を検査するツールの紹介です。
- MOPS Submission 09: RIPS - A static source code analyser for vulnerabilities in PHP scripts
- http://
www. php-security. org/ 2010/ 05/ 24/ mops-submission-09-rips-a-static-source-code-analyser-for-vulnerabilities-in-php-scripts/ index. html
昨年発見された脆弱性のおよそ3割がPHPアプリケーション関連の脆弱性とされています。PHPは簡単にWebアプリケーションが作れるため,
Johannes Dahse氏はこのような状況を改善するためにRIPSと呼ばれる,
この記事を執筆するにあたり,
RIPSの基本設計
RIPSは危険性がある関数をPVF
RIPSは構文解析を行いPVFを見つけ,
静的なソースコード脆弱性スキャナと聞くとコマンドラインアプリケーションを想像するかも知れませんが,
脆弱性スキャン
RIPSが脆弱性を検出する過程を簡単なスクリプトで解説します。
サンプルコード
<?php
$a = $_GET['a'];
$b = $a;
system($b, $ret);
?>
Tokenizerでトークンに分解されたスクリプト情報から,
サンプルコードのスキャン結果
4 : system($b ,$ret);
3 : $b = $a;
2 : $a = $_GET['a'];
危険なデータソースである$_GET['a']と危険な関数であるsystem関数が識別され,
今度は危険でないサンプルコードをスキャンしてみます。
サンプルコード2
<?php
$a = $_GET['a'];
$b = 'date';
system($b, $ret);
?>
期待通りに脆弱性はレポートされませんでした。
次にもう少し複雑なサンプルコードをスキャンしてみます。
サンプルコード3
<?php
$a = $_GET['a'];
$b = escapeshellarg($a);
$c = 'cal ' . $b;
system($c, $ret);
?>
脆弱性はないので,
3行目で対策が取られていることがわかります。これはsystem関数の最初のパラメータが危険なパラメータで,
RIPSに保存されている検出用データのイメージ
"system" => array (
array(1), array("escapeshellarg", "escapeshellcmd")
);
実際にはconfig/
include/