メインコンテンツ

CWE Rule 15

External Control of System or Configuration Setting

R2024a 以降

説明

ルールの説明

One or more system settings or configuration elements can be externally controlled by a user.

Polyspace 実装

ルール チェッカーは以下の問題をチェックします。

  • 外部で制御される要素を使用したホストの変更

  • 外部制御される環境変数を使用しています

すべて展開する

問題

この問題は、ホスト ID を変更する sethostid (Linux®) や SetComputerName (Windows®) などのルーチンで外部制御された引数が使用された場合に発生します。

リスク

汚染されたホスト ID の値により、システム設定の外部制御が許可される可能性があります。こうした制御はサービスを中断し、アプリケーションの予期しない動作の原因となり、他の悪意ある侵入を引き起こす場合があります。

修正方法

ホスト ID の変更や編集に際しては慎重を期します。ユーザー提供の値によって機密データが制御されないようにしてください。

チェッカーの拡張

既定では、Polyspace® は外部ソースからのデータは汚染されていると仮定します。Polyspace 解析での汚染のソースを参照してください。Polyspace 解析の現在のスコープ以外から発生したすべてのデータを汚染されたものと見なすには、コマンド ライン オプション [-consider-analysis-perimeter-as-trust-boundary] を使用します。

例 — 関数の引数に由来するホスト ID の変更
#include <unistd.h>
#include <stdlib.h>

void bug_taintedhostid(void) {
    long userhid = strtol(getenv("HID"),NULL,10);
    sethostid(userhid);//Noncompliant //Noncompliant
}

この例では、関数に渡される引数を使用して新規ホスト ID を設定しています。ホスト ID を使用する前に、渡された値をチェックします。

修正 — 事前定義されたホスト ID

1 つの修正方法として、ホスト ID を事前定義された ID に変更します。この例では、ホスト引数を変数 switch として使用し、事前定義された異なるホスト ID の中から選択します。

#include <unistd.h>
#include <stdlib.h>

extern long called_taintedhostid_sanitize(long);
enum { HI0 = 1, HI1, HI2, HI3 };

void taintedhostid(void) {
    long host = strtol(getenv("HID"),NULL,10);
    long hid = 0;
    switch(host) {
        case HI0:
            hid = 0x7f0100;
            break;
        case HI1:
            hid = 0x7f0101;
            break;
        case HI2:
            hid = 0x7f0102;
            break;
        case HI3:
            hid = 0x7f0103;
            break;
        default:
            /* do nothing */
	    break;
    }
    if (hid > 0) {
        sethostid(hid);
    }
}
問題

この問題は、putenvsetenv などの環境変数を追加または変更する関数で、セキュリティで保護されていないソースから新しい環境変数値が取得された場合に発生します。

リスク

環境変数が汚染されると、攻撃者はシステム設定を制御できるようになります。こうした制御により、潜在的に悪意ある方法でアプリケーションやサービスが中断される可能性があります。

修正方法

新規環境変数を使用する前に、その値をチェックして、外部ユーザーに制御が明け渡されるのを防止します。

チェッカーの拡張

既定では、Polyspace は外部ソースからのデータは汚染されていると仮定します。Polyspace 解析での汚染のソースを参照してください。Polyspace 解析の現在のスコープ以外から発生したすべてのデータを汚染されたものと見なすには、コマンド ライン オプション [-consider-analysis-perimeter-as-trust-boundary] を使用します。

例 — 環境にパスを設定
#define _XOPEN_SOURCE
#define _GNU_SOURCE
#include "stdlib.h"

void taintedenvvariable(void)
{
    char* path = getenv("APP_PATH");
    putenv(path); //Noncompliant
}

この例では、putenv によって環境変数が変更されます。パス path は、想定どおりのパスになることを確認されていません。

修正 — パスをサニタイズ

1 つの修正方法として、パスをサニタイズし、予想どおりのものであることをチェックします。

#define _POSIX_C_SOURCE
#include <stdlib.h>
#include <string.h>

/* Function to sanitize a path */
const char * sanitize_path(const char* str) {
	/* secure allowlist of paths */
	static const char *const authorized_paths[] = {
		"/bin",
		"/usr/bin"
	};
	if (str != NULL) {
		for (int i = 0; i < sizeof(authorized_paths) / sizeof(authorized_paths[0]); i++)
		if (strcmp(authorized_paths[i], str) == 0) {
			return authorized_paths[i];
		}
	}
	return NULL;
}

void taintedenvvariable(void)
{
	const char* path = getenv("APP_PATH");
	path = sanitize_path(path);
	if (path != NULL) {
		if (setenv("PATH", path, /* overwrite = */1) != 0) {
			/* fatal error */
			exit(1);
		}
	}
} 

チェック情報

カテゴリ: State Issues

バージョン履歴

R2024a で導入