最大バッファー サイズのチェックがないパス操作関数を使用しています
getwd
または realpath
の格納先バッファーが PATH_MAX
バイトより小さい
説明
この欠陥は、realpath
や getwd
などのパス操作関数の格納先引数のバッファー サイズが PATH_MAX
バイト未満の場合に発生します。
リスク
バッファーが PATH_MAX
バイトより小さいとオーバーフローすることがありますが、関数の戻り値をテストしても、オーバーフローが発生したかどうかは判別できません。オーバーフローが発生すると、関数呼び出しの後にバッファーの内容が未定義になります。
たとえば char *getwd(char *buf)
はその引数に、現在のフォルダーの絶対パス名をコピーします。絶対パス名の長さが PATH_MAX
バイトより大きい場合、getwd
は NULL
を返し、*buf
の内容は未定義になります。getwd
の戻り値を NULL
についてテストすることで、関数呼び出しが正常終了したかどうかを確認できます。
しかし、buf
に許可されているバッファーが PATH_MAX
バイトより小さい場合、絶対パス名が小さくてもエラーが発生することがあります。この場合、エラーが発生しても getwd
は NULL
を返しません。したがって、buf
に許可されるバッファーは、PATH_MAX
バイトの長さでなければなりません。
修正方法
考えられる修正方法は次のとおりです。
PATH_MAX
バイトのバッファー サイズを使用する。不明なソースからバッファーを取得する場合は、バッファーを関数getwd
またはrealpath
の引数として使用する前に、サイズがPATH_MAX
バイトより小さいことを確認します。パス操作関数を使用して、バッファー サイズを指定できるようにする。
たとえば、
getwd
を使用して現在のフォルダーの絶対パス名を取得している場合、代わりにchar *getcwd(char *buf, size_t size);
を使用します。追加の引数size
により、PATH_MAX
以上のサイズを指定できるようになります。可能な場合は、関数が追加メモリを動的に割り当てられるようにする。
たとえば、
char *realpath(const char *path, char *resolved_path);
は、resolved_path
がNULL
の場合にメモリを動的に割り当てます。ただし、後で関数free
を使用してこのメモリの割り当てを解除する必要があります。
例
結果情報
グループ: 静的メモリ |
言語: C | C++ |
既定値: オフ |
コマンド ライン構文: PATH_BUFFER_OVERFLOW |
影響度: High |
バージョン履歴
R2015b で導入