メインコンテンツ

汚染されたサイズでのメモリの割り当て

メモリ関数のサイズ引数がセキュリティで保護されないソースに由来する

説明

この欠陥は、callocmalloc などのメモリ割り当て関数で、セキュリティで保護されていないソースからのサイズ引数が使用された場合に発生します。

リスク

メモリ割り当てが制御されていないと、プログラムによってシステム メモリが過剰に要求されることがあります。その結果、メモリ不足の状態やリソースの過剰割り当てによりクラッシュすることがあります。

修正方法

メモリを割り当てる前に引数の値をチェックして、範囲を超えないことを確認します。

チェッカーの拡張

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

すべて展開する

#include<stdio.h>
#include <stdlib.h>

int* bug_taintedmemoryallocsize(void) {
    size_t size;
    scanf("%zu", &size);
    int* p = (int*)malloc(size);//Noncompliant
    return p;
}

この例では、malloc がポインター p 用のメモリを size バイト割り当てます。変数 size はプログラムのユーザーから取得されます。その値がチェックされないため、使用可能なメモリ量を超える可能性があります。size が使用可能なバイト数を上回ると、プログラムがクラッシュする可能性があります。

修正 — 割り当てられるメモリのサイズをチェック

1 つの修正方法として、malloc 操作を実行する前に、割り当てるメモリのサイズをチェックします。この例では、size が正で、最大サイズより小さいかどうかを確認します。

#include<stdio.h>
#include <stdlib.h>

enum {
    SIZE10  =  10,
    SIZE100 = 100,
    SIZE128 = 128
};

int* corrected_taintedmemoryallocsize(void) {
    size_t size;
    scanf("%zu", &size);
    int* p = NULL;
    if (size>0 && size<SIZE128) {          /* Fix: Check entry range before use */
        p = (int*)malloc((unsigned int)size);
    }
    return p;
}

結果情報

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

バージョン履歴

R2015b で導入