CVE-2026-24131pnpm是一款流行的JavaScript包管理工具。在10.28.2之前的版本中,pnpm处理包的directories.bin字段时,使用path.join()对路径进行拼接,但未验证拼接后的路径是否仍保持在包根目录内。攻击者可构造恶意npm包,通过设置"directories": {"bin": "../../../../tmp"}来逃逸包目录,导致pnpm对任意位置的文件执行chmod 755操作,从而改变目标文件的权限。该漏洞仅影响Unix/Linux/macOS系统,Windows系统不受影响(fixBin受EXECUTABLE_SHEBANG_SUPPORTED限制)。攻击者可利用此漏洞提升目标文件的执行权限,可能导致本地权限提升或代码执行。
漏洞根源在于pnpm的fixBin函数在处理包的bin目录时,直接使用path.join()将package.json中声明的directories.bin路径与包目录拼接。攻击者可在恶意包的package.json中设置"directories": {"bin": "../../../../tmp"},使得拼接后的绝对路径指向包目录外部(如/tmp/evil.sh)。当pnpm安装该恶意包时,会对目标路径执行fs.chmod(0o755)操作,将目标文件权限设置为可执行。由于chmod操作发生在符号链接解析之后,攻击者可利用符号链接指向任意系统文件。此漏洞的利用需要攻击者诱使受害者安装恶意包,可通过发布到npm仓库或直接分发恶意tarball实现。修复方案为在path.join()后增加路径验证,确保结果路径仍处于包根目录内。