【问题标题】:Security and arbitrary code execution inside `.pth` files`.pth` 文件中的安全性和任意代码执行
【发布时间】:2018-10-16 04:49:41
【问题描述】:

深入阅读Python site.py documentation,我发现这是关于.pth 文件的:

空白行和以# 开头的行被跳过。执行以 import 开头的行(后跟空格或制表符)。

这两句话很容易漏掉。它们位于长段的末尾,这意味着扫描的眼睛很容易忽略它们。即使在我积极寻找它们时,我也想念它们。

代码执行示例来自python3.6/site-packages/virtualenvwrapper-4.8.2-py2.7-nspkg.pth

import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('virtualenvwrapper',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('virtualenvwrapper', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('virtualenvwrapper', [os.path.dirname(p)])));m = m or sys.modules.setdefault('virtualenvwrapper', types.ModuleType('virtualenvwrapper'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p)

允许在.pth 文件中执行任意代码的目的是什么?

鉴于任意代码执行可能产生广泛的负面影响,有关检查或保护 .pth 文件的最佳做法是什么?

【问题讨论】:

    标签: python python-3.x python-2.7 sys.path


    【解决方案1】:

    允许在 .pth 文件中执行任意代码的目的是什么?

    它允许包使用代码配置sys.path。这可能用于条件分支,例如特定于平台的自定义。

    鉴于任意代码执行可能产生广泛的负面影响,关于检查或保护 .pth 文件的最佳做法是什么?

    与往常一样 - 知道您正在安装什么。使用pip install somepackage 已经允许任意代码执行,setup.py 被作为代码执行。因此,实际上并没有任何额外的漏洞或将代码隐藏在 .pth 文件中的可能性。

    最近有关于弃用和删除.pth hacks (Python 3.8+) 的可能性的讨论,请参阅issue33944 了解更多详细信息。

    【讨论】:

    • .pth 文件也有一些罕见的用途,可以在不修改应用程序的情况下更改解释器的行为。我在想coverage's docs on subprocess coverage
    • 是的,coverage.py 在任何用户代码之前使用它来“首先进入”。还有一些顽皮的安装程序,例如 ruamel.yaml 使用 .pth 文件将命名空间包破解回 Python 2。似乎很多人出于预期用例以外的原因滥用代码执行功能(即配置 sys.path),但在 Python 中总是如此——没有什么是禁止的,所有同意的成年人,等等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    相关资源
    最近更新 更多