メインコンテンツ

パス操作が脆弱です

パス引数が /..//abs/path/ など、セキュリティで保護されない要素を含む

説明

この欠陥は、汚染されたソースから相対パスまたは絶対パスを作成し、そのパスを使用してファイルを開いたり、作成したりした場合に発生します。

リスク

".." のような相対パスの要素は、意図したフォルダーの外部に関連付けることができます。"/abs/path" のような絶対パスの要素も、意図したフォルダーの外部に関連付けることができます。

攻撃者はこうしたタイプのパス トラバーサル要素を利用して残りのファイル システムをスキャンし、他のファイルやフォルダーにアクセスできます。

修正方法

/..//abs/path/ など、脆弱性のあるパス トラバーサル要素を回避します。可能な限り、固定したファイル名と場所を使用してください。

すべて展開する

# include <stdio.h>
# include <string.h>
# include <wchar.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <fcntl.h>
# include <unistd.h>
# include <stdlib.h>
# define BASEPATH "/tmp/"
# define FILENAME_MAX 512

static void Relative_Path_Traversal(void)
{
    char * data;
    char data_buf[FILENAME_MAX] = BASEPATH;
    char sub_buf[FILENAME_MAX];

    if (fgets(sub_buf, FILENAME_MAX, stdin) == NULL) exit (1);
    data = data_buf;
    strcat(data, sub_buf);

    FILE *file = NULL;
    file = fopen(data, "wb+"); 
    if (file != NULL) fclose(file);
}

int path_call(void){
    Relative_Path_Traversal();
}

この例では "/tmp/" からファイルを開いていますが、ファイルへの相対パスを使用しています。fopen でファイルを開く際に、外部ユーザーはこの相対パスを操作できます。

修正 — 固定したファイル名を使用

1 つの修正方法として、相対パスの代わりに固定したファイル名を使用します。次の例では file.txt を使用しています。

# include <stdio.h>
# include <string.h>
# include <wchar.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <fcntl.h>
# include <unistd.h>
# include <stdlib.h>
# define BASEPATH "/tmp/"
# define FILENAME_MAX 512

static void Relative_Path_Traversal(void)
{
    char * data;
    char data_buf[FILENAME_MAX] = BASEPATH;
    data = data_buf;

    /* FIX: Use a fixed file name */
    strcat(data, "file.txt");
    FILE *file = NULL;
    file = fopen(data, "wb+");  
    if (file != NULL) fclose(file);
}

int path_call(void){
    Relative_Path_Traversal();
}

結果情報

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

バージョン履歴

R2015b で導入