利用SMBGhost (CVE-2020-0796)实现本地权限提升
字数 1464 2025-08-25 22:58:29

SMBGhost (CVE-2020-0796)漏洞分析与利用技术详解

漏洞概述

CVE-2020-0796是Windows SMBv3.1.1协议压缩机制中的一个严重漏洞,也被称为"SMBGhost"。该漏洞影响Windows 10的1903和1909版本,微软已发布补丁修复。漏洞最初被认为可导致远程拒绝服务(DoS),但进一步研究发现它还可实现本地权限提升(LPE)和潜在的远程代码执行(RCE)。

技术分析

漏洞根源

漏洞存在于SMB服务器驱动程序srv2.sysSrv2DecompressData函数中,是一个整数溢出漏洞。以下是关键数据结构:

typedef struct _COMPRESSION_TRANSFORM_HEADER {
    ULONG ProtocolId;
    ULONG OriginalCompressedSegmentSize;  // 可控字段
    USHORT CompressionAlgorithm;
    USHORT Flags;
    ULONG Offset;  // 可控字段
} COMPRESSION_TRANSFORM_HEADER;

typedef struct _ALLOCATION_HEADER {
    PVOID UserBuffer;  // 可被覆盖的关键字段
    // ... 其他字段
} ALLOCATION_HEADER;

漏洞函数分析

Srv2DecompressData函数的主要流程:

  1. 内存分配:使用SrvNetAllocateBuffer分配缓冲区

    Alloc = SrvNetAllocateBuffer((ULONG)(Header->OriginalCompressedSegmentSize + Header->Offset), NULL);
    

    这里OriginalCompressedSegmentSize + Header->Offset可能整数溢出

  2. 解压缩数据:调用SmbCompressionDecompress

    SmbCompressionDecompress(Header->CompressionAlgorithm, ...);
    
  3. 数据复制:如果Offset>0,复制原始数据

    memcpy(Alloc->UserBuffer, (PUCHAR)Header + sizeof(COMPRESSION_TRANSFORM_HEADER), Header->Offset);
    

漏洞触发条件

通过精心构造的OriginalCompressedSegmentSizeOffset值:

  • 使用极大的OriginalCompressedSegmentSize和有效的Offset
  • 导致分配缓冲区时整数溢出,分配的缓冲区小于实际需要
  • 解压缩时发生越界写入

内存分配机制

SrvNetAllocateBuffer的分配策略:

  • 16MB:分配失败

  • 1MB-16MB:使用SrvNetAllocateBufferFromPool
  • <1MB:从后备列表(Lookaside List)分配

后备列表大小:[0x1100, 0x2100, 0x4100, 0x8100, 0x10100, 0x20100, 0x40100, 0x80100, 0x100100]

利用原理

  1. 越界写入:通过解压缩阶段的溢出覆盖ALLOCATION_HEADER结构
  2. 控制UserBuffer:覆盖Alloc->UserBuffer指针
  3. 任意内存写入:后续的memcpy操作实现任意地址写入

本地权限提升(LPE)利用

利用技术

采用"令牌权限滥用"技术:

  1. 使用NtQuerySystemInformation(SystemHandleInformation)泄露进程令牌地址
  2. 覆盖当前进程令牌,提升权限
  3. 注入DLL到winlogon.exe启动特权cmd

利用步骤

  1. 构造恶意SMB数据包触发漏洞
  2. 覆盖关键内核数据结构
  3. 泄露并修改进程令牌
  4. 提升当前进程权限
  5. 注入代码到高权限进程

限制条件

  • 当前实现需要中等完整性级别
  • 依赖特定API调用,在低完整性级别可能不可用

防御与修复

  1. 立即更新:安装微软官方补丁
  2. 临时缓解
    • 禁用SMBv3.1.1压缩功能
    Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" DisableCompression -Type DWORD -Value 1 -Force
    
    • 关闭445端口
  3. 网络隔离:限制SMB端口的网络访问

