SV.PIPE.CONST

潜在的管道劫持

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

SV.PIPE.CONST 检查器可查找在没有 FILE_FLAG_FIRST_PIPE_INSTANCE 的情况下使用 CreateNamedPipe 函数的实例。

漏洞与风险

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

缓解与预防

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

漏洞代码示例

复制
hPipe = CreateNamedPipe( 
       lpszPipename,         // pipe name 
       PIPE_ACCESS_DUPLEX,     // 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 标记了此代码,因为 FILE_FLAG_FIRST_PIPE_INSTANCE 参数未用于 CreateNamedPipe 函数。此代码允许通过现有文件创建通道,这可能让恶意用户能够获取安全敏感数据或可能执行任意命令。

修正代码示例

复制
    hPipe = CreateNamedPipe( 
          lpszPipename,         // pipe name 
          FILE_FLAG_FIRST_PIPE_INSTANCE |
          PIPE_ACCESS_DUPLEX,     // 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 参数,确保不会通过现有文件创建管道。

安全培训

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