【Bug已解决】[Security] Path traversal + malicious-model DoS via sharded-checkpoint `weight_map` 解决方案
【Bug已解决】[Security] Path traversal malicious-model DoS via sharded-checkpointweight_map解决方案一、现象长什么样加载一个分片 checkpointsafetensors / 多个 shard 文件 一个索引文件索引里有weight_map把张量名映射到分片文件名时如果索引文件被篡改或来自不可信来源可能出现两类危险路径穿越Path Traversalweight_map里某条写成{lm_head.weight: ../../../etc/secrets}或绝对路径/etc/passwd加载器照着去读/写checkpoint 目录之外的文件可能泄露宿主机文件或覆盖关键文件。恶意模型 DoSweight_map引用一个不存在的巨文件或循环引用加载器卡死在等待/扫描或一次性尝试分配超大内存 → 进程挂起 / OOM。报错可能是FileNotFoundError: ../outside/model.safetensors (企图读目录外) # 或更糟静默读了宿主机文件毫无报错或更隐蔽的「加载卡死十几分钟」DoS。本质checkpoint 索引里的weight_map文件名是被直接当作文件路径使用的但加载器没有校验这些文件名是否「安全地落在 checkpoint 目录内」。不可信 checkpoint 借此实现路径穿越或 DoS。二、背景分片 checkpoint 的结构model.safetensors.index.json索引文件含metadata和weight_map例如{ weight_map: { model.embed_tokens.weight: model-00001-of-00003.safetensors, lm_head.weight: model-00003-of-00003.safetensors } }一堆model-0000X-of-0000Y.safetensors分片文件。加载流程读索引 → 对每个张量按weight_map[name]拿到分片文件名 → 打开checkpoint_dir / 文件名读取。安全性问题就在这个「打开checkpoint_dir / 文件名」如果weight_map[name]是../evil.safetensorscheckpoint_dir / ../evil.safetensors解析后跳出目录 → 读/写目录外。如果是绝对路径/etc/passwd更是直接越界。如果引用一个 100GB 但实际不存在 / 符号链接到/dev/random的文件加载器会卡死或崩。这类问题在「加载用户上传的 / 从 HF hub 拉的不可信 checkpoint」场景尤其危险。防御性做法永远不要把weight_map的文件名当裸路径拼必须先归一化、校验落在目录内、拒绝..和绝对路径。三、根因根因是加载器信任weight_map里的文件名、直接拼接路径未做目录边界校验与异常处理三层第一层主因文件名直接拼路径无边界校验。open(checkpoint_dir / weight_map[name])没有先os.path.normpath 校验「结果仍在checkpoint_dir内」。于是../ 绝对路径直接越界。第二层无大小/存在性预检导致 DoS。加载器遇到weight_map引用的文件直接open或mmap不先检查文件是否存在、大小是否合理。恶意 checkpoint 可让加载器去读一个不存在的巨大路径卡死等待或触发超大 mmapOOM。第三层错误信息泄露 / 静默越界。路径穿越时若只是FileNotFoundError攻击者能据此探测宿主机目录结构哪些文件存在若静默成功读取目录外文件则更危险。理想是「统一拒绝 不暴露内部路径」。一句话weight_map文件名被当可信路径直接使用缺目录边界校验与大小/存在预检导致路径穿越与 DoS。四、最小可运行复现下面用纯 Python 模拟「weight_map含..路径加载器未校验即越界」的控制流不需要真实文件import os def resolve_buggy(checkpoint_dir: str, entry: str) - str: # 错误直接拼接不校验 return os.path.join(checkpoint_dir, entry) def load_buggy(checkpoint_dir: str, weight_map: dict): for name, fname in weight_map.items(): path resolve_buggy(checkpoint_dir, fname) print(f将打开: {path}) def main(): ckpt /models/safe_ckpt weight_map { embed.weight: model-00001.safetensors, lm_head.weight: ../../etc/passwd, # 恶意穿越 head.weight: /absolute/etc/shadow, # 绝对路径 } load_buggy(ckpt, weight_map) # 输出里会出现 /etc/passwd、/absolute/etc/shadow —— 越界 if __name__ __main__: main()跑出来会打印出/etc/passwd和/absolute/etc/shadow这类目录外路径——演示了不加校验时weight_map如何被用来路径穿越。五、解决方案第一层最小直接修复最省事的救火加载前对所有weight_map文件名做安全解析拒绝..和绝对路径。用os.path.normpath 边界校验import os def safe_resolve(checkpoint_dir: str, entry: str) - str: # 1) 拒绝绝对路径 if os.path.isabs(entry): raise ValueError(fweight_map 含绝对路径拒绝: {entry}) # 2) 归一化并校验仍落在 checkpoint_dir 内 base os.path.abspath(checkpoint_dir) target os.path.normpath(os.path.join(base, entry)) if not (target base or target.startswith(base os.sep)): raise ValueError(f路径穿越被拒绝: {entry} - {target}) return target def load_safe(checkpoint_dir: str, weight_map: dict, max_bytes: int 50_000_000_000): for name, fname in weight_map.items(): path safe_resolve(checkpoint_dir, fname) # 3) 存在性 大小预检防 DoS if not os.path.exists(path): raise FileNotFoundError(f分片缺失: {path}) if os.path.getsize(path) max_bytes: raise ValueError(f分片过大疑似恶意: {path} {max_bytes} 字节) # 真正打开... print(安全打开:, path)临时用这个函数包裹所有weight_map解析路径穿越和超大文件 DoS 都被挡下。六、解决方案第二层结构性改进第一层是「手动校验」第二层是「把安全解析做成加载器的默认行为且对符号链接、大小、数量都做防御」从设计上消灭信任weight_mapimport os from dataclasses import dataclass from typing import Dict dataclass class SafeLoadPolicy: checkpoint_dir: str max_shard_bytes: int 50_000_000_000 # 单分片上限 50GB max_shards: int 10_000 # 分片数量上限防海量小文件 DoS def resolve(self, entry: str) - str: base os.path.abspath(self.checkpoint_dir) if os.path.isabs(entry): raise ValueError(f拒绝绝对路径: {entry}) target os.path.normpath(os.path.join(base, entry)) # 解析符号链接后再校验一次防止软链逃逸 real_target os.path.realpath(target) if not (real_target base or real_target.startswith(base os.sep)): raise ValueError(f路径穿越被拒绝: {entry}) return real_target def validate_shard(self, path: str) - None: if not os.path.isfile(path): raise FileNotFoundError(f分片不存在: {os.path.basename(path)}) if os.path.getsize(path) self.max_shard_bytes: raise ValueError(f分片超过上限 {self.max_shard_bytes} 字节疑似恶意) # 不暴露内部绝对路径错误信息只用文件名 return None def load(self, weight_map: Dict[str, str]) - None: if len(weight_map) self.max_shards: raise ValueError(f分片数量 {len(weight_map)} 超过上限 {self.max_shards}) seen set() for name, fname in weight_map.items(): path self.resolve(fname) self.validate_shard(path) if path in seen: raise ValueError(f分片重复引用疑似循环: {fname}) seen.add(path) # 真正加载... print(安全加载:, os.path.basename(path))关键防御点解析符号链接realpath后再次校验防软链逃逸。错误信息只用文件名、不暴露宿主机绝对路径防信息泄露。数量上限 单文件大小上限 重复引用检测三重防 DoS。七、解决方案第三层断言 / CI 守护把「拒绝穿越」「拒绝绝对路径」「大小/数量上限」「不泄露路径」固化成测试import pytest def test_reject_dotdot(): p SafeLoadPolicy(checkpoint_dir/models/ckpt) with pytest.raises(ValueError): p.resolve(../../etc/passwd) def test_reject_absolute(): p SafeLoadPolicy(checkpoint_dir/models/ckpt) with pytest.raises(ValueError): p.resolve(/etc/shadow) def test_accept_relative_safe(): p SafeLoadPolicy(checkpoint_dir/models/ckpt) out p.resolve(model-00001.safetensors) assert out.startswith(os.path.abspath(/models/ckpt)) def test_reject_oversized_shard(tmp_path): big tmp_path / big.safetensors big.write_bytes(bx * 100) p SafeLoadPolicy(checkpoint_dirstr(tmp_path), max_shard_bytes10) with pytest.raises(ValueError): p.validate_shard(str(big)) def test_reject_too_many_shards(): p SafeLoadPolicy(checkpoint_dir/x, max_shards2) with pytest.raises(ValueError): p.load({fw{i}: fs{i} for i in range(5)}) def test_no_internal_path_leak(): p SafeLoadPolicy(checkpoint_dir/models/ckpt) try: p.resolve(../../secret) except ValueError as e: # 错误信息不应暴露宿主机真实绝对路径细节 assert /models/ckpt not in str(e) or 拒绝 in str(e)再加一个端到端回归加载含恶意weight_map的不可信 checkpoint 时被拒def test_untrusted_checkpoint_blocked(tmp_path): index {weight_map: {w: ../../etc/passwd}} write_index(tmp_path / index.json, index) p SafeLoadPolicy(checkpoint_dirstr(tmp_path)) with pytest.raises(ValueError): p.load(index[weight_map])八、排查清单看加载不可信 checkpoint 时是否出现目录外路径、卡死或 OOM → 是路径穿越/DoS。检查加载器是否直接os.path.join(ckpt_dir, weight_map[name])而无校验。临时救火用safe_resolve包裹所有weight_map解析拒绝../绝对路径 大小预检。确认符号链接是否被利用realpath后再校验一次。长期修复安全解析做成加载器默认行为含软链校验、大小/数量上限、信息不泄露。升级 accelerate/transformers 到合了该安全解析的版本并跑上面的「拒绝穿越」用例。仅加载来自可信源的 checkpoint不可信模型先离线扫描weight_map再决定。九、小结分片 checkpoint 的weight_map路径穿越与 DoS不是加载器功能错了而是它信任索引里的文件名、直接拼接路径未做目录边界校验与大小/存在预检不可信 checkpoint 借此越界或卡死。最小修复是safe_resolve拒绝../绝对路径 大小预检结构性修复是把安全解析做成默认行为含符号链接二次校验、大小/数量上限、错误不泄露内部路径最后用 pytest 把「拒绝穿越」「拒绝绝对路径」「上限防御」锁死。抓住「任何来自外部的配置里的路径都必须归一化后校验仍在基目录内、绝不信任」这条安全铁律所有加载不可信文件的场景都应照此设防。

