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 参数,确保不会通过现有文件创建管道。