メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

文字列操作で格納先バッファーがアンダーフローしています

関数がバッファーの先頭から負のオフセットでバッファーに書き込む

説明

この欠陥は、特定の文字列操作関数によって、その格納先バッファー引数にバッファーの先頭から負のオフセットで書き込まれた場合に発生します。

たとえば、関数 sprintf(char* buffer, const char* format) では buffer を演算 buffer = (char*)arr; ... buffer += offset; から取得します。arr は配列で、offset は負の値です。

リスク

バッファー アンダーフローにより、メモリ破損やシステム停止のような予期しない動作を引き起こす可能性があります。また、バッファー アンダーフローは、コード インジェクションのリスクにもつながります。

修正方法

格納先バッファーの引数がポインター演算の結果得られたものである場合は、ポインターをデクリメントしているかどうかを確認します。デクリメント前の元の値かデクリメント値を変更することで、ポインターのデクリメントを修正します。

すべて展開する

#include <stdio.h>
#define offset -2

void func(void) {
    char buffer[20];
    char *fmt_string ="Text";

    sprintf(&buffer[offset], fmt_string);     
}

この例では、&buffer[offset]buffer に割り当てられているメモリから負のオフセットの位置にあります。

変更 — ポインター デクリメンターを変更

1 つの修正方法として、offset の値を変更します。

#include <stdio.h>
#define offset 2

void func(void) {
    char buffer[20];
    char *fmt_string ="Text";

    sprintf(&buffer[offset], fmt_string);     
}

結果情報

グループ: 静的メモリ
言語: C | C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: STRLIB_BUFFER_UNDERFLOW
影響度: High

バージョン履歴

R2015b で導入