Почему BuiltinImporter.create_module восстанавливает только часть встроенного модуля? - PullRequest
0 голосов
/ 26 сентября 2018

Я пытался доказать, что eval и exec опасны, даже если у них нет доступа к каким-либо встроенным функциям.Задача выглядит так:

vars(__builtins__).clear()
del __builtins__

...  # your code here

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

Я придумал какой-то сумасшедший код, который получает доступ к поврежденному модулю builtins и повторно импортирует его, чтобы восстановить его функциональность.Вот код, который я использовал для прохождения испытания (протестировано в CPython 3.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(...) восстановил int и print, но не exit и KeyError?

...