Seguridad

Cómo encontrar vulnerabilidades de terceros en código Python

Los módulos facilitan la escritura de aplicaciones de Python, pero cuando usa el código de otras personas (lo que es un módulo), es una buena idea verificar regularmente las vulnerabilidades publicadas.Este artículo te dice cómo usar Auditoría de ideas Una herramienta para encontrar recomendaciones de CVE publicadas para los módulos de Python que usa en su proyecto.

La mayoría de los codificadores de Python enumeran todas las dependencias de terceros en uno requirements.txt archivo, que es útil para PyPi y otros sistemas de gestión de dependencias:

module1==x.y.z
module2==x.y.z
module1==x.y.z

Esto hace que su entorno de desarrollo sea reproducible, pero también lo expone al uso de versiones anteriores que pueden ser vulnerables.

Piensa en tus ediciones como un jardín: necesitan riego, poda y atención. Un buen proyecto se mantiene actualizado cuando se descubren errores, y herramientas como pip-audit facilitan este trabajo.

Aquí se explica cómo usar pip-audit para escanear su proyecto Python y averiguar si alguna de sus bibliotecas de terceros tiene vulnerabilidades conocidas para los identificadores CVE.

instalar auditoría pip

Instale la última versión de pip-audit pip:

python3 -m venv ~/virtualenv/pip-audit
$ . ~/virtualenv/pip-audit/bin/activate

$ pip install --upgrade pip pip-audit

Esta pip-audit comando requiere un requirements.txt documento.Si su proyecto no lo hace (por ejemplo, si utiliza un solo setup.py), lo que genera un:

. ~/virtualenv/myprojectvirtualenv/bin/activate
# Install your project as usual, like python setup.py develop
$ pip freeze > requirements.txt

analizar un proyecto

Ahora debería estar listo para comenzar a analizar su proyecto en busca de posibles vulnerabilidades en los módulos.

Ejemplo 1: Proyecto sin vulnerabilidades

Visión 2 es un buen script que combina la salida de los archivos XML de escaneo Nmap con CVE NIST Base de datos de vulnerabilidades. Aquí hay un ejemplo:

$ git clone https://github.com/CoolerVoid/Vision2.git
Cloning into 'Vision2'...
remote: Enumerating objects: 107, done.
remote: Counting objects: 100% (53/53), done.
remote: Compressing objects: 100% (42/42), done.
remote: Total 107 (delta 27), reused 23 (delta 9), pack-reused 54
Receiving objects: 100% (107/107), 30.92 KiB | 2.21 MiB/s, done.
Resolving deltas: 100% (52/52), done.

$ pip-audit  --requirement Vision2/re
requirements.txt  result_nmap.xml   

$ pip-audit  --requirement Vision2/requirements.txt 
\ Installing package in isolated environment                                  Processing /tmp/tmpyqd6k_6g/termcolor-1.1.0.tar.gz
  Preparing metadata (setup.py) ... done
Building wheels for collected packages: termcolor
  Building wheel for termcolor (setup.py) ... done
  Created wheel for termcolor: filename=termcolor-1.1.0-py3-none-any.whl size=4830 sha256=651435a861c5185b1cfb66655fb1da82488f5fa8b97d7ed859576d61af89f616
  Stored in directory: /home/josevnz/.cache/pip/wheels/74/35/a1/85d77e2de196f09e73917aa5b91c278b29efc72d4a800b2ae7
Successfully built termcolor
Installing collected packages: termcolor
Successfully installed termcolor-1.1.0
No known vulnerabilities found   

Bien, el proyecto no usa bibliotecas vulnerables.

Ejemplo 2: lector de RSS vulnerable

Habilitar administrador del sistema RSSReader Contiene un paquete que encontró una vulnerabilidad reciente (el proyecto es seguro, pero deliberadamente degradaré una de las bibliotecas en este ejemplo). Analízalo:

(José Nunes, CC BY-SA 4.0)

instalarlo (ver mi LÉAME Para instrucciones):

$ git clone [email protected]:josevnz/EnableSysadminRssReader.git
$ cd EnableSysadminRssReader
$ sed -i 's#4.7.1#4.6.0#' requirements.txt

Bajé la versión de lxml de 4.7.1 a 4.6.0 (nota sed -i Pedido). ¿Qué sucede al escanear?

$ pip-audit  --requirement requirements.txt 
Found 3 known vulnerabilities in 1 packages        
Name Version ID             Fix Versions
---- ------- -------------- ------------
lxml 4.6.0   PYSEC-2021-19  4.6.3
lxml 4.6.0   PYSEC-2020-62  4.6.2
lxml 4.6.0   PYSEC-2021-852 4.6.5

lxml 4.6.0 tiene una advertencia.

lxml es una buena biblioteca Analice fácilmente los archivos XML. El software es complejo y esta biblioteca tiene un error que se puede aprovechar.Si vas a la base de datos del NIST y buscas lxml verás más detalles sobre la consulta CVE-2021-43818. echar un vistazo requirements.txt documento:

requests==2.27.1
rich==11.0.0
lxml==4.6.0

La solución más fácil es actualizar a la versión lxml recomendada (4.6.5), ya que es una pequeña actualización con correcciones de errores y cambios mínimos en la API. Después de verificar la última versión (4.7.1) al momento de escribir, decidí usar una versión superior ya que mi código no requiere más modificaciones:

requests==2.27.1
rich==11.0.0
# lxml==4.6.0 <- Vulnerable to CVE-2021-43818
lxml==4.7.1

Si escanea el proyecto nuevamente, obtendrá:

$ pip-audit  --requirement /home/josevnz/EnableSysadmin/EnableSysadminRssReader/requirements.txt 
No known vulnerabilities found

Con eso fuera del camino, puedo decir mi cita favorita de Poltergeist: "la casa esta limpia. "

¿Puede el IDE decirle si una biblioteca está desactualizada?

Sí puede. Por ejemplo, PyCharm y VS Code le indicarán si hay disponibles versiones más recientes de bibliotecas de terceros. Para este ejemplo, estoy usando una versión obsoleta de Rich:

(José Nunes, CC BY-SA 4.0)

No debe ignorar estas advertencias.

Comprueba tu código de Python

Voy a resumir algo de lo que has aprendido:

Una cosa más: las vulnerabilidades de terceros no son un problema exclusivo de Python, otros lenguajes tienen el mismo problema. En un artículo de seguimiento, le mostraré cómo inspeccionar su código Java.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Botón volver arriba