LibreDWG项目中dwg_read_file函数内存耗尽问题分析
问题背景
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)时,会超出实际文件大小,但程序未能及时检测并终止处理。
解决方案
修复方案主要包括以下几个方面:
- 在早期阶段增加对文件头字段的有效性检查
- 对循环条件中的size变量设置合理的上限
- 优化内存分配策略,防止指数级增长导致的内存耗尽
安全影响
虽然该问题被归类为低风险,因为它需要特殊构造的输入文件才能触发,但仍然可能导致服务不可用。建议所有使用LibreDWG库处理用户上传DWG文件的应用及时更新到修复版本。
最佳实践
对于类似文件处理库的开发,建议:
- 对所有从文件读取的数值进行范围检查
- 对内存分配设置合理的上限
- 实现渐进式的内存增长策略
- 添加对异常输入的早期检测和拒绝机制
该问题的发现和修复过程展示了持续安全测试(如模糊测试)在开源项目中的重要性,能够帮助开发者及时发现并修复潜在的安全隐患。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



