黑客信息网:关于此次condrv.sys拒绝服务漏洞分析

访客3年前黑客文章781

  针对本次浏览器输入\\.\globalroot\device\condrv\kernelconnect导致主机拒绝服务的情况,查明原因是由于condrv驱动的疏忽,在IRP_MJ_CREATE中判断调用源并拒绝后没有对IRP进行正常的完成请求流程操作。导致调用者仍然获得到condrv的设备对象,随后关闭该对象的时候进入IRP_MJ_CLEANUP分发函数,尝试释放资源,但在创建的时候由于被拒绝所以没有分配任何资源,导致释放资源时访问空指针最后系统BSOD。

  定位到IRP_MJ_CREATE分发函数CdpDispatchCreate

  image.png

  可以看到将我们访问的目录遍历查找CdpObjecetCreationTable表,类似的目录有很多,出现漏洞的目录为KernelConnect

  image.png

  由此看出KernelConnect对应的IRP_MJ_CREATE分发函数为CdCreateKernelConnection

  image.png

  Follow CdCreateKernelConnection~

  image.png

  发现有判断IRP的请求模式,如果请求来自应用层返回STATUS_ACCESS_DENIED,看似逻辑正确。

  但是有没有发现漏了什么,,,

  没错,漏了IoCompleteRequest来完成IRP并且没有设置IoStatus,返回到上方的CdpDispatchCreate也并没有进行完成IRP。就这样一个请求被传回了调用者,而IoStatus.Status字段没有填充,或许初始为0(STATUS_SUCCESS),这可能导致允许了这次请求。而触发这次漏洞的原因是由于调用者因此次请求而成功拿到了此文件对象,但是此时condrv没有对这个文件对象中的资源进行任何的初始化。

  随后使用对象完毕后关闭该对象并且回收的时候出现了以下两行代码,FsContext没有进行初始化,是一个悬空指针随后悲剧上演。

  image.png

  Chrome访问\\.\globalroot\device\condrv\kernelconnect时的调用堆栈

  触发此漏洞的R3函数为GetFileAttributeExW,R0函数为CdpDispatchCleanup

  image.png

  其实无论任何程序,尝试使用以下代码都可以造成BSOD

  image.png

  image.png

  随后自写相同逻辑的驱动证明此问题确实会导致Cleanup的请求被发起

  image.png

  测试驱动代码:

  #include

  VOID DriverUnload(PDRIVER_OBJECT DrvObj);

  VOID InitIrp(PDRIVER_OBJECT DrvObj);

  NTSTATUS InitMainDevObj(PDEVICE_OBJECT* OutDevObj, PDRIVER_OBJECT DrvObj, PUNICODE_STRING DevName);

  NTSTATUS IrpDisphDefault(PDEVICE_OBJECT DevObj, PIRP Irp);

  NTSTATUS IrpDisphCleanup(PDEVICE_OBJECT DevObj, PIRP Irp);

  NTSTATUS IrpDisphCreate(PDEVICE_OBJECT DevObj, PIRP Irp);

  NTSTATUS IrpDisphClose(PDEVICE_OBJECT DevObj, PIRP Irp);

  NTSTATUS DriverEntry(PDRIVER_OBJECT DrvObj, PUNICODE_STRING RegPath)

  {

  DECLARE_CONST_UNICODE_STRING(DevName, L"\\Device\\FileAttributesTest");

  DrvObj->DriverUnload = DriverUnload;

  KdPrint(("函数 %ws 执行

  ", __FUNCTIONW__));

  InitIrp(DrvObj);

  InitMainDevObj(NULL, DrvObj, (PUNICODE_STRING)&DevName);

  return STATUS_SUCCESS;

  }

  VOID DriverUnload(PDRIVER_OBJECT DrvObj)

  {

  PDEVICE_OBJECT pDeviceNode = DrvObj->DeviceObject;

  PDEVICE_OBJECT pDeleteNode ;

  while (pDeviceNode)

  {

  pDeleteNode = pDeviceNode->NextDevice;

  IoDeleteDevice(pDeviceNode);

  pDeviceNode = pDeleteNode;

  }

  }

  NTSTATUS InitMainDevObj(PDEVICE_OBJECT* OutDevObj, PDRIVER_OBJECT DrvObj, PUNICODE_STRING DevName)

  {

  PDEVICE_OBJECT CreatedDevice;

  NTSTATUS Status = STATUS_UNSUCCESSFUL;

  Status = IoCreateDevice(DrvObj, 0, DevName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &CreatedDevice);

  if (!NT_SUCCESS(Status))

  return Status;

  CreatedDevice->Flags |= DO_BUFFERED_IO;

  CreatedDevice->Flags &= ~DO_DEVICE_INITIALIZING;

  if(OutDevObj)

  *OutDevObj = CreatedDevice;

  return STATUS_SUCCESS;

  }

  VOID InitIrp(PDRIVER_OBJECT DrvObj)

  {

  for (DWORD32 dwMajorIndex = 0; dwMajorIndex MajorFunction[dwMajorIndex] = IrpDisphDefault;

  DrvObj->MajorFunction[IRP_MJ_CREATE] = IrpDisphCreate;

  DrvObj->MajorFunction[IRP_MJ_CLEANUP] = IrpDisphCleanup;

  DrvObj->MajorFunction[IRP_MJ_CLOSE] = IrpDisphClose;

  }

  NTSTATUS IrpDisphDefault(PDEVICE_OBJECT DevObj, PIRP Irp)

  {

  Irp->IoStatus.Information = 0;

  Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;

  return STATUS_INVALID_DEVICE_REQUEST;

  }

  NTSTATUS IrpDisphCleanup(PDEVICE_OBJECT DevObj, PIRP Irp)

  {

  KdPrint(("函数 %ws 执行

  ", __FUNCTIONW__));

  Irp->IoStatus.Information = 0;

  Irp->IoStatus.Status = STATUS_SUCCESS;

  return STATUS_SUCCESS;

  }

  NTSTATUS IrpDisphCreate(PDEVICE_OBJECT DevObj, PIRP Irp)

  {

  if (Irp->RequestorMode)

  {

  KdPrint(("函数 %ws 执行

  ", __FUNCTIONW__));//此处遗漏

  //Irp->IoStatus.Information = 0;

  //Irp->IoStatus.Status = STATUS_ACCES·S_DENIED;

  return STATUS_ACCESS_DENIED;

  }

  Irp->IoStatus.Information = 0;

  Irp->IoStatus.Status = STATUS_SUCCESS;

  return STATUS_SUCCESS;

  }

  NTSTATUS IrpDisphClose(PDEVICE_OBJECT DevObj, PIRP Irp)

  {

  KdPrint(("函数 %ws 执行

  ", __FUNCTIONW__));

  Irp->IoStatus.Information = 0;

  Irp->IoStatus.Status = STATUS_SUCCESS;

  return STATUS_SUCCESS;

  }

相关文章

天才电脑黑客修电脑(天才大佬是黑客)

天才电脑黑客修电脑(天才大佬是黑客)

本文导读目录: 1、天才还是疯子?他让全球六千万台电脑瘫痪,被抓后竟查出精神病,你怎么看? 2、黑客的著名人物 3、美国计算机天才尼克的生平事迹 4、电脑天才林纳斯·托瓦兹 5、来个黑...

网络营销资讯(影响网络营销的5个因素)

网络营销资讯(影响网络营销的5个因素)

网络推广 网络营销 网站制作 博创互联 网络营销有八个因素: 1、投入了多少推广费用; 2、采用了几种网络推广方法; 3、这些推广方式带来了多少个独立访客(uv); 4、这些访客一共浏览...

家食乐中式简餐开店需要多少钱?微薄投入换来巨额利润

家食乐中式简餐开店需要多少钱?微薄投入换来巨额利润

对付大部门公共轻创业者而言,选择一个投入资金少收入稳健的加盟项目,的确就是乐成了一半,究竟在这个竞争剧烈的行业市场中,要想站稳脚跟,分得属于本身的一分羹,最要害的照旧需要创业者可以或许在起初就选择一个...

移动通话记录怎么查询(网上可以查询手机通话记

  思科(Cisco)本周发布安全公告,警告旗下采用Linux操作系统核心的网络产品存在名为FragmentStack的阻断服务(Denial of Service,DoS)漏洞,可影响路由器、交...

福利吧新开QQ群&TG

利便人人领会网站更新的内容,和更多更快的新闻。 新开2000人奥利给官方QQ群,欢迎来加。 每人仅限加一个群。 福吧一群:342171585(2000人大群) 福吧二群:338635041(2...

怎么用网络推广业务(七大核心推广方法让你的产品秒到首页)

  为什么说现在是网络时代,人们经历过许多 时期,   例如,有农耕文明的时期,有渔猎的时期,有蒸汽发生器的时期,有工业革命,有房地产业时期,有计算机时代,也是有网络时代。   1、企业是什么?公司是...