相关新闻

Minecraft红石系统核心原理与自动化应用全解析

Minecraft红石系统核心原理与自动化应用全解析

1. 红石系统:从入门到精通的基石如果你在Minecraft里还停留在用镐子挖矿、用剑砍怪的阶段,那你就错过了这个游戏一半以上的乐趣。红石,这个游戏内最接近“电”与“逻辑”的魔法系统,是区分普通玩家和进阶工程师的分水岭。它能让你…

2026/8/1 3:47:12 阅读更多 →
2024年LaTeX入门指南:从TeX Live安装到第一个文档编译

2024年LaTeX入门指南:从TeX Live安装到第一个文档编译

1. 项目概述:为什么在2024年,我依然推荐你从LaTeX开始如果你经常需要和公式、论文、书籍排版打交道,或者你受够了Word在调整格式时那种“牵一发而动全身”的无力感,那么LaTeX这个名字你应该不陌生。它不是一个软件,而是…

2026/8/1 3:47:12 阅读更多 →
浅谈“随机按键指定串”问题

浅谈“随机按键指定串”问题

Preface 主要作为培训时该类问题的总结。 Introduction 这类问题的主要形式是: 有 mmm 个不同的字符按键,进行 nnn 次(或无限次)随机敲打。 询问 nnn 个字符中出现长度为 kkk 的指定串 SSS 的概率。 或求无限次敲打中 SSS 出现…

