首页 运维 网络学院 查看内容

Windows 2K~ Vista IoDeleteSymblicLink 低资源下句柄泄露BUG

2011-8-29 10:29 766 0

摘要: 2K, XP ,2003 , Vista 的Windows操作系统目前为止的新版本中,IoDeleteSymbolicLink调用删除完符号链接后,会检查ObIsLUIDDeviceMapsEna...
关键词: nbsp 句柄 NameBuffer IopDeleteSession SymbolicLinkName ExAllocatePoolWi DirInfoBuffer Status Attributes 符号

2K, XP ,2003 , Vista 的Windows操作系统目前为止的新版本中,IoDeleteSymbolicLink调用删除完符号链接后,会检查ObIsLUIDDeviceMapsEnabled,如果LUID DosDevices被禁用,而且开启了终端服务,将会调用IopDeleteSessionSymLinks删除\Session\*\DosDevice\下的同名符号链接。 其中IopDeleteSessionSymLinks在调用ZwOpenDirectoryObject会两次调用ExAllocatePoolWithTag申请内存分别存放Directory Informaiton和最终的符号链接名称,在申请内存失败时,函数没有关闭打开的目录对象句柄,就直接返回了,造成了句柄泄露 由于指定了OBJ_KERNEL_HANDLE,泄露将发生在Kernel Handle Table F5整理代码(VISTA SP1): //打开了句柄DirectoryHandle InitializeObjectAttributes( &Attributes,                                &UnicodeString,                                OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,                                NULL,                                NULL                              ); Status = ZwOpenDirectoryObject(&DirectoryHandle, DIRECTORY_QUERY, &Attributes);   if ( NT_SUCCESS(Status)){    Size = 2 * LinkName->Length + 256;     NameBuffer = ExAllocatePoolWithTag(PagedPool, Size, ' oI');     pNameBuffer = NameBuffer;     if ( !NameBuffer ) //没有关闭句柄      return STATUS_INSUFFICIENT_RESOURCES;     SymbolicLinkName.Length = Size;    SymbolicLinkName.MaximumLength = Size;    SymbolicLinkName.Buffer = (PWSTR)NameBuffer;     DirInfoBuffer = (LSA_UNICODE_STRING *)ExAllocatePoolWithTag(PagedPool, 0x1000u, ' oI');    Buffer = DirInfoBuffer;     if ( !DirInfoBuffer )    { //没有关闭句柄      ExFreePoolWithTag(pNameBuffer, 0);      return STATUS_INSUFFICIENT_RESOURCES;    } Win7的内核似乎直接去掉了IopDeleteSessionSymLinks这个机制,所以没有这个泄露问题
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部