Descubierto malware en el repositorio PyPI de Python

Národný Bezpečnostný Úrad (NBU), es el nombre de la Autoridad de Seguridad Nacional de Eslovaquia. Un departamento que tiene como misión la protección de la información clasificada, los servicios de cifrado y de firma electrónica. También la detección de ciberamenazas, como la que acaban de encontrar en PyPI (Python Package Indice), un importante repositorio de software comunitario para el lenguaje de programación Python.

Alrededor de una decena de paquetes maliciosos, se han camuflado dentro de un directorio donde los creadores de software pueden registrar sus proyectos (117 173 hasta la fecha), para que otros desarrolladores y usuarios descarguen las aplicaciones y módulos correspondientes.

Software que en Linux podemos instalar mediante el gestor de paquetes pip, independientemente de la distro que estemos usando. Facilidad de uso y disponibilidad de paquetes mas allá de los repositorios oficiales, han contribuido a la popularidad de pip (y por tanto PyPI) en los últimos años .

Puedo que haya sido eso último, lo que ha motivado la creación de un conjunto de módulos ficticios, que imitan en su nombre a los originales y que fueron subidos al repositorio de Python, a principios del pasado mes de junio:

  • acqusition suplanta a acquisition.
  • apidev-coop suplanta a apidev-coop_cms.
  • bzip suplanta a bz2file.
  • crypt suplanta a crypto.
  • django-server suplanta a django-server-guardian-api.
  • pwd suplanta a pwdhash.
  • setup-tools suplanta a setuptools.
  • telnet suplanta a telnetsrvlib.
  • urlib3 suplanta a urllib3.
  • urllib suplanta a urllib3.

Las buenas noticias es que no parecen especialmente dañinos y por lo que se ha visto hasta ahora, se limitan a enviar datos estadísticos a un servidor (nombre y versión del paquete, nombre del equipo y del usuario que autorizó la instalación).

El software estaba diseñado para Python 2.x. Fue su intento de uso en Python 3.x y el análisis de los errores que generaba, lo que ayudó a descubrir su presencia.

Son paquetes que ya han sido retirados de PyPI, pero obviamente no de aquellos equipos que ya los hayan instalado. Para saber si nos han dado gato por liebre y en un descuido hemos instalado el paquete incorrecto podemos ejecutar:

pip list –format=legacy | egrep '^(acqusition|apidev-coop|bzip|crypt|django-server|pwd|setup-tools|telnet|urlib3|urllib)'

En el caso de que aparezca algún resultado, deberemos proceder a eliminar el paquete infectado. Por ejemplo si hemos detectado a urlib3:

pip uninstall urlib3

También podemos obtener la lista de paquetes que tenemos instalados y compararla con la de paquetes fraudulentos:

pip freeze

Claramente el instalar aplicaciones fuera de los repositorios oficiales de nuestra distro conlleva riesgos de seguridad, pero cuando hablamos de trabajar con lenguajes de programación en ocasiones no queda más remedio (y de ahí la popularidad de los Cargo, Bundler, Maven, o el npm de JavaScript que recientemente tuvo problemas similares).

La gente del NBU en su informe, aparte de resaltar que los usuarios tienen que fijarse en el nombre del paquete que instalan, critican la ausencia de firmas criptográficas en pip durante el proceso de instalación.

Así como la falta de control de calidad en los paquetes que se suben al repositorio de PyPI.

Firmar el software está bien y es un primer paso, pero tampoco proporciona seguridad absoluta, a menos que se rodee de otras medidas adicionales. Quizás –y todo esto ya es mi opinión– un sistema que permitiera establecer la popularidad y reputación de los paquetes en PyPI, mediante el voto de los usuarios (al estilo del AUR de Arch Linux), también sería de ayuda.

8 thoughts on “Descubierto malware en el repositorio PyPI de Python”

  1. Dani says:

    Qué fuerte y curioso la forma de encontrar el malware.

  2. Javier Somonte says:

    Me he librado por los pelos, tarde o temprano hubiera caido alguno de esos paquetes. Muchas gracias por la información.

    1. tannhausser says:

      De nada @Javier, por suerte ya los han eliminado del repositorio.

      Aún así, hasta que cambie la manera de distribuir el software en Pypi, habrá que estar un poco más atento, a lo que se escribe 🙂

      Un saludo!

  3. Roberto Val says:

    Por eso es que generalmente trato de evitar usar pip, es muy útil y todo pero hay cada cosa desagradable, en esta máquina de hecho ni siquiera tengo instalado las setup-tools, gracias pro la información.

  4. Luis says:

    Me han aparecido estas 2:

    cryptography (0.6.1)
    urllib3 (1.9.1)

    He intentado eliminarlas pero dice:

    Not uninstalling cryptography at /usr/lib/python2.7/dist-packages, owned by OS
    Not uninstalling urllib3 at /usr/lib/python2.7/dist-packages, owned by OS

    Yo no recuerdo haber instalado nada de esto, la única app que tengo instalada de pip es youtube-dl.

    1. tannhausser says:

      Ambos son paquetes legítimos que seguramente habrás instalado como dependencias de otros programas.

      No deberías tener problemas con ellos y seguramente son necesarios para alguna aplicación, pero si quieres eliminarlos lo puedes hacer desde el gestor de paquetes de la distro.

      1. Luis says:

        Me dejas mas tranquilo.Muchas Gracias!!!

        1. tannhausser says:

          De nada amigo!

Deja un comentario