Skrypty aktywacyjne virtualenv wykonują kod ze ścieżki zawierającej nazwę symbolu zastępczego
Wpływ
ViaTemplateActivator.instantiate_template zastępuje symbole zastępcze w szablonie aktywacyjnym klucz po kluczu w całym tekście. Gdy wartość, która została już wstawiona i ujęta w cudzysłów, zawiera nazwę późniejszego symbolu zastępczego, kolejny przebieg nadpisuje tę nazwę wewnątrz literału w cudzysłowie. Wstawiona wartość wprowadza własne cudzysłowy, które zamykają zewnętrzny literał, a pozostała część ścieżki jest wykonywana jako kod w momencie aktywacji środowiska przez użytkownika.
__VIRTUAL_NAME__ przechowuje nazwę katalogu środowiska, więc ścieżka docelowa taka jak A__VIRTUAL_NAME__B/x'$(touch PWNED)'y jest wystarczająca. W domyślnym activate dla powłoki bash wiersz VIRTUAL_ENV przyjmuje postać:
VIRTUAL_ENV='/tmp/t/A'x'"'"'$(touch PWNED)'"'"'y'B/x'"'"'$(touch PWNED)'"'"'y'
Załadowanie tego skryptu za pomocą source wykonuje touch PWNED. Ten sam ładunek w ścieżce bez nazwy symbolu zastępczego nie wykonuje niczego. activate.fish wykonuje polecenie w ten sam sposób, a zgłaszający wykazał również wykonanie kodu Pythona za pośrednictwem activate.xsh oraz bin/activate_this.py. W activate.csh katalog o nazwie odpowiadającej symbolowi zastępczemu wyświetlania promptu, taki jak __VIRTUAL_PROMPT_DISPLAY_TCSH__, powoduje błąd skryptu z komunikatem Unmatched '''.
Żadna zmiana w quote() nie jest w stanie temu zapobiec, ponieważ nadpisanie następuje po uruchomieniu quote(); omija to zarówno shlex.quote, jak i repr().
Atakujący musi mieć wpływ na ścieżkę docelową lub --prompt: zadanie CI lub narzędzie opakowujące, które tworzy ścieżkę na podstawie nazwy gałęzi lub projektu, bądź katalog w sklonowanym repozytorium lub rozpakowanym archiwum.
Błąd dotyczy wersji od 20.26.6 do 21.14.1. W wersji 20.26.6 po raz pierwszy wprowadzono ujmowanie wartości szablonu w cudzysłowy (#2768) oraz pętlę iterującą po kluczach.
Podziękowania
Kevin Stubbings (@Kwstubbs) z GitHub Security Lab zgłosił ten problem.
Co trzeba zrobić
Poprawki
Naprawiono w 21.14.2. Skrypty aktywacyjne zachowują teraz nazwę symbolu zastępczego w ścieżce środowiska lub prompcie jako zwykły tekst, a aktywacja powyższego przykładu nie wykonuje żadnego kodu. Poprawka: https://github.com/pypa/virtualenv/commit/602b26623a724827ff171bf11fef4ad186d01f74
Obejścia
Nie należy tworzyć środowiska, którego ścieżka lub --prompt zawiera nazwę symbolu zastępczego, taką jak __VIRTUAL_NAME__, __VIRTUAL_ENV__ lub __VIRTUAL_PROMPT__, oraz należy sprawdzić wygenerowany skrypt aktywacyjny przed jego załadowaniem, jeśli nie został utworzony samodzielnie.
Czego dotyczy
Kliknij technologię, aby zobaczyć wszystkie dotyczące jej podatności.
| Platforma | Paczka | Podatne wersje | Poprawka w wersji |
|---|---|---|---|
| Python (PyPI) | virtualenv | >= 20.26.6, < 21.14.2 | 21.14.2 |
Odnośniki
- Wektor CVSS
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H- Słabość (CWE)
CWE-78, CWE-94- Platforma
- Python (PyPI)
- Paczka
virtualenv- Ujawniono
- 21.10.2026
- Aktualizacja
- 21.10.2026 19:21
Źródła i licencje · Redakcja lub tłumaczenie: DockRay. Zachowano prawa źródeł i obowiązujące licencje.
OSV / GitHub Advisory Database - GHSA-8rjx-v5ww-45pp - CC BY 4.0
Historia podatności: virtualenv
Wszystkie opisane podatności tej paczki (Python (PyPI)), od najnowszej. Widać, czy to jednorazowa wpadka, czy paczka, której trzeba pilnować.
- Wszystkich wpisów
- 9
- Pierwsza → ostatnia
- 12.2011 10.2026
- Bez poprawki
- 0
- Wykorzystywana w atakach
- 0
Rozkład istotności
- Wysoka 6
- Średnia 3
Ujawnienia w latach
- 2017: 0
- 2018: 0
- 2019: 0
- 2020: 0
- 2021: 0
- 2022: 0
- 2023: 0
- 2024: 1
- 2025: 0
- 2026: 7
wcześniej: 1
-
Skrypty aktywacyjne virtualenv wykonują kod ze ścieżki zawierającej nazwę symbolu zastępczego ten wpis
Dowiedz się, które podatności dotyczą Twojej aplikacji
Po podłączeniu integracji DockRay i włączeniu raportowania oprogramowania DockRay porównuje zgłoszone wersje komponentów ze znanymi podatnościami i powiadamia o potwierdzonych dopasowaniach. Zakres zależy od obsługiwanej technologii i dostępnych biuletynów.