Foi publicado um método de contorno para sistemas de execução isolada de código em Python, baseado em um erro antigo, que surgiu no Python 2.7, identificado em 2012 e ainda não corrigido no Python 3. Esse erro permite, por meio de um código especialmente elaborado em Python, iniciar um acesso à memória já liberada (Use-After-Free) no CPython. Inicialmente, acreditava-se que esse erro não apresentava uma ameaça à segurança e que apenas em casos muito raros, normalmente artificiais, poderia levar a um encerramento anômalo do script.
Um pesquisador de segurança sob o pseudônimo kn32 se interessou pelo problema e conseguiu desenvolver um exploit funcional que permite executar qualquer comando do sistema, sem ter acesso direto a métodos como os.system. O exploit está implementado em puro Python e funciona sem importar bibliotecas externas ou instalar um manipulador 'code.__new__'. Ele utiliza apenas 'builtin.__id__', que geralmente não é bloqueado. Do ponto de vista prático, o código proposto pode ser utilizado para contornar mecanismos de isolamento em diversos serviços e ambientes (por exemplo, em ambientes de aprendizagem, shells online, manipuladores integrados, etc.), que permitem a execução de código em Python, mas restringem chamadas disponíveis e não permitem acessos a métodos como os.system.
O código proposto é análogo à chamada de os.system, funcionando através da exploração de uma vulnerabilidade no CPython. O exploit funciona com todas as versões do Python 3 em sistemas com arquitetura x86-64 e demonstra funcionamento estável no Ubuntu 22.04, mesmo com modos de proteção PIE, RELRO e CET ativados. A execução consiste em obter informações do código em Python sobre o endereço de uma das funções no código executável do CPython. Com base nesse endereço, é calculado o endereço base do CPython na memória e o endereço da função system() na instância do libc carregada na memória. Finalmente, é iniciada uma transição direta para um endereço específico de system substituindo o ponteiro do primeiro argumento pela string 'bin/sh'.

Fonte: opennet.ru
