Vulnerabilidad en Python que permite ejecutar comandos del sistema a partir de scripts aislados

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".

Vulnerabilidad en Python que permite ejecutar comandos del sistema a partir de scripts aislados


Fuente: opennet.ru
Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster