SV.PIPE.VAR

変数におけるパイプのハイジャックの可能性

FILE_FLAG_FIRST_PIPE_INSTANCE パラメーターが、CreateNamedPipe 関数で使用されていない場合、パイプが既存ファイルに優先して作成され、悪意のあるユーザーがセキュリティ上の機密データを取得し、おそらく任意のコードを実行することができます。

SV.PIPE.VAR チェッカーは、CreateNamedPipe 関数が FILE_FLAG_FIRST_PIPE_INSTANCE パラメーターではなく、ある変数と組み合わせて使用されているインスタンスを探します。

脆弱性とリスク

名前付きパイプと共有ファイルは、システムのセキュリティを低下させる可能性があるので、無許可のユーザーが正当なユーザーのユーザー名やその他の機密情報を取得することができます。この脆弱性による主なリスクは、悪意のあるユーザーが追加の権限を取得し、パイプをハイジャックして任意のプログラムを実行できるようになることです。

軽減と防止

FILE_FLAG_FIRST_PIPE_INSTANCE フラグを CreateNamedPipe で 2 番目の引数として使用すると、作成中のパイプの完成が確実に防止されるので、パイプハイジャック攻撃を防ぐことができます。

脆弱コード例

コピー
    hPipe = CreateNamedPipe( 
          lpszPipename,         // pipe name 
          mode,          // read/write access 
          PIPE_TYPE_MESSAGE |     // message type pipe 
          PIPE_READMODE_MESSAGE |  // message-read mode 
          PIPE_WAIT,           // blocking mode 
          PIPE_UNLIMITED_INSTANCES, // max. instances  
          BUFSIZE,            // output buffer size 
          BUFSIZE,            // input buffer size 
          0,                // client time-out 
          NULL);              // default security attribute

Klockwork は、コードの 3 行目にある変数にフラグを立てます。FILE_FLAG_FIRST_PIPE_INSTANCE パラメーターが、CreateNamedPipe と組み合わせて使用されていない場合、パイプが既存ファイルに優先して作成される可能性があります。このような場合、悪意のあるユーザーがセキュリティ上の機密データを取得し、おそらく任意のコードを実行することができます。

修正コード例

コピー
hPipe = CreateNamedPipe( 
       lpszPipename,         // パイプ名 
       FILE_FLAG_FIRST_PIPE_INSTANCE |
       mode,     // 読み取り/作成権限 
       PIPE_TYPE_MESSAGE |     // メッセージタイプのパイプ 
       PIPE_READMODE_MESSAGE |  // メッセージ読み取りモード 
       PIPE_WAIT,           // ブロッキングモード 
       PIPE_UNLIMITED_INSTANCES, // インスタンスの最大数  
       BUFSIZE,            // 出力バッファサイズ 
       BUFSIZE,            // 入力バッファサイズ 
       0,                // クライアントのタイムアウト 
       NULL);              // デフォルトのセキュリティ属性

修正コード例では、FILE_FLAG_FIRST_PIPE_INSTANCE パラメーターが CreateNamedPipe 関数の 2 番目のパラメーターとして使用されており、パイプが既存の関数に優先して作成されることはありません。

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。