コンテンツにスキップ

Null Pointer Dereference (Null ポインター間接参照)

ルール ID

MI106

定義

ソフトウェアは、有効であることが期待されているが、実際は NULL であるポインターを間接参照しています。これは通常、クラッシュまたはプログラムの終了の原因になります。

サンプル

次のコードは、CWE の該当コード サンプルの 1 つです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
void host_lookup(char *user_supplied_addr){
struct hostent *hp;
  in_addr_t *addr;
  char hostname[64];
  in_addr_t inet_addr(const char *cp);

  /*routine that ensures user_supplied_addr is in the right format for conversion */

  validate_addr_form(user_supplied_addr);
  addr = inet_addr(user_supplied_addr);
  hp = gethostbyaddr( addr, sizeof(struct in_addr), AF_INET);
  strcpy(hostname, hp->h_name);
}

このサンプルは、ユーザーから IP アドレスを受け取り、URL の形式が正しいことを検証してホスト名をルックアップし、バッファーにコピーしています。攻撃者が形式は正しいがホスト名に解決されないアドレスを指定すると、gethostbyaddr() は NULL を返します。コードは gethostbyaddr() からの戻り値をチェックしていないため (CWE-252)、strcpy() の呼び出しで NULL ポインター間接参照 (CWE-476) が発生します。

参考資料

  • Common Weakness Enumeration: CWE-476
  • Common Weakness Enumeration: CWE-690