.pth文件中的安全性和任意代码执行

时间:2018-10-16 04:49:41

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

深入研究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文件的最佳实践是什么?

1 个答案:

答案 0 :(得分:2)

  

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

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

  

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

一如既往-了解您要安装的内容。使用pip install somepackage已经允许任意代码执行,setup.py作为代码执行。因此,实际上没有任何其他漏洞或可能性可以将代码隐藏在.pth文件中。

最近一直在讨论是否可以弃用和删除.pth hacks(Python 3.8+),有关更多详细信息,请参见issue33944