メインコンテンツ

アクセス許可の割り当てが脆弱です

引数により外部ユーザーに書き込み、読み取りまたは検索の権限が付与されている

説明

この欠陥は、chmodumaskcreatopen などのリソース権限を変更可能な関数で、想定外のアクターにリソースの変更または読み取りを許可する権限が指定された場合に発生します。

リスク

外部ユーザーや外部グループに必要以上に広範な権限が付与された場合、機密情報や変更内容が露出される可能性があります。この欠陥は、以下に関連する権限において特に危険です。

  • プログラムの構成

  • プログラムの実行

  • 機密のユーザー データ

修正方法

ユーザー (u) がグループ (g) より多くの権限をもち、グループが他のユーザー (o) より多くの権限をもつ、つまり u >= g >= o となるように権限を設定します。

すべて展開する

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void bug_dangerouspermissions(const char * log_path) {
    mode_t mode = S_IROTH | S_IXOTH | S_IWOTH;
    int fd = creat(log_path, mode); 

    if (fd) {
        write(fd, "Hello\n", 6);
    }
    close(fd);
    unlink(log_path);
}

この例では、その他のユーザーが現在のユーザーよりも多くの権限をもつよう log_path ファイルが作成されます。権限は ---------rwx となります。

修正 — ユーザー権限を変更

1 つの修正方法として、ファイルに関するユーザーの権限を変更します。この修正では、現在のユーザーが読み取り、書き込み、実行の権限をもちますが、他のユーザーはこれをもちません。

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void corrected_dangerouspermissions(const char * log_path) {
    mode_t mode = S_IRUSR | S_IXUSR | S_IWUSR;
    int fd = creat(log_path, mode);

    if (fd) {
        write(fd, "Hello\n", 6);
    }
    close(fd);
    unlink(log_path);
}

結果情報

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

バージョン履歴

R2015b で導入