CVE-2025-27363: FreeType 字体解析越界写入漏洞分析

CVE-2025-27363: FreeType 字体解析越界写入漏洞深度分析

0x01 漏洞背景与详情

CVE-2025-27363 是广泛使用的字体渲染引擎 FreeType 中的一个高危漏洞。该漏洞被发现在野利用(已加入 CISA KEV 目录),允许攻击者通过恶意构造的字体文件触发越界写入(Out-of-bounds Write),最终可能导致任意代码执行。由于 FreeType 被大量操作系统(如 Linux 发行版、Android)、浏览器和文档阅读器作为底层依赖,其影响面极为广泛。

  • CVE ID: CVE-2025-27363
  • 危险等级: 高危 (High, CVSS 8.1)
  • 受影响版本: FreeType ≤ 2.13.0
  • 漏洞类型: 越界写入 (Out-of-bounds Write, CWE-787) / 整数溢出 (Integer Wrap-around)
  • 核心风险: 攻击者可通过提供恶意的 TrueType GX 或可变字体(Variable Font)文件,在解析该字体的目标应用程序上下文中执行任意代码。

0x02 漏洞原理分析

该漏洞的核心位于 FreeType 处理 TrueType GX 和可变字体子字形(subglyph)结构的解析代码中(例如 src/truetype/ttgload.c 中的 load_truetype_glyph 函数)。

  1. 整数溢出/环绕 (Wrap-around): 在解析过程中,存在缺陷的代码将一个有符号的短整型(signed short)赋值给无符号的长整型(unsigned long),随后加上一个静态固定值。
  2. 堆分配过小: 这种不当的类型转换和算术运算导致了整数溢出(Wrap-around),最终计算出的内存大小远小于实际需要的缓冲区大小,从而分配了一个过小的堆缓冲区。
  3. 越界写入 (OOB Write): 在后续的数据拷贝阶段,程序会向这个过小的缓冲区相对位置越界写入最多 6 个有符号长整型(signed long)数据。这破坏了相邻的堆内存结构,为内存损坏和代码执行创造了条件。

0x03 漏洞 POC (Proof of Concept)

安全研究员已经公开了触发该漏洞的 POC。主要思路是修改一个合法的可变字体文件(如 Roboto Flex),使其包含触发计算溢出的畸形数据。

触发思路:

  1. 修改字体文件,例如将 % 字符(glyph 8)修改为一个复合字形(composite glyph)。
  2. 将该复合字形的 subglyphs 数量设定为 0xfffd(极大的负数值或触发溢出的边界值)。
  3. 使用受影响的 FreeType 版本加载该 rf2.ttf 文件。

ASAN 崩溃日志示例: 当使用启用了 AddressSanitizer (ASAN) 的 ftmulti(FreeType 演示工具)加载该字体时,会立即产生崩溃:

=================================================================
==15657==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000980 at pc 0x000100ec9cf0 ...
WRITE of size 16 at 0x602000000980 thread T0
...

这清楚地表明了在堆上发生了越界写操作。

0x04 高级实战利用姿势 (Weaponization)

在红队实战和高级持续性威胁(APT)中,这类底层组件的内存损坏漏洞具有极高的利用价值:

  1. 0-Click / 1-Click 客户端攻击:

    • 钓鱼邮件/文档利用:攻击者将恶意 .ttf 字体嵌入到 PDF、Word 文档或恶意网页中。当受害者使用存在漏洞的阅读器或浏览器(依赖于有漏洞的 FreeType)打开文档时,字体会被自动加载渲染,触发越界写入并执行 Shellcode。
    • 系统级字体预览劫持:在某些 Linux 桌面环境或文件管理器中,浏览包含恶意字体的文件夹会触发系统的字体缩略图生成器(如 gnome-font-viewer),从而实现 0-Click 攻击。
  2. 堆风水 (Heap Feng Shui) 与执行流劫持: 为了将“越界写入 6 个 signed long”转化为稳定的 RCE,攻击者需要对目标应用的堆进行精确布局(Heap Spraying/Feng Shui)。

    • 通过在内存中放置包含函数指针或 C++ 虚函数表(vtable)的受害者对象紧挨着分配过小的字体缓冲区。
    • 触发 OOB Write 覆盖相邻对象的指针,结合 ROP (Return-Oriented Programming) 链绕过 DEP 和 ASLR 保护,最终执行系统命令。

0x05 应急排查与日志痕迹分析

  1. 系统与应用崩溃日志: 由于内存溢出漏洞在利用失败时极易导致进程崩溃,应重点排查系统日志中与字体渲染相关的段错误(Segmentation Fault / SIGSEGV)。

    • 检查 /var/log/messages, /var/log/syslog 或使用 dmesg | grep segfault
    • 寻找崩溃在 libfreetype.so 模块中的应用(如 Firefox, Chrome, Evince, LibreOffice 等)。
  2. 恶意字体文件排查:

    • 排查系统中近期下载或缓存的 .ttf, .otf, .woff 字体文件。
    • 特别关注邮件附件的解压目录或浏览器的缓存目录,提取可疑字体文件在沙箱中进行分析。

0x06 修复与加固建议

  1. 组件升级 (核心): 立即通过系统的包管理器(如 apt, yum, dnf)升级 freetypelibfreetype6 软件包至包含补丁的安全版本(大于 2.13.0,根据各发行版的安全公告而定)。
  2. 输入校验与沙箱:
    • 限制应用程序加载不受信任的外部字体。
    • 对于处理外部文档的 Web 服务或转换服务,应在严格隔离的沙箱(如 Docker 容器、seccomp 环境)中执行字体渲染操作,以限制代码执行后的爆炸半径。

0x07 参考资料