メインコンテンツ

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

CWE Rule 785

Use of Path Manipulation Function without Maximum-sized Buffer

R2023a 以降

説明

ルールの説明

The software invokes a function for normalizing paths or file names, but it provides an output buffer that is smaller than the maximum possible size, such as PATH_MAX.

Polyspace 実装

このルール チェッカーは、[最大バッファー サイズのチェックがないパス操作関数を使用しています] をチェックします。

すべて展開する

問題

この問題は、realpathgetwd などのパス操作関数の格納先引数のバッファー サイズが PATH_MAX バイト未満の場合に発生します。

リスク

バッファーが PATH_MAX バイトより小さいとオーバーフローすることがありますが、関数の戻り値をテストしても、オーバーフローが発生したかどうかは判別できません。オーバーフローが発生すると、関数呼び出しの後にバッファーの内容が未定義になります。

たとえば char *getwd(char *buf) はその引数に、現在のフォルダーの絶対パス名をコピーします。絶対パス名の長さが PATH_MAX バイトより大きい場合、getwdNULL を返し、*buf の内容は未定義になります。getwd の戻り値を NULL についてテストすることで、関数呼び出しが正常終了したかどうかを確認できます。

しかし、buf に許可されているバッファーが PATH_MAX バイトより小さい場合、絶対パス名が小さくてもエラーが発生することがあります。この場合、エラーが発生しても getwdNULL を返しません。したがって、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_pathNULL の場合にメモリを動的に割り当てます。ただし、後で関数 free を使用してこのメモリの割り当てを解除する必要があります。

例 — 関数 getwd の使用で発生し得るバッファー オーバーフロー
#include <unistd.h>
#include <linux/limits.h>
#include <stdio.h>

void func(void) {
    char buf[PATH_MAX];
    if (getwd(buf+1)!= NULL)  //Noncompliant
    {
        printf("cwd is %s\n", buf);
    }
}

この例では、配列 bufPATH_MAX バイトであっても、getwd の引数は buf + 1 であり、許可されるバッファーは PATH_MAX バイトより小さくなります。

修正 — サイズが PATH_MAX バイトの配列を使用

1 つの修正方法として、サイズが PATH_MAX バイトに等しい配列引数を使用します。

#include <unistd.h>
#include <linux/limits.h>
#include <stdio.h>

void func(void) {
    char buf[PATH_MAX];
    if (getwd(buf)!= NULL)         {
        printf("cwd is %s\n", buf);
    }
}

チェック情報

カテゴリ: その他

バージョン履歴

R2023a で導入