安全研究员Salah Chafai(漏洞开发与安全专家)披露了广泛使用的cJSON库中存在一个严重漏洞。cJSON是一款轻量级C语言JSON解析器,该漏洞编号为CVE-2025-57052(CVSS评分9.8)。攻击者可通过构造畸形JSON指针绕过数组边界检查,导致内存越界访问、段错误、权限提升或拒绝服务。
漏洞根源在于cJSON_Utils.c文件中的decode_array_index_from_pointer函数。
报告指出:“循环错误地检查pointer[0]而非pointer[position],导致非数字字符被当作数组索引的一部分处理。”
这一逻辑缺陷使得“0A”等输入被解析为索引10,即便数组仅包含3个元素。此类越界访问可能导致应用崩溃,在特定场景下还可让攻击者读取或篡改超出预期范围的内存数据。
为演示漏洞利用,Chafai发布了一个使用cJSON解析用户JSON数组的最小化C程序。正常索引“0”和“1”会返回Alice和Bob的数据,而构造的索引“0A”会使cJSON尝试访问不存在的第10个元素。
报告强调:“提供索引0A将导致cJSON访问索引10,这一越界操作可能引发段错误(崩溃)。”
由于cJSON被嵌入无数项目,漏洞影响范围广泛:
- 处理JSON指针的Web API
- 依赖轻量级解析器的嵌入式/IoT设备
- 接收结构化JSON输入的桌面与服务器应用
报告警告:“任何使用cJSON解析JSON指针的软件……都可能遭受拒绝服务攻击。在畸形输入可传递至JSON指针API的环境中,风险尤为严重。”
攻击者可利用CVE-2025-57052实施以下攻击:
- 通过段错误崩溃服务
- 提供cJSON与atoi解析结果不同的索引,绕过应用层检查
- 通过读取超出分配内存区域,潜在提升权限或访问敏感数据
修复方案十分简单:修正循环条件。
漏洞代码:
for (position = 0; (pointer[position] >= '0') && (pointer[0] <= '9'); position++)
修复代码:
for (position = 0; (pointer[position] >= '0') && (pointer[position] <= '9'); position++)
此举可确保指针字符串中的每个字符在被解析为数组索引前均经过正确验证。
发表评论
您还未登录,请先登录。
登录