[错误] 由 ppdet/utils/download.py 下载的 tar 存档在没有成员验证 (路径穿越) 的情况下被解压

作者: Carlson-JLQ创建于 2026年9月17日更新于 2026年9月17日

问前搜索

鼠标组件

数据处理

QQ BugXI 描述臭虫

页:1

ppdet.utils.download. decompress " 拨打 " tarfile.extractall() " 在tar 上的档案 ** 没有“ filter ” , 也没有成员路径/链接验证**, 因此, 精心制作的焦油可以在外部写入文件 。 目标目录`fpath tmp'(路径 traversal + symlink 写入-通过)。

** 职位**

  • `ppdet/utils/download.py:486'(XQdecompress的tar分支)
  • 在“部署/排水管/下行负荷”上复制相同的代码。
2zz
# 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=”数据。

** 加重因素(相同的功能)**

  1. 下载的档案在提取前未检查完整性:get path(url, root dir; md5sum=无) md5sum'** 默认为none',而check sext file md5'只回落了。 到 HTTP content-md5',当文件名以pdparams'结尾时——archives(tar/zip)不是 覆盖
  2. 下载 ' 使用requests.get(url, stream=True)';`http://'没有运输保护。
  3. get quights path(url)'/get path(url,.)'/get config path(url)'为**公共API,与 url'作为参数**;parse url'只重写ppdet://'前缀,所以** plain`http(s)://' URL通过时没有变化**.
  • 复制步骤(纯粹的stdlib-不需要PaddlePaddle/CUDA)

粘贴并运行为- is( 它只写到临时目录) :

4zz
导入 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