CWE Rule 15
説明
ルールの説明
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] を使用します。
#include <unistd.h>
#include <stdlib.h>
void bug_taintedhostid(void) {
long userhid = strtol(getenv("HID"),NULL,10);
sethostid(userhid);//Noncompliant //Noncompliant
}
この例では、関数に渡される引数を使用して新規ホスト 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);
}
}この問題は、putenv や setenv などの環境変数を追加または変更する関数で、セキュリティで保護されていないソースから新しい環境変数値が取得された場合に発生します。
環境変数が汚染されると、攻撃者はシステム設定を制御できるようになります。こうした制御により、潜在的に悪意ある方法でアプリケーションやサービスが中断される可能性があります。
新規環境変数を使用する前に、その値をチェックして、外部ユーザーに制御が明け渡されるのを防止します。
既定では、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 で導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)