从不受信任的名称导入模块

时间:2016-03-16 14:02:42

标签: python security python-import

我正在使用的这段代码应该根据其名称导入内部模块。模块的名称由外部源提供,因此无法信任。

def import_module_from_name( name ):

    # will raise an ImportError if the module does not exist
    module = __import__( modulename )

    filename = module.__file__
    if "<internal_path>" in filename:  # check if the module can be loaded
        return module
    raise ImportError  # the module exists but must not be loaded from here

如果出于某些原因我们的PYTHONPATH中有恶意包,__import__( modulename )会执行它。例如:

$> echo "print 'Got u'" > /usr/lib/python/site-packages/malicious_package/__init__.py
$> python
>>> import_module_from_name( "malicious_package" )
Got u
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 7, in import_module_from_name
ImportError

我知道大多数常用软件包都有一条if __name__ == "__main__"指令,以避免在导入代码时执行任何代码,而这正是恶意软件包在这种情况下无法实现的。< / p>

现在,考虑到我们拒绝在我们的PYTHONPATH中安装恶意程序包的任何可能性(是的,我知道这是一个非常大的假设...),您是否知道以及已知的广泛安装的包,import在这种情况下可能会出现意外行为? (我只是希望有一个非常简单的证据证明我们需要尽快重写这个东西) 您是否看到另一种方法来检查我们要加载的模块是否在可信路径中而不导入它并且没有处理可信模块的详尽列表?

0 个答案:

没有答案