Se ha publicado un método para eludir los sistemas de ejecución aislada de código en Python, basado en un error conocido desde hace tiempo que apareció en Python 2.7, descubierto en 2012 y que aún no se ha corregido en Python 3. Este error permite, mediante un código configurado de manera especial en Python, iniciar una llamada a memoria ya liberada (Use-After-Free) en CPython. Inicialmente, se pensó que el error no representaba una amenaza de seguridad y que solo en casos muy raros, generalmente creados artificialmente, podría provocar el cierre inesperado del script.
Un investigador de seguridad bajo el seudónimo de kn32 se interesó por el problema y logró preparar un exploit operativo que permite invocar cualquier comando del sistema sin tener acceso directo a métodos como os.system. El exploit está implementado en puro Python y funciona sin la importación de bibliotecas externas ni la instalación del manejador "code.__new__". Solo se utiliza el hook "builtin.__id__", que generalmente no está prohibido. Desde un punto de vista práctico, el código propuesto puede utilizarse para eludir mecanismos de aislamiento en varios servicios y entornos (por ejemplo, en entornos de aprendizaje, shells en línea, manejadores integrados, etc.) que permiten la ejecución de código en Python, pero limitan las llamadas disponibles y no permiten acceder a métodos como os.system.
El código propuesto es análogo a la llamada a os.system, funcionando a través de la explotación de una vulnerabilidad en CPython. El exploit funciona con todas las versiones de Python 3 en sistemas con arquitectura x86-64 y demuestra un funcionamiento estable en Ubuntu 22.04, incluso con los modos de protección PIE, RELRO y CET activados. La operación consiste en obtener desde el código en Python la dirección de una de las funciones en el código ejecutable de CPython. A partir de esta dirección, se calcula la dirección base de CPython en memoria y la dirección de la función system() en la instancia de libc cargada en memoria. Al final, se inicia un salto directo a la dirección específica de system reemplazando el puntero del primer argumento por la cadena "/bin/sh".

Fuente: opennet.ru
