Announcement

👇Official Account👇

Welcome to join the group & private message

Article first/tail QR code

Skip to content

CVE-2026-6875 深度复盘:ServiceNow AI 平台预认证沙箱逃逸 RCE 在野利用链

2026 年 7 月 20 日,Searchlight Cyber 旗下 Assetnote 团队发布了一篇标题极具冲击力的技术报告:

《Smashing the ServiceNow Sandbox: Pre-Authentication RCE》

报告的结论是:ServiceNow AI 平台存在一个预认证(pre-authentication)沙箱逃逸远程代码执行漏洞,编号 CVE-2026-6875,CVSS 9.5。更危险的是,该漏洞在 7 月 13 日补丁发布仅一周后,就被威胁情报平台 Defused 确认在野外利用——而且攻击者使用的 gadget chain 与公开 PoC 不同。

ServiceNow 支撑着全球 85% 的财富 500 强企业、超过 10 万个企业应用,年处理工作流超过 1000 亿次。一个无需认证、单条 HTTP 请求即可 RCE 的漏洞,意味着任何暴露在公网且未打补丁的自托管实例都处于高危状态。

本文将从攻击链、利用原理、在野态势、检测与加固四个维度,给出一份工程师视角的深度复盘。


一、漏洞概述:为什么它不只是又一个 RCE

属性详情
CVECVE-2026-6875
平台ServiceNow AI Platform
类型沙箱逃逸 → 预认证 RCE
CVSS9.5(Critical)
披露时间2026-07-20(Assetnote / Searchlight Cyber)
补丁时间2026-07-13(自托管),2026-04(云端)
在野利用2026-07-19 起确认(Defused)
关键 endpoint/assessment_thanks.do 等预认证 .do 路径
修复版本Brazil EA / GA;Australia Patch 2;Zurich Patch 7b / Patch 9;Yokohama Patch 12 HF 1b / Patch 13

这个漏洞的特殊之处在于:它攻击的是 ServiceNow 的脚本执行沙箱本身,而不是某个简单的注入点。

ServiceNow 的脚本引擎(Rhino/NG JavaScript)长期以来有一个受限沙箱,禁止 eval、动态函数创建、任意函数声明和敏感 Java 类访问。但 Assetnote 发现,通过 gs.include() 加载的 Script Include 文件运行在一个权限更高的执行上下文中,攻击者可以通过污染全局 JavaScript 对象,把受限沙箱里的代码“弹射”到外部执行。


二、攻击链拆解:从 GlideRecord 注入到实例接管

整个攻击链分为四个阶段:

text
阶段 1:预认证入口注入 JavaScript 过滤器

阶段 2:在受限沙箱中执行原型链污染

阶段 3:触发 gs.include() 加载 Script Include,逃逸到高权限上下文

阶段 4:调用内部 API,创建管理员、访问表数据、控制 MID Server

2.1 阶段 1:GlideRecord 查询注入

ServiceNow 的 GlideRecord 是几乎所有应用都使用的数据库查询 API。某些预认证页面(如 assessment_thanks.do)会把用户传入的 sysparm_* 参数直接拼进 GlideRecord 查询。

当查询值带有特殊前缀时,ServiceNow 会把它当作 JavaScript 表达式执行:

text
javascript:<expression>

例如,一个恶意的 filter 参数可能是:

text
javascript:globalFunction()

ServiceNow 的沙箱会限制这个表达式的能力:不能 eval、不能访问敏感类、不能动态创建函数。但 Assetnote 发现,沙箱里的代码可以修改全局对象,影响后续被 gs.include() 加载的脚本。

2.2 阶段 2:原型链污染

受限沙箱内的代码虽然不能直接执行危险操作,但拥有足够的 JavaScript 对象访问权。攻击者通过修改 Object.prototypeFunction.prototype 或类似全局对象,把恶意字符串“植入”到 Script Include 的运行时环境。

一个简化的概念模型是:

javascript
// 沙箱内执行,受限但可污染全局对象
Object.prototype.someProperty = "evil";

当某个 Script Include 随后读取该属性时,就会触发攻击者控制的代码路径。

2.3 阶段 3:gs.include() 沙箱逃逸

