CXX.PUTENV.LOCAL.PTR

putenv() にはローカル変数へのポインターを渡さないでください

環境を構成するには、POSIX により提供される putenv() 関数を使用します。ただし、ローカル変数へのポインターを渡して環境変数を設定すると、未定義の動作が発生します。

脆弱性とリスク

環境変数を設定するには、putenv() 関数を使用します。putenv() 関数は、引数として渡された変数のコピーを作成せずに、ポインターを環境変数配列に挿入します。したがって、ローカル変数へのポインターを使用する場合、その変数の値をポイントするメモリの割り当てを解除して再利用する可能性があります。この場合、構成で使用される値がオーバーライドされる可能性もあります。ただし、有効期間が静的である静的変数へのポインターを渡すことには問題がありません。

軽減と防止

これを防ぐには、オブジェクトの静的バリアントを準備します。

脆弱コード例

コピー
int func_good(const char *var)
{ 
        char env[1024];
        int retval = snprintf(env, sizeof(env), "TEST=%s", var);
        if (retval < 0 || (size_t)retval >= sizeof(env)) {
                /* Handle error */
        }
        return putenv(env);
}

上記のコードでは、ローカル変数 env を putenv() 関数に渡しています。ただし、env ローカル変数は func() 関数の終了後に割り当て解除されます。これにより、putenv() 関数によって導入された環境変数配列へのポインターは、もはや関連のないメモリアドレスをポイントするようになります。