研究展望

进一步研究方向:

  1. 实现从LPE到RCE的利用
  2. 探索其他可覆盖的内核数据结构
  3. 研究在低完整性级别下的利用方法

总结

CVE-2020-0796是一个严重的SMB协议漏洞,通过精心构造的压缩数据包可导致本地权限提升。虽然当前公开的PoC主要展示LPE能力,但该漏洞理论上也可实现远程代码执行。系统管理员应立即应用补丁并采取缓解措施,研究人员可继续深入探索其完整利用潜力。

参考资源

  1. 微软安全公告
  2. ZecOps研究报告原文
  3. 本地提权技术参考
SMBGhost (CVE-2020-0796)漏洞分析与利用技术详解 漏洞概述 CVE-2020-0796是Windows SMBv3.1.1协议压缩机制中的一个严重漏洞,也被称为"SMBGhost"。该漏洞影响Windows 10的1903和1909版本,微软已发布补丁修复。漏洞最初被认为可导致远程拒绝服务(DoS),但进一步研究发现它还可实现本地权限提升(LPE)和潜在的远程代码执行(RCE)。 技术分析 漏洞根源 漏洞存在于SMB服务器驱动程序 srv2.sys 的 Srv2DecompressData 函数中,是一个整数溢出漏洞。以下是关键数据结构: 漏洞函数分析 Srv2DecompressData 函数的主要流程: 内存分配 :使用 SrvNetAllocateBuffer 分配缓冲区 这里 OriginalCompressedSegmentSize + Header->Offset 可能整数溢出 解压缩数据 :调用 SmbCompressionDecompress 数据复制 :如果Offset>0,复制原始数据 漏洞触发条件 通过精心构造的 OriginalCompressedSegmentSize 和 Offset 值: 使用极大的 OriginalCompressedSegmentSize 和有效的 Offset 值 导致分配缓冲区时整数溢出,分配的缓冲区小于实际需要 解压缩时发生越界写入 内存分配机制 SrvNetAllocateBuffer 的分配策略: 16MB:分配失败 1MB-16MB:使用 SrvNetAllocateBufferFromPool <1MB:从后备列表(Lookaside List)分配 后备列表大小: [0x1100, 0x2100, 0x4100, 0x8100, 0x10100, 0x20100, 0x40100, 0x80100, 0x100100] 利用原理 越界写入 :通过解压缩阶段的溢出覆盖 ALLOCATION_HEADER 结构 控制UserBuffer :覆盖 Alloc->UserBuffer 指针 任意内存写入 :后续的 memcpy 操作实现任意地址写入 本地权限提升(LPE)利用 利用技术 采用"令牌权限滥用"技术: 使用 NtQuerySystemInformation(SystemHandleInformation) 泄露进程令牌地址 覆盖当前进程令牌,提升权限 注入DLL到 winlogon.exe 启动特权cmd 利用步骤 构造恶意SMB数据包触发漏洞 覆盖关键内核数据结构 泄露并修改进程令牌 提升当前进程权限 注入代码到高权限进程 限制条件 当前实现需要中等完整性级别 依赖特定API调用,在低完整性级别可能不可用 防御与修复 立即更新 :安装微软官方补丁 临时缓解 : 禁用SMBv3.1.1压缩功能 关闭445端口 网络隔离 :限制SMB端口的网络访问 研究展望 进一步研究方向: 实现从LPE到RCE的利用 探索其他可覆盖的内核数据结构 研究在低完整性级别下的利用方法 总结 CVE-2020-0796是一个严重的SMB协议漏洞,通过精心构造的压缩数据包可导致本地权限提升。虽然当前公开的PoC主要展示LPE能力,但该漏洞理论上也可实现远程代码执行。系统管理员应立即应用补丁并采取缓解措施,研究人员可继续深入探索其完整利用潜力。 参考资源 微软安全公告 ZecOps研究报告原文 本地提权技术参考