为什么BuiltinImporter.create\u模块只恢复部分builtins模块?

2024-04-25 23:58:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个挑战来证明evalexec是危险的,即使它们无法访问任何内置程序。挑战是这样的:

vars(__builtins__).clear()
del __builtins__

...  # your code here

print('you win')  # if this line doesn't crash, you win

我想出了一些疯狂的代码,可以访问被破坏的builtins模块并重新导入它以恢复其功能。这是我用来通过挑战的代码(在cpython3.7中测试):

type = ''.__class__.__class__
ABCMeta = type.__subclasses__(type)[0]
abc_globals = ABCMeta.register.__globals__
importlib_globals = abc_globals['__loader__'].get_data.__globals__
sys = importlib_globals['sys']
__builtins__ = sys.modules['builtins']
loader = sys.modules['_frozen_importlib'].BuiltinImporter
spec = sys.modules['_frozen_importlib'].ModuleSpec('builtins', loader)
loader.create_module(spec)
loader.exec_module(__builtins__)
__builtins__.__spec__ = spec

但通过挑战后,我注意到一些内置函数和类仍然缺失:

>>> print
<built-in function print>
>>> int
<class 'int'>
>>> exit
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'exit' is not defined
>>> KeyError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'KeyError' is not defined

为什么会这样?为什么BuiltinImporter.create_module(...)恢复intprint,而不是exitKeyError


Tags: inmodulestypesyslineexitloaderimportlib

热门问题