Concretamente, 3 653 paquetes maliciosos, fueron eliminados del índice de paquetes de Python poco después de que se identificara el fallo de seguridad. Entre estos paquetes se encontraban versiones no autorizadas de CuPy y otros proyectos de PyPI.

Paquetes de Python maliciosos
Extraído de Pexels

Ataque al sistema de confianza con paquetes de Python maliciosos

Los desarrolladores de código malicioso se han aprovechado del sistema de confianza empleado en algunos sistemas de administración de paquetes como pueden ser npm, PyPI o RubyGems. Es bastante convencional que los desarrolladores de Python empleen PyPI para agregar en sus proyectos librerías de software escritas por terceros. Este sistema de gestión de paquetes se basa en la confianza que el desarrollador tiene en los autores de las bibliotecas usadas. Por este motivo, se aconseja que revisen cualquier código que importen de una librería externa. No obstante, no siempre se sigue este consejo. Por lo tanto, no es la primera vez que los sistemas de administración de paquetes tienen que eliminar paquetes maliciosos.

El investigador de seguridad Alex Birsan ya demostró el mes pasado la facilidad con que un desarrollador de malware puede abusar del sistema. Para ello era suficiente con incluir su código malicioso en librerías populares, obteniendo de este modo la distribución gratuita y la confianza de los distintos repositorios. Concretamente, el abuso del sistema de confianza se realizaba aprovechándose de las erratas en los nombres de los paquetes públicos y privados (typosquatting).

Entre la multitud de paquetes maliciosos de Python eliminados durante la semana pasada se descubrieron versiones no autorizadas de proyectos como CuPy, una implementación de una matriz multidimensional compatible con NumPy en CUDA (la plataforma de computación paralela de Nvidia). En este caso, uno de los responsables del proyecto, Kenichi Maehashi, informó sobre la detección del fallo de seguridad. La versión afectada se era cupy-cuda112 (CuPy para CUDA 11.2) que se subió el 25 de febrero de 2021. No ostante fue eliminada al día siguiente gracias a la política de Python diseñada para este tipo de incidentes (PEP 541).

Posibles interpretaciones del ataque

La cuenta implicada en el incidente utiliza el nombre de «RemindSupplyChainRisks», por lo que parece tratarse de un intento de llamar la atención sobre los riesgos de seguridad asociados a este sistema de confianza. Además, en una línea de comentarios de uno de los paquetes maliciosos aparecía el aviso: «El propósito es que todo el mundo preste atención a la cadena de desarrollo del software, porque el riesgo es demasiado alto». No obstante, el director de de infraestructuras de la Fundación Python, Ee W. Durbin III, expresó sus reticencias a suspender la cuenta del infractor alegando que no serviría de nada puesto que podría crearse una cuenta nueva con suma facilidad.

Sin embargo, el hecho de que el autor haya dejado una dirección de correo electrónico inoperativa y que permanezca en el anonimato, hace sospechar que pudiera tratarse de un ataque de malware encubierto. Aunque resulta difícil de imaginar que un atacante auténtico cargase miles de paquetes en un corto período de tiempo, sabiendo que tal actividad se notaría. Aparte de que el código malicioso en cupy-cuda112 no es tan malicioso, puesto que solo envía una solicitud GET a una dirección IP con sede en Tokio (101.32.99.28) con el nombre del paquete adjunto.

Más información

La entrada Eliminados miles de paquetes de Python subidos con contenido «fraudulento» se publicó primero en Una al Día.