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