メインコンテンツ

データの長さとサイズが一致していません

データ サイズ引数が実際のデータ長から計算されない

説明

この欠陥は、バッファー オーバーフローから保護するために、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);

    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);

}

結果情報

グループ: セキュリティ
言語: C | C++
既定値: オフ
コマンド ライン構文: DATA_LENGTH_MISMATCH
影響度: Medium

バージョン履歴

R2015b で導入