コンテンツにスキップ

Out-of-Bounds Access (境界外アクセス)

ルール ID

MI107

定義

ソフトウェアは、意図されたバッファーの終端を越えたデータ、または先頭より前のデータにアクセスしています。

サンプル

次のコードは、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 の形式が正しいことを検証してホスト名をルックアップし、バッファーにコピーしています。この関数は、ホスト名を格納するために 64 バイトのバッファーを割り当てていますが、ホスト名が 64 バイトを超えない保証はありません。攻撃者が非常に長いホスト名に解決されるアドレスを指定した場合、関数が機密データを上書する可能性や、攻撃者に制御フローを明け渡す可能性さえあります。

参考資料

  • Common Weakness Enumeration: CWE-119
  • Common Weakness Enumeration: CWE-129
  • Common Weakness Enumeration: CWE-469
  • Common Weakness Enumeration: CWE-680
  • Common Weakness Enumeration: CWE-786
  • Common Weakness Enumeration: CWE-788