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
| 属性 | 详情 |
|---|---|
| CVE | CVE-2026-6875 |
| 平台 | ServiceNow AI Platform |
| 类型 | 沙箱逃逸 → 预认证 RCE |
| CVSS | 9.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 注入到实例接管
整个攻击链分为四个阶段:
阶段 1:预认证入口注入 JavaScript 过滤器
↓
阶段 2:在受限沙箱中执行原型链污染
↓
阶段 3:触发 gs.include() 加载 Script Include,逃逸到高权限上下文
↓
阶段 4:调用内部 API,创建管理员、访问表数据、控制 MID Server2.1 阶段 1:GlideRecord 查询注入
ServiceNow 的 GlideRecord 是几乎所有应用都使用的数据库查询 API。某些预认证页面(如 assessment_thanks.do)会把用户传入的 sysparm_* 参数直接拼进 GlideRecord 查询。
当查询值带有特殊前缀时,ServiceNow 会把它当作 JavaScript 表达式执行:
javascript:<expression>例如,一个恶意的 filter 参数可能是:
javascript:globalFunction()ServiceNow 的沙箱会限制这个表达式的能力:不能 eval、不能访问敏感类、不能动态创建函数。但 Assetnote 发现,沙箱里的代码可以修改全局对象,影响后续被 gs.include() 加载的脚本。
2.2 阶段 2:原型链污染
受限沙箱内的代码虽然不能直接执行危险操作,但拥有足够的 JavaScript 对象访问权。攻击者通过修改 Object.prototype、Function.prototype 或类似全局对象,把恶意字符串“植入”到 Script Include 的运行时环境。
一个简化的概念模型是:
// 沙箱内执行,受限但可污染全局对象
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。
这意味着:
- 漏洞存在不止一种可行的利用路径。
- 基于公开 PoC 的网络层防御(如 WAF 规则)可能被绕过。
- 攻击者具备真实的逆向分析能力,而不是简单的脚本小子行为。
ServiceNow 官方在 KB3137947 中声明“尚未发现针对 ServiceNow 实例的主动利用”,但这一立场与 Defused 的观察数据相矛盾。对安全团队来说,这种“厂商未确认但情报已确认”的窗口期是最危险的时刻——你可能因为依赖官方通报而延迟响应。
四、检测脚本:从日志中快速发现攻击痕迹
由于 payload 包含 javascript: 前缀和 sysparm_* 参数,检测的核心是监控预认证端点的请求特征。下面给出一个基于 Python 的日志扫描脚本,用于从 Web 访问日志中快速发现可疑流量。
#!/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()运行示例:
python detect_servicenow_cve_2026_6875.py /var/log/servicenow/access.log4.1 检测重点指标
| 检测位置 | 关注指标 |
|---|---|
| Web 访问日志 | 预认证 .do 端点出现 javascript: 的 sysparm_* 参数 |
| 实例审计日志 | sys_user 表出现新增或权限变更的管理员账户 |
| Script Include 日志 | 非常用 Script Include 被异常加载或修改 |
| MID Server 日志 | 出现非工作时间的 PowerShell / shell 命令执行 |
| 网络流量 | 外联 C2、大体积数据外传 |
五、加固与应急响应清单
5.1 立即行动(0-24 小时)
- 确认版本与补丁状态
- 对照下表确认实例版本是否在受影响范围:
- 若未修复,立即升级或临时下线公网暴露面。
| 版本家族 | 修复版本 |
|---|---|
| Brazil | EA / GA |
| Australia | Patch 2 |
| Zurich | Patch 7b / Patch 9 |
| Yokohama | Patch 12 Hot Fix 1b / Patch 13 |
临时网络层缓解
- 在 WAF/反向代理上阻止包含
javascript:scheme 的sysparm_*参数。 - 限制
/assessment_thanks.do等预认证端点的公网访问,如果业务允许,仅对 VPN 或白名单开放。
- 在 WAF/反向代理上阻止包含
启动威胁狩猎
- 运行上面的检测脚本扫描至少 30 天访问日志。
- 审计
sys_user表中近 30 天内的新增/权限变更记录。 - 检查 MID Server 的命令执行日志,寻找异常进程。
5.2 短期加固(1-7 天)
应用 ServiceNow Guarded Script 保护
- 这是 ServiceNow 推出的沙箱增强机制,要求复杂的服务器端脚本必须放入 Script Include,并减少沙箱内表达式的复杂度。
- 升级后检查“Incompatible Guarded Scripts”列表,修复不兼容脚本。
MID Server 网络分段
- 将 MID Server 的出站权限限制到最小必需范围。
- 禁止 MID Server 直接访问互联网,除非业务必需。
- 对 MID Server 主机启用 EDR 和命令行审计。
启用多因素认证与权限最小化
- 即使漏洞是预认证的,也要确保现有管理员账户启用 MFA,防止被窃取后进一步利用。
5.3 长期治理
建立 ServiceNow 资产台账
- 很多企业存在“影子 ServiceNow”实例,由业务部门自行部署。全面盘点自托管和合作伙伴托管实例。
加入 CISA KEV 跟踪流程
- 将 ServiceNow 等关键 SaaS/自托管应用纳入 KEV 订阅,确保漏洞披露后 24 小时内启动评估。
模拟攻击演练
- 在隔离测试环境中复现 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 是一起典型的**“沙箱被绕过而非被直接击穿”**的漏洞。它提醒我们:
- 沙箱不是银弹:如果沙箱与沙箱外的代码共享全局对象或加载机制,沙箱的边界就可能被污染。
- 预认证入口是重灾区:任何接受用户输入的预认证端点,都应被视为潜在的代码执行入口。
- 在野利用速度远超补丁节奏:7 月 13 日发布补丁,7 月 19 日确认在野利用,间隔仅 6 天。自托管环境的补丁延迟是高危中的高危。
- 网络层缓解只能买时间:真正修复依赖补丁,但 WAF 规则可以显著降低被扫描命中的概率。
对安全团队来说,这个漏洞的优先级应该高于大多数常规 CVE:它不仅影响核心 ITSM 平台,还可能通过 MID Server 打开内网大门。
参考资料
- Assetnote / Searchlight Cyber: Smashing the ServiceNow Sandbox — 2026-07-20
- Jonathan Care, ServiceNow Pre-Auth RCE Exploited in the Wild — 2026-07-21
- ServiceNow KB3137947 — 官方补丁公告
- Indusface: CVE-2026-6875 ServiceNow Sandbox Escape to Pre-Auth RCE — 受影响版本与缓解措施
- CISA Known Exploited Vulnerabilities Catalog — 跟踪 KEV 状态

