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>标签绕过转义保护
漏洞原理:
- 模板通过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的行为)可能带来长期风险
这些漏洞强调了在数字化转型过程中,必须将安全性作为核心设计原则,而非事后考虑的因素。