欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Symantec终端防护内核内存信息泄漏漏洞分析(CVE-2018-18366)

来源:本站整理 作者:佚名 时间:2019-04-28 TAG: 我要投稿

Cisco Talos在赛门铁克终端防护(Symantec Endpoint Protection)小型企业版的ccSetx86.sys内核驱动中发现了一个信息泄漏漏洞。该漏洞位于驱动程序的控制消息处理程序中。攻击者可以发送精心制造的请求,使得驱动程序返回未经初始化的内核内存块,从而可能泄漏敏感信息。例如,攻击者可以将该漏洞用于绕过特权令牌或内核内存地址等内核安全缓解方式。非特权用户可以以用户模式运行程序,从而触发这一漏洞。
根据我们的协调披露政策,Talos与Symantec进行了合作,从而确保为该漏洞提供补丁。
漏洞描述
赛门铁克终端防护(Symantec Endpoint Protection)小型企业版的ccSetx86.sys 0x224844位置存在内核内存信息泄漏漏洞(CVE-2018-18366)。特制的IRP请求可能会导致驱动程序返回未初始化的内存,从而导致内核内存泄漏。攻击者可以发送IRP请求来触发此漏洞。
该内核内存泄漏位于IOCTL处理程序中,这是用于16.0.0.77版本驱动程序的“0x224844”驱动代码。攻击者可以通过向ccSet_{F7A725B7-8267-494C-9647-F4FC1D53C6A3}设备发送恶意的IOCTL请求,从而触发该漏洞。设备的默认访问控制,允许系统上的任何用户向驱动程序发送IOCTL请求。
测试版本
Symantec.cloud – Endpoint Protection – NIS-22.14.2.13
Symantec Endpoint Protection Small Business Edition(赛门铁克终端防护小型企业版)ccSetx86.sys(Windows 7 x86)
产品网址
https://www.symantec.com/products/endpoint-smb
CVSSv3分数
4.3 – CVSS:3.0/AV:L/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N
CWE
CWE-200:信息泄漏
漏洞详情
Symantec Endpoint Protection小型企业版(SEP SBE)是针对小型企业的复杂终端防护解决方案。
本报告适用于使用SEP SBE安装中ccSetx86.sys驱动程序中的漏洞,该漏洞默认情况下处于活动状态。
我们可以通过向ccSet_{F7A725B7-8267-494C-9647-F4FC1D53C6A3}设备中发送IOCTL请求来触发这一漏洞。在这里,我们展示了设备上的默认访问控制,允许系统上的任何用户发送IOCTL请求:
\Device\ccSet_{F7A725B7-8267-494C-9647-F4FC1D53C6A3}
  Type: Device
  RW Everyone
  RW NT AUTHORITY\SYSTEM
我们需要使用ZwOpenFile API,而不是尝试通过CreateFile向该设备打开公开的符号链接,以获取该设备的有效句柄。
内核内存泄漏位于0x224844控制代码的IOCTL处理程序中。易受攻击的函数是:
Line 1  signed int __stdcall sub_8DE2FB98(PIRP irp, int (__stdcall ***a2)(char *, _DWORD *, int *))
Line 2  {
Line 3    ULONG_PTR outLen;
Line 4    stackLocation = irp->Tail.Overlay.CurrentStackLocation;
Line 5    if ( !irp->AssociatedIrp.SystemBuffer
Line 6      || stackLocation->Parameters.DeviceIoControl.InputBufferLength Parameters.DeviceIoControl.OutputBufferLength Parameters.DeviceIoControl.IoControlCode & 3 )
Line 12   {
Line 13     (...)
Line 14   }
Line 15   else
Line 16   {
Line 17     outUserBuffer = irp->AssociatedIrp.SystemBuffer;
Line 18   }
Line 19   if ( outUserBuffer )
Line 20   {
Line 21     someConstructor(&v14);
Line 22     v13 = copyString2(
Line 23             &v14,
Line 24             (int)irp->AssociatedIrp.SystemBuffer,
Line 25             stackLocation->Parameters.DeviceIoControl.InputBufferLength,
Line 26             (PWCHAR)&dstStringLen);
Line 27     if ( v13 >= 0 )
Line 28     {
Line 29       outLen = stackLocation->Parameters.DeviceIoControl.OutputBufferLength;
Line 30       v5 = (**v11)((char *)&v14, outUserBuffer, (int *)&outLen);// 8de2fb84
Line 31       if ( v5 >= 0 )
Line 32       {
Line 33         irp->IoStatus.Information = outLen;
Line 34       }
Line 35     
Line 36     (...)
值得一提的是,该漏洞仅在处理过程中使用METHOD_BUFFERED时才会显现。我们在上述代码的第33行看到,如果位于第30行的函数返回一个正值,那么IoStatus.Information字段(表示将从OutputBuffer中的内核模式返回多少字节)将被设置为outLen – OutputBufferLen。位于第29行开头的该变量的值直接来自用户,因此,如果未精确设置outLen变量,那么用户则可以完全控制返回用户模式的字节数。
我们在sub_8DE34328函数中查看outLen变量的处理方式:
Line 1  int __thiscall sub_8DE34328(struct_this_3 *this, char *obj, int outUserBuffer, unsigned int *outLen)
Line 2  {
Line 3  (...)
Line 4
Line 5      outLen_ = *outLen;
Line 6      v12 = v18 + 2;
Line 7      someUnicodeString = v12;
Line 8      if ( outLen_ >= v12 )

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.ylxj.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载