Los scripts de activación de virtualenv ejecutan código desde una ruta que contiene un nombre de marcador de posición
Impacto
ViaTemplateActivator.instantiate_template reemplaza los marcadores de posición en una plantilla de activación clave por clave a lo largo de todo el texto. Cuando un valor que ya ha sido sustituido y entrecomillado contiene el nombre de un marcador de posición posterior, la pasada posterior reescribe ese nombre dentro del literal entre comillas. El valor insertado aporta sus propias comillas, las cuales cierran el literal externo, y el resto de la ruta se ejecuta como código cuando un usuario activa el entorno.
__VIRTUAL_NAME__ contiene el nombre del directorio del entorno, por lo que un destino como A__VIRTUAL_NAME__B/x'$(touch PWNED)'y es suficiente. En el activate predeterminado para bash, la línea VIRTUAL_ENV se genera como:
VIRTUAL_ENV='/tmp/t/A'x'"'"'$(touch PWNED)'"'"'y'B/x'"'"'$(touch PWNED)'"'"'y'
Al cargar el script mediante source se ejecuta touch PWNED. La misma carga útil en una ruta sin el nombre del marcador de posición no ejecuta nada. activate.fish ejecuta el comando de la misma manera, y quien reportó el fallo también demostró la ejecución de código Python a través de activate.xsh y bin/activate_this.py. En activate.csh, un directorio cuyo nombre coincide con un marcador de posición de visualización del prompt, como __VIRTUAL_PROMPT_DISPLAY_TCSH__, rompe el script con Unmatched '''.
Ningún cambio en quote() puede detener esto, debido a que la reescritura ocurre después de que quote() se haya ejecutado; elude tanto a shlex.quote como a repr().
Un atacante necesita influir en la ruta de destino o en --prompt: un trabajo de CI o una herramienta envoltorio (wrapper) que construya la ruta a partir de un nombre de rama o proyecto, o un directorio en un repositorio clonado o archivo descomprimido.
El error afecta a las versiones desde la 20.26.6 hasta la 21.14.1. La versión 20.26.6 fue la primera en entrecomillar valores de plantilla (#2768) e introdujo el bucle por clave.
Créditos
Kevin Stubbings (@Kwstubbs) de GitHub Security Lab reportó este problema.
Qué hacer
Parches
Corregido en 21.14.2. Los scripts de activación ahora conservan los nombres de los marcadores de posición en la ruta o en el prompt del entorno como texto plano, y la activación del ejemplo anterior no ejecuta nada. Corrección: https://github.com/pypa/virtualenv/commit/602b26623a724827ff171bf11fef4ad186d01f74
Mitigaciones provisionales
No cree un entorno cuya ruta o --prompt contenga un nombre de marcador de posición como __VIRTUAL_NAME__, __VIRTUAL_ENV__ o __VIRTUAL_PROMPT__, e inspeccione el script de activación generado antes de cargar uno que no haya creado usted.
Software afectado
Haz clic en una tecnología para ver todas sus vulnerabilidades.
| Plataforma | Paquete | Versiones vulnerables | Corregida en |
|---|---|---|---|
| Python (PyPI) | virtualenv | >= 20.26.6, < 21.14.2 | 21.14.2 |
Referencias
- Vector CVSS
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H- Debilidad (CWE)
CWE-78, CWE-94- Plataforma
- Python (PyPI)
- Paquete
virtualenv- Publicada
- 21.10.2026
- Actualizado
- 21.10.2026 19:21
Fuentes y licencias · Editado o traducido por DockRay; se mantienen los derechos y las licencias de las fuentes.
OSV / GitHub Advisory Database - GHSA-8rjx-v5ww-45pp - CC BY 4.0
Historial de vulnerabilidades: virtualenv
Todas las vulnerabilidades publicadas de este paquete (Python (PyPI)), de la más reciente a la más antigua. Muestra si es un fallo aislado o un paquete que hay que vigilar.
- Entradas en total
- 9
- Primera → última
- 12.2011 10.2026
- Sin corrección
- 0
- Explotada en ataques
- 0
Distribución por gravedad
- Alta 6
- Media 3
Divulgaciones por año
- 2017: 0
- 2018: 0
- 2019: 0
- 2020: 0
- 2021: 0
- 2022: 0
- 2023: 0
- 2024: 1
- 2025: 0
- 2026: 7
antes: 1
-
Los scripts de activación de virtualenv ejecutan código desde una ruta que contiene un nombre de marcador de posición esta entrada
Identifica las vulnerabilidades de tu aplicación
Con la integración de DockRay y el inventario de software activado, DockRay compara las versiones notificadas de los componentes con las vulnerabilidades conocidas y avisa de las coincidencias confirmadas. La cobertura depende de la tecnología compatible y de los avisos disponibles.