gs.include() 是 ServiceNow 加载脚本库的标准方式。它会把 Script Include 文件加载到一个比沙箱表达式更宽松的执行上下文中。攻击者利用阶段 2 的污染,让 gs.include() 在加载某个常用库时,把污染数据带入外部上下文,从而实现沙箱逃逸。

这一步是整个攻击链的核心:

沙箱不是被“攻破”的,而是通过 Script Include 的加载机制被绕过的。

逃逸后,攻击者就获得了接近管理员脚本的能力,可以调用 GlideRecord 访问任意表、调用 Packages.java.lang.Runtime 执行系统命令,或调用 ServiceNow 内部 API 创建用户。

2.4 阶段 4:实例接管与 MID Server 横向移动

ServiceNow 实例通常连接着 MID Server(Management, Instrumentation, and Discovery),这是部署在企业内网的代理,用于连接内部系统(如 Active Directory、VMware、网络设备)。一旦 ServiceNow 实例被攻陷,攻击者可以通过 MID Server 向内网发送命令,实现横向移动。

这意味着:

一个公网 ServiceNow 漏洞,可能最终演变为企业内网的全局失守。


三、在野利用态势:补丁一周后攻击者就开始“绕”

Defused 在 7 月 19 日(补丁发布一周后)观察到在野利用流量。最关键的观察是:

攻击者使用了与公开 PoC 不同的 sandbox-escape gadget chain。

这意味着:

  1. 漏洞存在不止一种可行的利用路径。
  2. 基于公开 PoC 的网络层防御(如 WAF 规则)可能被绕过。
  3. 攻击者具备真实的逆向分析能力,而不是简单的脚本小子行为。

ServiceNow 官方在 KB3137947 中声明“尚未发现针对 ServiceNow 实例的主动利用”,但这一立场与 Defused 的观察数据相矛盾。对安全团队来说,这种“厂商未确认但情报已确认”的窗口期是最危险的时刻——你可能因为依赖官方通报而延迟响应。


四、检测脚本:从日志中快速发现攻击痕迹

由于 payload 包含 javascript: 前缀和 sysparm_* 参数,检测的核心是监控预认证端点的请求特征。下面给出一个基于 Python 的日志扫描脚本,用于从 Web 访问日志中快速发现可疑流量。

python
#!/usr/bin/env python3
"""
CVE-2026-6875 ServiceNow 可疑流量快速检测脚本
用法:python detect_servicenow_cve_2026_6875.py access.log
"""

import re
import sys
from pathlib import Path
from urllib.parse import unquote

# 关注的预认证 endpoint 和参数模式
SUSPICIOUS_ENDPOINTS = (
    "/assessment_thanks.do",
    "/kb_view.do",
    "/sys_report_display.do",
    "/xmlhttp.do",
)

JS_SCHEME_PATTERN = re.compile(r"javascript\s*:", re.IGNORECASE)
SYSPARM_PATTERN = re.compile(r"sysparm_[a-z_]+=", re.IGNORECASE)


def analyze_line(line: str) -> dict | None:
    """分析单条日志,返回可疑字段或 None"""
    # 只检查预认证 endpoint
    if not any(ep in line for ep in SUSPICIOUS_ENDPOINTS):
        return None

    # 解码 URL 编码,便于发现混淆
    decoded = unquote(line)

    if not JS_SCHEME_PATTERN.search(decoded):
        return None

    # 提取 sysparm 参数值
    matches = SYSPARM_PATTERN.findall(decoded)
    if not matches:
        return None

    return {
        "line": line.strip(),
        "decoded": decoded,
        "sysparm_count": len(matches),
    }


def main() -> None:
    if len(sys.argv) < 2:
        print(f"Usage: {sys.argv[0]} <access.log> [access2.log ...]")
        sys.exit(1)

    hits = 0
    for path in sys.argv[1:]:
        for line in Path(path).read_text(errors="ignore").splitlines():
            result = analyze_line(line)
            if result:
                hits += 1
                print(f"[HIT #{hits}] sysparm_count={result['sysparm_count']}")
                print(result["decoded"][:400])
                print("-" * 80)

    print(f"\nTotal suspicious hits: {hits}")
    print("提示:命中不等于成功利用,需要结合实例日志、sys_user 审计、MID Server 命令日志进一步确认。")


if __name__ == "__main__":
    main()

运行示例:

bash
python detect_servicenow_cve_2026_6875.py /var/log/servicenow/access.log

