メインコンテンツ

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

セキュリティで保護されないソースに由来するホスト ID の変更

説明

この欠陥は、ホスト 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
}

この例では、関数に渡される引数を使用して新規ホスト 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);
    }
}

結果情報

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

バージョン履歴

R2015b で導入