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

访客3年前黑客文章786

  针对本次浏览器输入\\.\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;

  }

相关文章

提现不了找黑客怎样-邮箱收到黑客发过来的邮件(为什么工作邮箱会收到黑客)

提现不了找黑客怎样-邮箱收到黑客发过来的邮件(为什么工作邮箱会收到黑客)

提现不了找黑客怎样相关问题 为什么工作邮箱会收到黑客相关问题 怎么能快速成为黑客 沈剑秋爱林怡吗(爱奇艺) 黑客...

在线查开的房记录查询(查kaifang网址)

线上查开的房查询记录(查kaifang网站地址) 在搬入酒店餐厅或快捷酒店的情况下,一般都需要开展备案,并留有开过屋子的纪录。很多人都好奇心,自身的酒店开房记录可以储存多长时间,怎么才能查到别人的酒...

企业支付基础(一)——当我们谈企业支付时,是在谈什么?

企业支付基础(一)——当我们谈企业支付时,是在谈什么?

编辑导语:我们泛泛买对象付出一般都被称为C端付出,也就是小我私家付出;相反企业付出也就是B端付出,企业付出由于资金往来浩瀚,所以一直都照旧没有完全办理的规模;本文作者分享了关于企业付出的痛点和需求,我...

高端深圳商务服务

vip会员ID:162489 呢称:小丫头 性別:女 种类:伴游 年纪:25岁 个子:167CM 文凭:大学本科 结过婚:单身 大城市:广东省深圳市 岗位:餐馆/度假旅游 語言:没填 十二星座:巨蟹座...

微信里面的重要聊天记录如何收藏

我们在利用微信时,会收到一些主要的信息,好比老友的生日,珍贵的照片等等。怎么样保藏这些主要的聊天记实信息,本文将具体介绍。 东西/原料 微信方式/步调 1我们在手机中找到本身安装的微信应用,点击后...

婴童商贸公司起名大全(182个创新名字)

上档次两个字婴童商贸公司取名名字大全打分 副虹婴童商贸公司   79.45分   存亡婴童商贸公司   84.17分   侃儿婴童商贸公司   38.65分   恶梦婴童商贸公司   14.9分...