node-tar 解析 PAX 头含空字节漏洞:一行 NUL 字符致进程崩溃

CVE-2026-59875 (Medium) 影响 node-tar 包:PAX 扩展头中路径字段未过滤 NUL 字节,导致提取时未捕获异常造成进程终止。同时存在解析器差异可绕过安全校验。本文提供根因分析、PoC、缓解措施。

🔓 Medium 漏洞利用

攻击者可通过构造包含 NUL 字节的 PAX 扩展头路径字段的 tar 包,触发 node-tar 在提取时未处理的异常,导致 Node.js 进程退出,实现远程拒绝服务。该漏洞同时因不同 tar 工具对 NUL 处理差异(CWE-436)可绕过预检查。

来源:OSV | 2026-07-20 | 原文链接

🔍 关键发现

  • node-tar 在解析 PAX(x 类型)头时未过滤路径/链接路径中的 NUL 字节,而 GNU L/K 扩展头已有正确过滤。
  • 含 NUL 的路径传入 fs.lstat/fs.open 会触发 ERR_INVALID_ARG_VALUE 异常,且该异常在异步回调中抛出,逃脱用户 try/catch。
  • GNU tar、bsdtar 等会在 NUL 处截断路径,而 node-tar 保留完整字符串,造成解析器差异,可用于绕过安全校验。

⚔️ 攻击链分析

1. 攻击者构造包含 PAX 头且 path=visible.txt\x00hidden.txt 的恶意 tar 包;2. 受害服务调用 tar.x() 提取该包;3. 内部 fs 操作因路径含 NUL 抛出异步未捕获异常;4. 进程崩溃,服务不可用。

🚩 失陷指标 (IOC)

  • poc-null-byte-crash.tar (SHA256 未知,需本地生成)
  • poc-null-linkpath-crash.tar (类似,链接路径含 NUL)

🛡️ 缓解建议

  • ✅ 立即升级 tar 包至 >= 7.5.17(若已发布),或应用官方补丁:在 pax.ts parseKVLine 中过滤 NUL 字节。
  • ✅ 在提取前使用外部工具(如 bsdtar)预校验 tar 包,并确保符合预期路径模式;或自行对 entry.path 做 strip null 处理。

涉及漏洞:["CVE-2026-59875"]


⚠️ 本文仅供安全研究与学习,IOC 信息请勿用于非法目的。

🤖 常见问题解答(FAQ)

❓ 该漏洞是否影响 npm registry 服务?

是的,npm registry 若使用 node-tar 解析上传的包且版本未修复,攻击者可上传恶意 tar 导致服务崩溃。

❓ 如何确认我是否使用了受影响版本?

检查 package-lock.json 中 tar 版本是否 ≤7.5.16。也可运行 npm ls tar 查看。影响所有使用 tar.x/tar.extract/tar.t 的方法。

❓ 临时缓解方案有哪些?

在调用 tar.x 前对 entry.path 进行 .replace(/\x00/g, '');或使用 child_process 调用系统 tar 命令代替 node-tar。

[!] CONTACT_CHANNELS

如需商务合作、技术咨询或漏洞反馈,请通过以下离岸节点联系作者。

> PING_AUTHOR (@A1RedTeam)