GAIO CLUB

2024年04月02日

【第21回】脆弱性を含む記述例3

静的解析/コンパイラ技術
いまさら聞けない静的解析/コンパイラ技術
今回も、CWE Top 25 の脆弱性に関するコーディング例を考えます。

CWE-476(NULLポインタ参照)

NULLポインタ参照はクラッシュにつながりますが、脆弱性につながるイメージは少ないと思います。

CWEの例を引用します。
CWE-476(NULLポインタ参照)
この例は、外部から入力したIPアドレスが実在しない場合にgethostbyaddr関数がNULLを返すので、そのチェックをしなくてはならないという指摘です。

ポインタを返す関数の戻り値チェック漏れは多いかもしれません。異常処理のテストをしなければ動いてしまうので気付きにくいですし、戻り値をチェックするコードが書いてないために、ソースを見てテストすると忘れてしまうでしょう。戻り値無視を検出するルールチェッカーが役に立ちそうです。

CWE-787(範囲外の書き込み)

コーディング例をお見せする最後の脆弱性です。

CWEの情報では、3要素の配列の3番目(array[3])に書き込んだり、strcpy関数への引数が十分なエリアを確保していない等の例があげられています。

CWEの情報を参考に例を作ってみました。
CWE-787(範囲外の書き込み)
getname関数で外部から受け取った名前が32バイトのエリアで十分かどうか、その名前でデータをサーチできるかどうか、という確認が必要(プログラムには32バイトを超えないためのガードが必要)かもしれません。

3回にわたって、CWE Top 25 であげられた脆弱性に関わるプログラム例を見てきましたが、この6件の脆弱性タイプは比較的プログラムをイメージし易いものでした。
これらの問題を検出する静的解析系ツールはあるかもしれません。正確な指摘ではなく関連する情報を提供するかもしれません。いろんな書き方がありますし、どの程度検出できるかはツールと使用者の実力次第でしょう。


CWE Top 25にはまだ多くの脆弱性タイプがあります。次回は、プログラムをイメージし易くない残りの脆弱性タイプについて見て行こうと思います。

この記事を読んだ人はこんなページを読んでいます。

筆者紹介

浅野 昌尚(あさの まさなお)

ガイオ・テクノロジー株式会社

開発1部 QTXグループ

1980年代から30年以上にわたり汎用構造のCコンパイラ開発に従事し、その間に8ビットマイコンからRISC・VLIW・画像処理プロセッサまで、さまざまなCPU向けのクロスCコンパイラを開発。

人気のコラム

最新のコラム