iCodeChecker

独立行政法人情報処理推進機構(IPA)というと、
国家試験である情報処理技術者試験の胴元ですが、
他にもいろいろ活動しており、iCodeCheckerなるものを発表しました。
これは無料のC言語ソースコードチェッカーでセキュリティの問題点を探してくれます。

一応Ubuntu 11.10 Desktop (x86-32bit)での動作が前提のようで、
C++での実装部分はソースもありますし、rubyを多用しているようなので、
他のLinuxディストリビューションで動かすのもそんなに大変ではないかもしれません。
が、別にそこまで力を入れて使おうとも思っていませんし、
手元にすぐに使えるそういう環境もないので、
とりあえずVMwareのVMイメージ(1.9GB)をダウンロードしてきて試用してみました。
なお、仮想マシンのrootやipaユーザのパスワードがわからなかったのでそれなりにしか見ていません。

iCodeChecker_vm.zipをWindows PCにダウンロードして展開し、
“iCodeChecker.vmx”をVMware Player 3で起動します。
Ubuntuが起動したらデスクトップ上の[iCodeCheckerへのリンク]ショートカットを開き、
“Web”ディレクトリの”start.rb”を実行します。
ウェブブラウザが開いてウェブアプリケーションがロードされているので、
[検査対象ファイル]にCのソースコード(“*.c”)か、それをまとめた圧縮ファイル(“*.zip”)を指定して、
[検査開始]ボタンをクリックすれば、そのうち結果が表示されます。
ためしに、iCodeCheckerのソースコードiCodeChecker_src.zipを検査してみましたが、

ソースコードの構文解析に失敗しました。ヘッダファイルが必要な場合は ZIP ファイルに圧縮してください。(エラーコード:-210)

なるエラーが出ました。うーん、よくわからん。
展開して個別のファイルを見ていくと”sample/*.c”はチェックしてくれますが、
“src/*.cc”はチェックできません。
どうやらC++のソースコードには対応していないようです。

ところで、ツール本体はicheckerという実行可能ファイルなので、

$ /home/ipa/iCodeChecker/ichecker -r -T <ディレクトリ>

のようにしてコマンドラインでの実行も可能です。
zipにまとめる必要もないのでこちらのほうが簡単です。

なお、検知できるのは以下の8種類です。

  • CWS-120 入力サイズ未チェックでのバッファコピー(バッファオーバーフローの問題)
  • CWS-129 配列インデックスの検証の不備
  • CWS-134 書式文字列の問題
  • CWS-190 整数オーバーフローの問題
  • CWS-191 整数アンダーフローの問題
  • CWS-195 符号付き変数の変換に関する問題
  • CWS-457 未初期化変数利用の問題
  • CWS-467 ポインタ変数に対する sizeof 演算子の使用

私のようなプロフェッショナル(?)になると、
Cで商用のソフトを作るときには当然注意する、
あるいは問題がおきないように対応したり仕様上押さえる点であり、
たとえ懸念点として検出されても実は別のところで対処しているなど、
余計なおせっかい的なツールではあります。

最後にテストとして以下のような3つのファイルを作成してチェックしてみました。

$ cat test/main.c
#include 
#include 
#include 
#include "sub.h"

void main(void)
{
	int i,j,k;
	unsigned int x,y;
	char b1[16],b2[32],*b3;

	i=sizeof(b1);
	x=sizeof(b2);
	memcpy(b1,b2,x);
	memcpy(b2,b1,i);
	j=sizeof(b3);
	k=add(x,y);
	y=100000;
	b1[y]=y;
}
$cat test/sub.c
int add(int a,int b)
{
	return(a+b);
}
$ cat test/sub.h
int add(int a,int b);

の3つのファイルに対して

$ /home/ipa/iCodeChecker/ichecker -r -T test

を実行すると、3個の脆弱なコードが見つかり、その内容は以下のとおりだそうです。

No., 脆弱性が検出されたファイル名, 行数, 脆弱性名, レポートファイル名
1, main.c, 14, CWE-120 入力サイズ未チェックでのバッファコピー(バッファオーバーフローの問題), main.c_14_1.txt
2, main.c, 16, CWE-467 ポインタに対する sizeof 演算子の使用, main.c_16_2.txt
3, main.c, 19, CWE-129 配列インデックスの検証の不備, main.c_19_3.txt

“test/main.c”の17行目のCWS-457(未初期化変数利用の問題)を検出してくれてもいいようなものですが…
万能ではないということでしょう。