4.1 检测重点指标

检测位置关注指标
Web 访问日志预认证 .do 端点出现 javascript:sysparm_* 参数
实例审计日志sys_user 表出现新增或权限变更的管理员账户
Script Include 日志非常用 Script Include 被异常加载或修改
MID Server 日志出现非工作时间的 PowerShell / shell 命令执行
网络流量外联 C2、大体积数据外传

五、加固与应急响应清单

5.1 立即行动(0-24 小时)

  1. 确认版本与补丁状态
    • 对照下表确认实例版本是否在受影响范围:
    • 若未修复,立即升级或临时下线公网暴露面。
版本家族修复版本
BrazilEA / GA
AustraliaPatch 2
ZurichPatch 7b / Patch 9
YokohamaPatch 12 Hot Fix 1b / Patch 13
  1. 临时网络层缓解

    • 在 WAF/反向代理上阻止包含 javascript: scheme 的 sysparm_* 参数。
    • 限制 /assessment_thanks.do 等预认证端点的公网访问,如果业务允许,仅对 VPN 或白名单开放。
  2. 启动威胁狩猎

    • 运行上面的检测脚本扫描至少 30 天访问日志。
    • 审计 sys_user 表中近 30 天内的新增/权限变更记录。
    • 检查 MID Server 的命令执行日志,寻找异常进程。

5.2 短期加固(1-7 天)

  1. 应用 ServiceNow Guarded Script 保护

    • 这是 ServiceNow 推出的沙箱增强机制,要求复杂的服务器端脚本必须放入 Script Include,并减少沙箱内表达式的复杂度。
    • 升级后检查“Incompatible Guarded Scripts”列表,修复不兼容脚本。
  2. MID Server 网络分段

    • 将 MID Server 的出站权限限制到最小必需范围。
    • 禁止 MID Server 直接访问互联网,除非业务必需。
    • 对 MID Server 主机启用 EDR 和命令行审计。
  3. 启用多因素认证与权限最小化

    • 即使漏洞是预认证的,也要确保现有管理员账户启用 MFA,防止被窃取后进一步利用。

5.3 长期治理

  1. 建立 ServiceNow 资产台账

    • 很多企业存在“影子 ServiceNow”实例,由业务部门自行部署。全面盘点自托管和合作伙伴托管实例。
  2. 加入 CISA KEV 跟踪流程

    • 将 ServiceNow 等关键 SaaS/自托管应用纳入 KEV 订阅,确保漏洞披露后 24 小时内启动评估。
  3. 模拟攻击演练

    • 在隔离测试环境中复现 CVE-2026-6875,验证 WAF 规则、EDR 检测和响应流程的有效性。

六、与其他 7 月高危漏洞的联动风险

7 月 13 日补丁周是 2026 年最密集的 CVE 窗口之一。CVE-2026-6875 与以下漏洞存在联动风险:

  • SharePoint 四连 CVE(含 CVE-2026-58644):攻陷 SharePoint 后窃取 IIS 机器密钥,可持久化。
  • SonicWall SMA1000 零日:同样用于获取初始访问权限。
  • FortiSandbox 双 CVE:网络设备被控后,可作为 ServiceNow 用户的横向跳板。

如果你的企业同时运行上述系统中的多个,需要把它们放在同一个 incident response 上下文中评估,而不是孤立处理。


七、总结:沙箱逃逸类漏洞的防御范式

CVE-2026-6875 是一起典型的**“沙箱被绕过而非被直接击穿”**的漏洞。它提醒我们:

  1. 沙箱不是银弹:如果沙箱与沙箱外的代码共享全局对象或加载机制,沙箱的边界就可能被污染。
  2. 预认证入口是重灾区:任何接受用户输入的预认证端点,都应被视为潜在的代码执行入口。
  3. 在野利用速度远超补丁节奏:7 月 13 日发布补丁,7 月 19 日确认在野利用,间隔仅 6 天。自托管环境的补丁延迟是高危中的高危。
  4. 网络层缓解只能买时间:真正修复依赖补丁,但 WAF 规则可以显著降低被扫描命中的概率。

对安全团队来说,这个漏洞的优先级应该高于大多数常规 CVE:它不仅影响核心 ITSM 平台,还可能通过 MID Server 打开内网大门。


参考资料

上次更新于: