メインコンテンツ

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

環境変数の値がセキュリティで保護されていないソースから取得される

説明

この欠陥は、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);
		}
	}
} 

結果情報

グループ: 汚染されたデータ
言語: C | C++
既定値: オフ
コマンド ライン構文: TAINTED_ENV_VARIABLE
影響度: Medium

バージョン履歴

R2015b で導入