メインコンテンツ

汚染されたポインターの使用

セキュリティで保護されないソースに由来するポインターは NULL であるか不明なメモリを指している可能性がある

説明

この欠陥は、以下の場合に発生します。

  • 汚染された NULL ポインター — セキュリティで保護されていないソースから取得したポインターが NULL に対し検証されていない。

  • 汚染されたサイズ ポインター — セキュリティで保護されていないポインターが指しているメモリ ゾーンのサイズが検証されていない。

メモ

単一のポインターについて、コードに汚染されたポインターの使用汚染されたオフセットによるポインターのデリファレンス汚染された NULL 文字列または非 NULL 終端文字列の各インスタンスが含まれることがあります。Bug Finder では、最初に見つかった汚染されたポインターの欠陥のみが報告されます。

リスク

攻撃者は、予期しないメモリ位置を指すポインターをプログラムに与えることが可能です。ポインターのデリファレンスにより書き込みを行う場合、攻撃者は次のことができます。

  • 重要なプログラムの状態変数を変更する。

  • プログラムをクラッシュさせる。

  • 望ましくないコードを実行する。

ポインターのデリファレンスにより読み取りを行う場合、攻撃者は次のことができます。

  • 機密データを読み取る。

  • プログラムをクラッシュさせる。

  • プログラム変数を予期しない値に変更する。

修正方法

外部ソースに由来するポインターの使用を避けます。

または、外部ソースを信頼する場合、デリファレンスする前にポインターをサニタイズします。個別のサニタイズ関数で以下を実行します。

  • ポインターが NULL ではないことをチェック。

  • メモリ位置のサイズをチェック (可能な場合)。この 2 番目のチェックは、ポインターが指すデータのサイズがプログラムに必要なサイズと一致するかどうかを検証します。

サニタイズ関数の本体には、この欠陥がまだ表示されます。ただし、サニタイズ関数を使用する場合は、欠陥は複数回ではなく 1 回だけ表示されます。後のレビューでコード注釈を使用して、この欠陥を正当化し非表示にできます。詳細は、以下を参照してください。

チェッカーの拡張

既定では、Polyspace® は外部ソースからのデータは汚染されていると仮定します。Polyspace 解析での汚染のソースを参照してください。Polyspace 解析の現在のスコープ以外から発生したすべてのデータを汚染されたものと見なすには、コマンド ライン オプション [-consider-analysis-perimeter-as-trust-boundary] を使用します。

すべて展開する

#include<stdlib.h>
void taintedptr(void) {
	char *p = getenv("ARG");
	char x = *(p+10);//Noncompliant  
}

この例では、ポインター *p が不明なサイズの文字列を指しています。デリファレンス操作中に、ポインターが null になったり、不明なメモリを指したりすることがあり、これがセグメンテーション違反につながる可能性があります。

修正 — ポインターをチェック

1 つの修正方法として、ポインターを使用する前にサニタイズします。この例では、デリファレンスする前にポインターが nullptr かどうかをチェックします。

#include<stdlib.h>
#include <string.h> 
void taintedptr(void) {
	char *p = getenv("ARG");
	if(p!=NULL && strlen(p)>10)
	{
	char x = *(p+10);
	}
}

結果情報

グループ: 汚染されたデータ
言語: C | C++
既定値: オフ
コマンド ライン構文: TAINTED_PTR
影響度: Low

バージョン履歴

R2015b で導入