Vulnerabilidad en Python que permite llamar a comandos del sistema desde scripts de espacio aislado

Se publicó una solución para los sistemas de ejecución de código de Python basada en un error conocido desde hace mucho tiempo que apareció en Python 2.7, se identificó en 2012 y aún no se ha solucionado en Python 3. El error permite usar código de Python especialmente vinculado para iniciar una llamada a memoria (Use-After-Free) en Python. Inicialmente, se asumió que el error no representa una amenaza para la seguridad y solo en casos muy raros, generalmente creados artificialmente, puede provocar una terminación anormal del script.

Un investigador de seguridad bajo el seudónimo kn32 se interesó en el problema y logró preparar un exploit funcional que hace posible llamar a cualquier comando del sistema sin tener acceso directo a métodos como os.system. El exploit se implementa en Python puro y funciona sin importar bibliotecas externas y sin instalar el controlador "code.__new__". De los ganchos, solo se usa "builtin.__id__", que generalmente no está prohibido. Desde el punto de vista práctico, el código propuesto se puede usar para eludir los mecanismos de aislamiento en varios servicios y entornos (por ejemplo, en entornos de aprendizaje, shells en línea, controladores integrados, etc.) que permiten la ejecución del código Python, pero limitan las llamadas disponibles. y no permita métodos de acceso como os.system.

El código propuesto es un análogo de la llamada os.system, que funciona mediante la explotación de una vulnerabilidad en CPython. El exploit funciona con todas las versiones de Python 3 en sistemas x86-64 y es estable en Ubuntu 22.04 incluso con los modos de seguridad PIE, RELRO y CET habilitados. El trabajo se reduce a obtener del código Python información sobre la dirección de una de las funciones en el código ejecutable CPython. En función de esta dirección, se calculan la dirección base de CPython en la memoria y la dirección de la función system() en la instancia cargada de libc. Al final, se inicia un salto directo a una determinada dirección del sistema con la sustitución del puntero del primer argumento por la cadena "/bin/sh".

Vulnerabilidad en Python que permite llamar a comandos del sistema desde scripts de espacio aislado


Fuente: opennet.ru

Añadir un comentario