ServiceNow安全漏洞之探讨:CVE-2024系列深度分析
字数 1513 2025-08-20 18:17:41

ServiceNow安全漏洞深度分析教学文档

1. ServiceNow平台概述

ServiceNow是一个基于Java的大型单体应用,其核心特点包括:

  • 单个.jar文件超过20GB
  • 高度可定制化设计,多数配置通过数据库完成
  • 采用非传统的请求路由机制(通过数据库表而非硬编码)

核心组件

1.1 表(Table)系统

  • 几乎所有数据存储在表中(如sys_users、sys_pages、sys_properties)
  • 表与底层数据库1:1映射
  • 通过特定URL路径访问(如/sys_users_list.do查看用户列表)
  • 复杂的ACL系统控制访问权限

1.2 处理器(Processor)

  • 类似API端点的组件
  • 基于Rhino JavaScript引擎
  • 提供Java辅助类支持平台配置
  • 示例处理器代码展示了请求参数处理和重定向逻辑

1.3 UI页面系统

  • 基于Apache Jelly库构建
  • 使用XML模板渲染内容
  • 特点:
    • 可执行JavaScript(通过g:evaluate标签)
    • 使用JEXL模板表达式语言(\({...}或\)[...]格式)
    • 自动传递URL参数作为模板变量
    • 默认对字符串进行XSS防护转义

2. ServiceNow渲染机制与安全隐患

2.1 两阶段渲染过程

第一阶段:

  • 处理g:和j:标签
  • 忽略g2:和j2:标签
  • 使用${}作为表达式分隔符
  • 用户提供的值直接插入模板

第二阶段:

  • 处理g2:和j2:标签
  • 使用$[]作为表达式分隔符
  • 对用户输入中的\([、\){、<j2:和<g2:进行转义

2.2 潜在风险点

  • 双重评估结构可能导致模板注入
  • 第一阶段的内容注入可能影响第二阶段
  • 开发者已实施多种缓解措施但可能存在绕过

3. 漏洞分析:CVE-2024系列

3.1 CVE-2024-4879:标题注入漏洞

漏洞位置:

  • ui.jtemplates/html_page_title.xml模板
  • 使用<g:no_escape>标签绕过转义保护

漏洞原理:

  1. 模板通过jelly.jvar_page_title或${jvar_page_title}获取标题
  2. 可通过URL参数?jvar_page_title=直接注入内容
  3. 由于使用no_escape标签,注入内容不会被转义

验证方法:
访问/login.do?jvar_page_title=aaa可成功注入标题

潜在影响:

  • 可能导致XSS攻击
  • 可能被用于其他注入攻击

3.2 CVE-2024-5178:模板注入漏洞

漏洞原理:

  • 利用两阶段渲染机制的特性
  • 通过特定注入点绕过第一阶段防护
  • 在第二阶段执行恶意代码

技术细节:

  • 需要找到允许在第一阶段注入XML标签的位置
  • 注入内容会影响第二阶段的渲染结果

3.3 CVE-2024-5217:数据库控制漏洞

漏洞影响:

  • 攻击者可能完全控制数据库
  • 绕过ACL系统访问敏感数据

4. 安全防护建议

4.1 针对ServiceNow的防护措施

  1. 及时应用官方安全补丁
  2. 严格审查自定义脚本和模板
  3. 加强ACL系统配置
  4. 监控异常访问模式

4.2 开发安全实践

  1. 避免直接使用no_escape标签
  2. 对所有用户输入进行严格验证
  3. 实施多层防御机制
  4. 定期进行安全审计

5. 总结与启示

ServiceNow的安全漏洞揭示了以下关键点:

  1. 复杂系统的多层渲染机制可能引入安全隐患
  2. 过度依赖配置可能导致安全边界模糊
  3. 沙盒机制并非绝对安全
  4. 历史设计决策(如类似register_globals的行为)可能带来长期风险

这些漏洞强调了在数字化转型过程中,必须将安全性作为核心设计原则,而非事后考虑的因素。

ServiceNow安全漏洞深度分析教学文档 1. ServiceNow平台概述 ServiceNow是一个基于Java的大型单体应用,其核心特点包括: 单个.jar文件超过20GB 高度可定制化设计,多数配置通过数据库完成 采用非传统的请求路由机制(通过数据库表而非硬编码) 核心组件 1.1 表(Table)系统 几乎所有数据存储在表中(如sys_ users、sys_ pages、sys_ properties) 表与底层数据库1:1映射 通过特定URL路径访问(如/sys_ users_ list.do查看用户列表) 复杂的ACL系统控制访问权限 1.2 处理器(Processor) 类似API端点的组件 基于Rhino JavaScript引擎 提供Java辅助类支持平台配置 示例处理器代码展示了请求参数处理和重定向逻辑 1.3 UI页面系统 基于Apache Jelly库构建 使用XML模板渲染内容 特点: 可执行JavaScript(通过g:evaluate标签) 使用JEXL模板表达式语言(${...}或$[ ... ]格式) 自动传递URL参数作为模板变量 默认对字符串进行XSS防护转义 2. ServiceNow渲染机制与安全隐患 2.1 两阶段渲染过程 第一阶段: 处理g:和j:标签 忽略g2:和j2:标签 使用${}作为表达式分隔符 用户提供的值直接插入模板 第二阶段: 处理g2:和j2:标签 使用$[ ]作为表达式分隔符 对用户输入中的$ [ 、${、<j2:和 <g2:进行转义 2.2 潜在风险点 双重评估结构可能导致模板注入 第一阶段的内容注入可能影响第二阶段 开发者已实施多种缓解措施但可能存在绕过 3. 漏洞分析:CVE-2024系列 3.1 CVE-2024-4879:标题注入漏洞 漏洞位置: ui.jtemplates/html_ page_ title.xml模板 使用<g:no_ escape>标签绕过转义保护 漏洞原理: 模板通过jelly.jvar_ page_ title或${jvar_ page_ title}获取标题 可通过URL参数?jvar_ page_ title=直接注入内容 由于使用no_ escape标签,注入内容不会被转义 验证方法: 访问/login.do?jvar_ page_ title=aaa可成功注入标题 潜在影响: 可能导致XSS攻击 可能被用于其他注入攻击 3.2 CVE-2024-5178:模板注入漏洞 漏洞原理: 利用两阶段渲染机制的特性 通过特定注入点绕过第一阶段防护 在第二阶段执行恶意代码 技术细节: 需要找到允许在第一阶段注入XML标签的位置 注入内容会影响第二阶段的渲染结果 3.3 CVE-2024-5217:数据库控制漏洞 漏洞影响: 攻击者可能完全控制数据库 绕过ACL系统访问敏感数据 4. 安全防护建议 4.1 针对ServiceNow的防护措施 及时应用官方安全补丁 严格审查自定义脚本和模板 加强ACL系统配置 监控异常访问模式 4.2 开发安全实践 避免直接使用no_ escape标签 对所有用户输入进行严格验证 实施多层防御机制 定期进行安全审计 5. 总结与启示 ServiceNow的安全漏洞揭示了以下关键点: 复杂系统的多层渲染机制可能引入安全隐患 过度依赖配置可能导致安全边界模糊 沙盒机制并非绝对安全 历史设计决策(如类似register_ globals的行为)可能带来长期风险 这些漏洞强调了在数字化转型过程中,必须将安全性作为核心设计原则,而非事后考虑的因素。