CVE-2026-33948jq是一个广泛使用的命令行JSON处理器。在特定提交之前的版本中存在一个安全漏洞,允许攻击者通过嵌入NUL字节绕过输入验证。当jq从文件或标准输入读取JSON数据时,其内部逻辑错误地使用strlen()函数来确定缓冲区长度,而非依据fgets()读取的实际字节计数。这导致jq在遇到第一个NUL字节时会截断输入,仅解析该字节之前的合法前缀。攻击者可利用此漏洞构造包含良性JSON前缀和恶意后缀的数据包。jq仅验证前缀的有效性,而下游消费者可能会处理包含恶意字节在内的完整输入,从而引发解析器差异攻击。
该漏洞的核心在于C语言字符串处理函数的特性与输入流处理逻辑的不匹配。jq在解析输入时,使用了strlen()来计算字符串长度。由于strlen()在遇到NUL字节(\0)时会停止计数,因此如果输入数据中包含NUL字节,jq将忽略其后的所有内容。攻击者利用这一缺陷,构造形如“合法JSON + \0 + 恶意数据”的Payload。例如:'{"user": "guest"}\0{"user": "admin"}'。jq解析器只会读取并验证前一部分,认为输入合法。然而,如果下游系统(如后端API、日志分析器或数据库)直接读取原始数据流而不使用相同的截断逻辑,它可能会解析到NUL字节后的恶意数据。这种解析器行为的不一致性使得攻击者能够绕过基于jq的过滤机制,将未经验证或恶意构造的数据注入到后续处理环节中。