2026/8/1 3:47:12 阅读更多 →

最新新闻

金融数字化转型中的质量挑战与工程实践

金融数字化转型中的质量挑战与工程实践

1. 金融数字化转型中的质量挑战2008年金融危机后,全球金融业开始了一场静悄悄的革命。我清楚地记得2015年参与某大型银行核心系统改造时,项目组每天要处理上百个数据质量问题。当时一位资深架构师对我说:"数字化不是把纸质流程搬到屏幕上…

2026/8/1 4:32:30 阅读更多 →
LangSmith Fleet技能管理:构建生产级AI Agent的工程化基石

LangSmith Fleet技能管理:构建生产级AI Agent的工程化基石

1. 从LangSmith Fleet到技能管理:一个被低估的Agent核心能力最近在折腾LangChain生态里的各种Agent时,我发现一个挺有意思的现象:大家讨论的焦点往往集中在“哪个模型更聪明”、“Prompt怎么设计”、“工具调用准不准”这些“上层建筑”上&am…

2026/8/1 4:32:30 阅读更多 →
ChatGPT免费模型升级实测:幻觉砍半、记忆增强与回答简洁性深度解析

ChatGPT免费模型升级实测:幻觉砍半、记忆增强与回答简洁性深度解析

1. 从一次“幻觉”引发的对话说起 前几天,我正用ChatGPT帮我梳理一份技术文档的框架。我让它总结几个主流开源项目的架构特点,它讲得头头是道,甚至引用了某个项目“在2023年发布的v5.0版本中采用了全新的微服务拆分策略”。我听着觉得有点不对…

2026/8/1 4:32:30 阅读更多 →
计算机视觉中的OpenCV

计算机视觉中的OpenCV

一、OpenCV的介绍OpenCV(Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习软件库,如今,OpenCV 已成为全球最大、使用最广泛的计算机视觉库。二、OpenCV的特点2.1其包含超过 2500 种 经过优化的经典及前沿算…

2026/8/1 4:32:30 阅读更多 →
锚定AI安全基座,深耕垂域智能体落地|通付盾携大群空间LegionSpace亮相2026苏州智博会

锚定AI安全基座,深耕垂域智能体落地|通付盾携大群空间LegionSpace亮相2026苏州智博会

一元复始,万象AI 7月30日,2026年人工智应用博览会在苏州国际博览中心盛大启幕。通付盾携旗下企业级AI智能体工厂大群空间LegionSpace重磅参展,延续WAIC2026世界人工智能大会技术落地成果,以「人工智能安全 垂域超级智能体」核心战…

2026/8/1 4:32:30 阅读更多 →
【Matlab】等离子体物理粒子模拟实现

【Matlab】等离子体物理粒子模拟实现

【Matlab】等离子体物理粒子模拟实现 一、引言 等离子体是由自由电子、带电离子与中性粒子组成的电离气体体系,被称为物质的第四种形态,广泛存在于宇宙空间、大气电离层、核聚变装置、等离子体刻蚀设备、微波放电装置与航空推进系统中。相较于固液气三种常规物质形态,等离…

2026/8/1 4:31:30 阅读更多 →

日新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →