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, // pipe name
FILE_FLAG_FIRST_PIPE_INSTANCE |
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
修正コード例では、FILE_FLAG_FIRST_PIPE_INSTANCE パラメーターが CreateNamedPipe 関数の 2 番目のパラメーターとして使用されており、パイプが既存の関数に優先して作成されることはありません。
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。