微软 SMBv3客户端 /服务端远程代码执 行漏洞( CVE-2020 -0796)技术分析 微软安全中心在北京时间 3月12日23时发布了影响 Windows 10 等系统用户 的SMBv3远程代码执行漏洞补丁。我们建议受影响的用户尽快按微软更新信 息指南安装该补丁 :https://portal.msrc.microsoft.com/en -US/security - guidance/advisory/CVE -2020 -0796。 同时, 360Vul can Team 对该漏洞进行了 快速分析,该漏洞属于高危的零接触远程代码执行漏洞,技术分析如下。 SMB漏洞分析 根本原因 漏洞发生在 srv2.sys 中,由于 SMB没有正确处理压缩的数据包 ,在解压数据包的 时候使用客户端 传过来的长度进行解压时 ,并没有检查长度是否合法 .最终导致整 数溢出。 详细分析 SMB v3中支持数据压缩 ,如果 SMB Header 中的 ProtocolId 为0x424D53FC 也就是 0xFC, 'S', 'M', 'B'. 那么就说明数据是压缩的 ,这时 smb会调用压缩解压处 理的函数 . 首先 SMB会调用 srv2!Srv2ReceiveHandler 函数接收 smb数据包,并根据 ProtocoIId 设置对应的处理函数。 1. __int64 __fastcall Srv2ReceiveHandler(__int64 a1, void *Src, __int64 a3, unsig ned int a4, unsigned int *a5, char *Srca, struct _SLIST_ENTRY *a7, _QWORD *a8) 2. { 3. ... 4. // 5. // 这里判断头部 ProtocolId 6. // 7. if ( **((_DWORD **)&v20[15].Next[1].Next + 1) == 'BMS\xFC' ) 8. { 9. if ( KeGetCurrentIrql() > 1u ) 10. { 11. v20[14].Next = (_SLIST_ENTRY *)v11; 12. v20[2].Next = (_SLIST_ENTRY *)Srv2DecompressMessageAsync; 13. v43 = HIDWORD(v20 ->Next) == 5; 14. *((_DWORD *)&v20[3].Next + 2) = 0; 15. if ( v43 ) 16. { 17. LOBYTE(v71) = 1; 18. LOBYTE(v35) = 1; 19. SRV2_PERF_ENTER_EX(&v20[32].Next + 1, v35, 307i64, "Srv2PostToThrea dPool", (_DWORD)v71); 20. } 21. v44 = *((_QWORD *)&v20[3].Next[8].Next + 1); 22. v45 = *(_QWORD *)(v44 + 8i64 * KeGetCurrentNodeNumber() + 8); 23. if ( !ExpInterlockedPushEntrySList((PSLIST_HEADER)(v45 + 16), v20 + 1) && *(_WORD *)(v45 + 66) ) 24. RfspThreadPoolNodeWa keIdleWorker(v45); 25. goto LABEL_168; 26. } 27. } 28. } 从代码中我们可以看出如果是压缩的数据则调用 Srv2DecompressMessageAsync 函数进行解压缩 . srv2!Srv2DecompressMessageAsync 会调用 Srv2DecompressData 函数. 结构如下 : 1. typede f struc t _COMPRESSION_TRANSFORM_HEADE R 2. { 3. ULONG ProtocolId; 4. ULONG OriginalCompressedSegmentSize; 5. USHORT CompressionAlgorithm; 6. USHORT Flags; 7. ULONG Length; 8. }COMPRESSION_TRANSFORM_HEADER, *PCOMPRESSION_TRANSFORM_HEADER; 产生整数溢出漏洞的代码如下: 1. __int64 __fastcall Srv2DecompressDat a(__int64 pData) 2. { 3. __int64 v2; // rax 4. COMPRESSION_TRANSFORM_HEADER Header; // xmm0 MAPDST 5. __m128i v4; // xmm0 6. unsigne d int CompressionAlgorithm; // ebp 7. __int64 UnComparessBuffer; // rax MAPDST 8. int v9; // eax 9. int v11; // [rsp+60h] [rbp+8h] 10. v11 = 0; 11. v2 = *(_QWORD *)(pData + 0xF0); 12. if ( *(_DWORD *)(v2 + 0x24) < 0x10u ) // 这里判断数据包长度的最小 值 13. retur n 0xC000090 Bi64; 14. Header = *(COMPRESSION_TRANSFORM_HEADER *)*(_QWORD *)(v2 + 0x18);// [v2+0x1 8]中为客户端传进来的 Buffer 15. // [v2+0x24] 为数据包长 度 16. v4 = _mm_srli_si128((__m128i)Header, 8); 17. CompressionAlgorithm = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(pData + 0x50) + 0 x1F0i64) + 0x8Ci64); 18. if ( CompressionAlgorithm != v4.m128i_u16 [0] ) 19. retur n 0xC00000B Bi64; 20. UnCompressBuffe r = SrvNetAllocateBuffer( (unsigne d int)(Header.OriginalCompre ssedSegmentSize + v4.m128i_i32 [1]), 0i64);// OriginalCompressedSegmentSize + C ompressedSegmentSize ,这里没有检查相加的值,导致整数溢出,分配一个较小的 UnCompres sBuffer 21. if ( !UnComparessBuffer ) 22. retur n 0xC000009 Ai64; 23. if ( (int)SmbCompressionDecompress( 24. CompressionAlgorithm, // CompressionAlgorith m 25. *(_QWORD *)(*(_QWORD *)(pData + 0xF0) + 0x18i64) + (unsigne d int) Header.Length + 0x10i64,// CompressedBuffe r 26. (unsigne d int)(*(_DWORD *)(*(_QWORD *)(pData + 0xF0) + 0x24i64) - Header.Length - 0x10),// CompressedBufferSiz e 27. (unsigne d int)Header.Length + *(_QWORD *)(UnComparessBuffer + 0x1 8),// UncompressedBuffer ,会

pdf文档 360 微软SMBv3客户端、服务端远程代码执行漏洞(CVE-2020-0796)技术分析

安全报告 > 360 > 文档预览
中文文档 7 页 50 下载 1000 浏览 0 评论 0 收藏 3.0分
温馨提示:本文档共7页,可预览 3 页,如浏览全部内容或当前文档出现乱码,可开通会员下载原始文档
360 微软SMBv3客户端、服务端远程代码执行漏洞(CVE-2020-0796)技术分析 第 1 页 360 微软SMBv3客户端、服务端远程代码执行漏洞(CVE-2020-0796)技术分析 第 2 页 360 微软SMBv3客户端、服务端远程代码执行漏洞(CVE-2020-0796)技术分析 第 3 页
下载文档到电脑,方便使用
本文档由 思安2022-11-29 01:41:03上传分享
给文档打分
您好可以输入 255 个字符
网站域名是多少( 答案:github5.com )
评论列表
  • 暂时还没有评论,期待您的金玉良言
站内资源均来自网友分享或网络收集整理,若无意中侵犯到您的权利,敬请联系我们微信(点击查看客服),我们将及时删除相关资源。