Node.js tar包爆高危漏洞:符号链接检查绕过可致任意文件写入
npm包node-tar被发现高危漏洞CVE-2021-37701,攻击者利用路径分隔符混淆和大小写差异绕过目录符号链接保护,造成任意文件创建/覆盖,甚至代码执行。影响版本v3及以下且未打补丁的v4/5/6。本文详细分析攻击原理、攻击链和修复建议。
🔓 High 漏洞利用
npm包node-tar存在高危漏洞CVE-2021-37701,攻击者利用路径分隔符混淆(反斜杠vs正斜杠)及大小写不敏感文件系统的缓存逻辑缺陷,绕过目录符号链接保护,实现任意文件创建/覆盖,甚至代码执行。
来源:OSV | 2021-08-31 | 原文链接
🔍 关键发现
- 在POSIX系统上,node-tar使用反斜杠(\ )作为路径分隔符进行目录缓存检查,但\ 实际上是合法文件名,导致可创建目录后用同名符号链接替换,绕过保护。
- 在大小写不敏感文件系统中,先创建大写目录(如FOO),再创建小写符号链接(foo),缓存不会命中,后续提取文件会被写入符号链接目标,实现任意文件写入。
- 漏洞影响node-tar v3及以下版本,v4.4.16、v5.0.8、v6.1.7已修复,修复方案包括统一路径分隔符为/、大小写不敏感地裁剪目录缓存。
⚔️ 攻击链分析
['1. 制作恶意tar文件,包含一个普通目录(例如dir)和一个同名符号链接(dir)但使用反斜杠路径分隔符,或者利用大小写差异(FOO和foo)。', '2. 解压时,先正常创建目录,缓存记录该路径。随后使用符号链接替换该目录,但缓存未更新(因路径分隔符不同或大小写差异)。', '3. 后续在“该目录下”的文件条目被写入符号链接指向的任意系统路径,造成任意文件创建/覆盖。', '4. 若覆盖可执行文件或配置文件,可能导致任意代码执行(如覆盖.bashrc或系统二进制文件)。']
🚩 失陷指标 (IOC)
tar包中含目录条目与符号链接条目同名且路径分隔符包含\ (POSIX系统下)tar包中大小写不同但名称相同的目录和符号链接条目(如目录FOO和符号链接foo)
🛡️ 缓解建议
- ✅ 立即将node-tar升级至4.4.16、5.0.8或6.1.7及以上版本。
- ✅ 若无法升级,在解压时添加自定义filter函数,过滤掉所有SymbolicLink类型的条目(参见原文workaround)。
- ✅ 对用户提供的tar文件进行预处理:将所有路径规范化使用正斜杠,并检查是否存在大小写冲突的目录/符号链接对。
涉及漏洞:["CVE-2021-37701"]
⚠️ 本文仅供安全研究与学习,IOC 信息请勿用于非法目的。
🤖 常见问题解答(FAQ)
❓ 漏洞利用需要哪些前置条件?
攻击者需要诱导目标解压特制tar文件;目标系统需使用node-tar且为受影响版本(v3及以下,或v4/5/6的未修复版本);平台不限但POSIX系统中反斜杠为合法字符场景更易触发。
❓ 修复版本中路径规范化如何处理Windows系统?
在Windows系统上将反斜杠替换为正斜杠;在POSIX系统上保留反斜杠在路径中不变(但消费时仍只认正斜杠作为分隔符),彻底消除混淆。
❓ 漏洞是否影响现有已解压的文件系统?
不影响已解压的文件系统;漏洞仅发生在解压过程中,通过恶意构造的tar包导致后续文件写入错误位置。系统需在解压时触发,不会对历史数据造成影响。