PEP 721 – 将 tarfile.data_filter 用于源代码分发提取
- 作者:
- Petr Viktorin <encukou at gmail.com>
- PEP 代理人:
- Paul Moore <p.f.moore at gmail.com>
- 状态:
- 最终版
- 类型:
- 标准跟踪
- 主题:
- 打包
- 要求:
- 706
- 创建日期:
- 2023 年 7 月 12 日
- Python 版本:
- 3.12
- 发布历史:
- 2023 年 7 月 4 日
- 决议:
- 2023 年 8 月 2 日
摘要
提取源代码分发归档时,通常应使用在 PEP 706 中添加的 data 过滤器。我们澄清了细节,并为无法直接使用该过滤器的工具指定了行为。
动机
“源代码分发” sdist 定义为 tar 归档。
tar 格式旨在捕获类 Unix 文件的所有元数据。其中一些是危险的、源代码不需要的,和/或平台相关的。正如 PEP 706 中所解释的,当解压 tarball 时,应该总是限制允许的特性,或者明确赋予 tarball 完全控制权。
基本原理
对于源代码分发,PEP 706 中引入的 data 过滤器就足够了。它允许的特性比 git 和 zip(两者都常用于打包工作流)略多。
然而,并非所有工具都能使用 data 过滤器,因此本 PEP 明确规定了一组预期。目标是使 pip download 和 setuptools.archive_util.unpack_tarfile 的当前行为有效,但被认为过于危险而不能允许的情况除外。另一个考虑是对于非 Python 工具而言易于实现。
未打补丁的 Python 版本
在不带 tarfile 过滤器的 Python 上运行时,工具可以忽略本 PEP。
该功能已向后移植到 python.org 支持的所有 Python 版本。将其在第三方库中内嵌是很棘手的,我们不应强迫所有工具都这样做。这将把跟上安全更新的责任从工具转移到用户身上。
权限
常用工具(git、zip)不保留 Unix 权限(模式位)。告诉用户不要依赖 sdist 中的这些权限,并允许工具相对自由地处理它们,这似乎是公平的。
唯一的例外是 可执行 权限。我们建议但不要求工具保留它。考虑到脚本通常是平台特定的,可以说保持它们可执行是工具特定的行为。
请注意,虽然 git 保留了可执行性,但 zip(因此 wheel)本身不这样做。(可以将其编码在“外部属性”中,但 Python 的 ZipFile.extract 不遵守这一点。)
规范
以下内容将以新标题“源代码分发归档特性”的形式添加到 PyPA 源代码分发格式规范中
由于按原样提取 tar 文件是危险的,并且结果是平台特定的,因此源代码分发的归档特性受到限制。
使用数据过滤器解包
提取源代码分发时,工具必须要么使用 tarfile.data_filter(例如 TarFile.extractall(..., filter='data')),要么遵循下面的“不使用数据过滤器解包”部分。
例外情况是,在没有 hasattr(tarfile, 'data_filter')(PEP 706)的 Python 解释器上,通常使用该过滤器(直接或间接)的工具可以警告用户并忽略此规范。在这种情况下,可用性(例如完全信任归档)和安全性(例如拒绝解包)之间的权衡由工具决定。
不使用数据过滤器解包
不直接使用 data 过滤器的工具(例如出于向后兼容性、允许额外特性或不使用 Python)必须遵循本节。(在撰写本文时,data 过滤器也遵循本节,但将来可能会不同步。)
以下文件在 sdist 归档中无效。遇到此类条目时,工具应通知用户,不得解包该条目,并可以中止并失败。
- 将被放置在目标目录之外的文件。
- 指向目标目录之外的链接(符号链接或硬链接)。
- 设备文件(包括管道)。
以下也无效。工具可以像上面一样处理它们,但不是必需的。
- 文件名或链接目标中包含
..组件的文件。 - 指向不属于归档文件的链接。
工具可以将链接(符号链接或硬链接)解包为普通文件,使用归档中的内容。
解压 sdist 归档时
- 文件名中的前导斜杠必须被删除。(这现在是
tar解包的标准行为。) - 对于每个
mode(Unix 权限) 位,工具必须- 分别使用平台对新文件/目录的默认设置,
- 根据归档设置该位,或
- 对于不可执行文件使用
rw-r--r--(0o644) 的位,对于可执行文件和目录使用rwxr-xr-x(0o755) 的位。
- 高
mode位(setuid、setgid、sticky)必须被清除。 - 建议保留用户 可执行 位。
进一步提示
鼓励工具作者考虑 tarfile 文档中“进一步验证的提示”如何适用于他们的工具。
向后兼容性
现有行为未指定,并由不同的工具以不同方式处理。本 PEP 明确了预期。
没有已知的向后不兼容情况,但某些项目可能确实依赖于未保证的细节。本 PEP 禁止了其中最危险的功能,其余功能则由工具特定。
安全隐患
推荐的 data 过滤器被认为对常见的漏洞是安全的,并且将来如果发现缺陷,它将是唯一的修改点。
明确的规范包括来自 data 过滤器的保护措施。
如何教授此内容
本 PEP 旨在针对打包工具的作者,他们应该对 PEP 和更新的打包规范感到满意。
参考实现
待定
被拒绝的想法
暂无。
未解决的问题
暂无。
版权
本文档置于公共领域或 CC0-1.0-Universal 许可证下,以更宽松者为准。
来源:https://github.com/python/peps/blob/main/peps/pep-0721.rst