漏洞概述 漏洞名称: Global-Buffer-Overflow in RTKLIB getcodepri via Unrecognized RINEX Observation Code #797 漏洞类型: 全局缓冲区溢出(Global-Buffer-Overflow) 严重程度: 中等(Medium) 描述: 在RTKLIB的 函数中,当处理一个未识别的RINEX观测代码时,会导致全局缓冲区溢出。 具体表现为: 函数在映射未识别的观测代码时,返回空字符串 并设置 。随后,函数执行 ,其中 为负数索引,导致读取空字符串常量后的一个字节。 影响范围 受影响组件: 函数 触发条件: 当RTKLIB处理一个包含未识别观测代码的RINEX文件时 潜在影响: - 可能导致崩溃(Crash) - 可能读取相邻的全局内存,导致信息泄露或进一步的安全问题 修复方案 1. 在 函数中,在索引 之前,先检查 是否大于0且 不为 。如果 或 ,立即返回 。 2. 在解析RINEX文件时,验证观测代码。当 函数遇到未识别的观测代码时,丢弃该代码(或记录),而不是将其传递给下游处理。 3. 审计其他调用 函数的地方,确保它们也检查 是否非零。 POC代码 环境信息 工具链: Apple clang 12.0.0 with 目标: RTKLIB - https://github.com/tomojitakasu/RTKLIB 固定提交: 75d0ffa9d735697c6af4d6f7f664edc6e897 (2.4.3 line, 2019-01-30) 星座定义: EMGLON, EMGAL, EMGAL, EMGAL, EMGAL, EMGAL 复现步骤 1. 克隆并固定版本: 2. 保存POC RINEX文件 和驱动文件 3. 构建并运行: 根本原因分析 函数在映射观测代码时,如果代码未识别, 返回空字符串 并设置 。 在 函数中, 的索引 为负数,导致读取空字符串常量后的一个字节。 该行为在 函数中被触发,当处理RINEX文件的观测类型列表时,如果包含未识别的观测代码,会导致全局缓冲区溢出。 详细行为 一个精心构造的RINEX观测文件,包含未识别的观测代码,会在RTKLIB构建系统信号索引时崩溃,并读取相邻的全局内存。 这会影响RINEX后处理/可视化( 、 )以及任何处理或下载RINEX的RTKLIB管道。 推荐措施 1. 在 函数中,先检查 是否大于0且 不为 。如果 或 ,立即返回 。 2. 在解析RINEX文件时,验证观测代码。当 函数遇到未识别的观测代码时,丢弃该代码(或记录),而不是将其传递给下游处理。 3. 审计其他调用 函数的地方,确保它们也检查 是否非零。 结论 该漏洞是一个中等严重性的全局缓冲区溢出问题,可能影响RTKLIB在处理未识别观测代码时的稳定性。建议尽快应用上述修复措施,以防止潜在的安全风险。