最大バッファー サイズのチェックがないパス操作関数を使用しています
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 で導入