Foi publicado um método para contornar sistemas isolados de execução de código em Python, baseado no uso de um bug conhecido que apareceu no Python 2.7, foi identificado em 2012 e ainda não foi corrigido no Python 3. O bug permite o uso de links especialmente vinculados Código Python para iniciar o acesso à memória já liberada (Use-After-Free) em Python. Inicialmente, presumiu-se que o erro não representava uma ameaça à segurança e apenas em casos muito raros, geralmente criados artificialmente, poderia levar ao encerramento anormal do script.
Um pesquisador de segurança sob o pseudônimo kn32 se interessou pelo problema e conseguiu preparar um exploit funcional que torna possível chamar qualquer comando do sistema sem ter acesso direto a métodos como os.system. A exploração é implementada em Python puro e funciona sem importar bibliotecas externas e sem instalar o manipulador “code.__new__”. Dos ganchos, apenas “builtin.__id__” é usado, o que geralmente não é proibido. Do lado prático, o código proposto pode ser usado para contornar mecanismos de isolamento em vários serviços e ambientes (por exemplo, em ambientes de aprendizagem, shells online, manipuladores integrados, etc.), que permitem a execução de código Python, mas limitam o chamadas disponíveis e não permitem métodos de chamada como os.system.
O código proposto é análogo à chamada os.system, que funciona explorando uma vulnerabilidade no CPython. O exploit funciona com todas as versões do Python 3 em sistemas com arquitetura x86-64 e demonstra operação estável no Ubuntu 22.04, mesmo quando os modos de proteção PIE, RELRO e CET estão habilitados. O trabalho se resume a obter informações do código Python sobre o endereço de uma das funções do código executável CPython. Com base neste endereço, são calculados o endereço base do CPython na memória e o endereço da função system() na instância libc carregada na memória. Ao final, uma transição direta para um endereço específico do sistema é iniciada com a substituição do ponteiro do primeiro argumento pela linha “/bin/sh”.
Fonte: opennet.ru