LibreDWG项目中dwg_read_file函数内存耗尽问题分析

LibreDWG项目中dwg_read_file函数内存耗尽问题分析

【免费下载链接】libredwg Official mirror of libredwg. With CI hooks and nightly releases. PR's ok 【免费下载链接】libredwg 项目地址: https://gitcode.com/gh_mirrors/li/libredwg

问题背景

LibreDWG是一个用于处理AutoCAD DWG文件格式的开源库。在2025年4月,项目中发现了一个可能导致内存耗尽(Out Of Memory, OOM)的安全问题,该问题存在于处理AC1009类型DWG文件的解码过程中。

技术细节

该问题的核心出现在src/decode.c文件的decode_preR13_entities函数中。当处理特定格式的DWG文件时,程序会进入一个循环:

while (dat->byte < oldpos + size)

其中size变量的值是从文件的一个字节读取并通过左移操作转换为int16类型。当这个值异常大时,会导致循环次数过多,进而触发内存的频繁重新分配:

while (num >= dwg->num_alloced_objects)
    dwg->num_alloced_objects *= 2;
dwg->object = (Dwg_Object *)realloc (
    dwg->object, dwg->num_alloced_objects * sizeof (Dwg_Object));

这种指数级增长的内存分配策略在遇到异常构造的输入文件时,会迅速消耗系统所有可用内存,导致服务不可用。

问题成因

深入分析发现,问题的根本原因在于对preR13格式文件头中的entities_end字段缺乏有效验证。当该字段被设置为非预期值(如0x5b007274)时,会超出实际文件大小,但程序未能及时检测并终止处理。

解决方案

修复方案主要包括以下几个方面:

  1. 在早期阶段增加对文件头字段的有效性检查
  2. 对循环条件中的size变量设置合理的上限
  3. 优化内存分配策略,防止指数级增长导致的内存耗尽

安全影响

虽然该问题被归类为低风险,因为它需要特殊构造的输入文件才能触发,但仍然可能导致服务不可用。建议所有使用LibreDWG库处理用户上传DWG文件的应用及时更新到修复版本。

最佳实践

对于类似文件处理库的开发,建议:

  1. 对所有从文件读取的数值进行范围检查
  2. 对内存分配设置合理的上限
  3. 实现渐进式的内存增长策略
  4. 添加对异常输入的早期检测和拒绝机制

该问题的发现和修复过程展示了持续安全测试(如模糊测试)在开源项目中的重要性,能够帮助开发者及时发现并修复潜在的安全隐患。

【免费下载链接】libredwg Official mirror of libredwg. With CI hooks and nightly releases. PR's ok 【免费下载链接】libredwg 项目地址: https://gitcode.com/gh_mirrors/li/libredwg

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值