Python Cache Poisoning
Explicación sobre Python cache poisoning.
Fuentes
Python Cache Poisoning
El python cache poisoning es una vulnerabilidad (o técnica, según se mire) que permite escalar privilegios aprovechando la confianza de Python en archivos bytecode (.pyc) precompilados de scripts que ejecuta (normalmente con privilegios elevados).
Cuando Python ejecuta un script o importa una librería, hace lo siguiente:
Si no existe una versión precompilada, compila el código fuente a bytecode, que normalmente se almacena en
__pycache__/NOMBRELIB.cpython-VERSION.pyco (menos común) bajo un prefijoPYTHONPYCACHEPREFIX.Si existe una versión precompilada, comprueba la cabecera (Magic Number que depende de la versión de Python, flags, metadatos como
timestamp,sizeohash), y, si al compararla con el.pyoriginal está bien, la ejecuta confiando en el.pyc.
Si un proceso con más privilegios ejecuta un .py o importa un módulo cuyo .pyc ha sido manipulado por un usuario menos privilegiado (y pasa la comprobación de cabecera), el payload corre con esos privilegios elevados.
El mecanismo de
.pycy__pycache__es igual en Linux, Windows y macOS; solo cambian rutas y permisos. Lo más normal es ver esta vulnerabilidad en Linux, pero en Windows podría darse el caso.
Caso Común: Permiso de escritura en __pycache__ junto a script privilegiado
__pycache__ junto a script privilegiadoAparece en máquinas de HTB, consiste en lo siguiente:
Script de python ejecutado como usuario privilegiado
Permisos de escritura para todos en carpeta
__pycache__Script importa módulos locales
El exploit es el siguiente:
Se compila un exploit a
.pyccon la misma versión de Python (si no fallará las comprobaciones)
Se lee el
.pylegítimo (del módulo) para robarlemtimeysize, se escriben a la cabecera del.pycSe sobrescribe el
.pycbueno con el malicioso. Si no existe aún puede compilarse el.pylegítimo con el mismo comando que con el exploit.Cuando el script llame a
import modulo, python verá un.pycválido que pasará las comprobaciones, lo importará y ejecutará.
Hay un script que automatiza los pasos 2 y 3.
Última actualización