メインコンテンツ

CWE Rule 130

Improper Handling of Length Parameter Inconsistency

R2023a 以降

説明

ルールの説明

The software parses a formatted message or structure, but it does not handle or incorrectly handles a length field that is inconsistent with the actual length of the associated data.

Polyspace 実装

このルール チェッカーは、[データの長さとサイズが一致していません] をチェックします。

すべて展開する

問題

この問題は、バッファー オーバーフローから保護するために、memcpymemsetmemmove などのメモリ コピー関数の長さ引数とデータ バッファー引数がチェックされていない場合に発生します。

リスク

データ バッファーや長さの引数を攻撃者が操作できる場合、その攻撃者は、実際のデータ サイズをその長さより小さくすることによってバッファー オーバーフローを引き起こすことができます。

長さのこうした不一致のため、攻撃者は、データ バッファーに収まらないメモリを新しい場所にコピーできます。余剰分のメモリに機密情報が含まれている場合、攻撃者はそのデータにアクセスできるようになります。

この欠陥は、SSL Heartbleed バグと類似しています。

修正方法

メモリのコピーまたは操作を行う際、長さの引数をデータから直接計算して、サイズが一致するようにします。

例 — データのバッファーをコピー
#include <stdlib.h>
#include <string.h>

typedef struct buf_mem_st {
    char *data;
    size_t max;     /* size of buffer */
} BUF_MEM;

extern BUF_MEM beta;

int cpy_data(BUF_MEM *alpha)
{
    BUF_MEM *os = alpha;
    int num, length;

    if (alpha == 0x0) return 0;
    num = 0;

    length = *(unsigned short *)os->data;
    memcpy(&(beta.data[num]), os->data + 2, length);  //Noncompliant

    return(1);
}

この関数では、バッファー alpha をバッファー beta にコピーします。しかし、変数 lengthdata+2 とは関連していません。

修正 — バッファー長をチェック

1 つの修正方法として、バッファーの長さを、最大値から 2 を引いた値に対してチェックします。このチェックにより、構造体 beta にデータをコピーする十分なスペースが確保されます。

#include <stdlib.h>
#include <string.h>

typedef struct buf_mem_st {
    char *data;
    size_t max;     /* size of buffer */
} BUF_MEM;

extern BUF_MEM beta;

int cpy_data(BUF_MEM *alpha)
{
    BUF_MEM *os = alpha;
    int num, length;

    if (alpha == 0x0) return 0;
    num = 0;

    length = *(unsigned short *)os->data;
    if (length<(os->max -2)) {
        memcpy(&(beta.data[num]), os->data + 2, length); 
    }

    return(1);

}

チェック情報

カテゴリ: Data Processing Errors

バージョン履歴

R2023a で導入