SV.PIPE.VAR

变量中潜在的管道劫持

如果 FILE_FLAG_FIRST_PIPE_INSTANCE 参数未用于 CreateNamedPipe 函数,可通过现有文件创建管道,使得恶意用户能够获取安全敏感数据或可能执行任意命令。

SV.PIPE.VAR 检查器可查找其中使用一个变量代替 FILE_FLAG_FIRST_PIPE_INSTANCE 参数与 CreateNamedPipe 函数一起使用的实例。

漏洞与风险

命名管道和共享文件可能威胁系统安全,并允许未经授权的用户获取合法用户的用户名或其他敏感信息。此漏洞的主要风险是,恶意用户可能获取额外的权限并劫持管道来运行任意程序。

缓解与预防

将 FILE_FLAG_FIRST_PIPE_INSTANCE 标记用作 CreateNamedPipe 中的第二个参数可确保管道不按预期计划完成创建,从而避免管道劫持攻击。

漏洞代码示例

复制
    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 函数中的第二个参数,确保不会通过现有函数创建管道。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。