メインコンテンツ

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

CWE Rule 560

Use of umask() with chmod-style Argument

R2023a 以降

説明

ルールの説明

The product calls umask() with an incorrect argument that is specified as if it is an argument to chmod().

Polyspace 実装

ルール チェッカーは、[umask が chmod 型の引数と共に使用されています] をチェックします。

すべて展開する

問題

この問題は、chmod への引数の形式で指定された引数が umask コマンドに含まれており、想定外の可能性がある権限が付与される場合に発生します。次に例を示します。

  • umask コマンドが、現在のユーザーよりも多い権限をグループに付与する。

  • umask コマンドが、グループよりも多い権限を他のユーザーに付与する。

新規ファイルでは、umask 引数またはマスク値によって、どの権限を設定 "しない" か、つまり、どの権限を削除するかが指定されます。このマスクはビット単位で符号を反転した後、新規ファイルでの権限に適用されます。これに対し、chmod では指定されたとおりに権限が設定されます。

リスク

chmod 形式の引数を使用すると、想定とは正反対の権限が指定されることになります。このミスにより、新規のファイルとフォルダーに対する読み取りや書き込みのアクセス権が、外部ユーザーに対し意図せずに付与される可能性があります。

修正方法

この欠陥を修正するには、以下のタスクの両方を実行します。

  • ユーザーの読み取り権限を有効にします。

  • mask の値の設定で、ユーザー (u) のオフにする権限数を、グループ (g) の権限数以下にし、かつそのグループのオフにする権限数を、他のユーザー (o) の権限数以下にします。つまり、u <= g <= o になるようにします。

umask の値は、次を呼び出すことで確認できます。

umask
また、シンボリック値は、次を呼び出すことで確認できます。
umask -S

例 — 既定のマスクを設定
#include <stdio.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h>

typedef mode_t (*umask_func)(mode_t);

const mode_t default_mode = (
    S_IRUSR    /* 00400 */ 
    | S_IWUSR  /* 00200 */ 
    | S_IRGRP  /* 00040 */ 
    | S_IWGRP  /* 00020 */
    | S_IROTH  /* 00004 */
    | S_IWOTH  /* 00002 */
    );         /* 00666 (i.e. -rw-rw-rw-) */

static void my_umask(mode_t mode)
{
    umask(mode);  //Noncompliant
}

int umask_use(mode_t m)
{
    my_umask(default_mode);
    return 0;
}

この例では、my_umask という関数を使用して、既定のマスク モードを設定します。しかし、変数 default_mode は権限 666、つまり -rw-rw-rw を与え、umask はこの値を否定します。この否定は、既定のマスク モードにより、ユーザー、グループ ユーザーおよび他の外部ユーザーに対し読み取りと書き込みの権限がオフになることを意味します。

修正 — 優先される権限を否定

1 つの修正方法として、my_umaskdefault_mode 引数の符号を反転します。この修正により、umask による否定が新規ファイルに対して無効になります。

#include <stdio.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h>

typedef mode_t (*umask_func)(mode_t);

const mode_t default_mode = (
    S_IRUSR    /* 00400 */ 
    | S_IWUSR  /* 00200 */ 
    | S_IRGRP  /* 00040 */ 
    | S_IWGRP  /* 00020 */
    | S_IROTH  /* 00004 */
    | S_IWOTH  /* 00002 */
    );         /* 00666 (i.e. -rw-rw-rw-) */

static void my_umask(mode_t mode)
{
    umask(mode);
}

int umask_use(mode_t m)
{
    my_umask(~default_mode);
    return 0;
}

チェック情報

カテゴリ: その他

バージョン履歴

R2023a で導入