В середине мая 2026 года стало известно о критической ошибке в эталонной реализации Python - CPython. Уязвимость, получившая идентификатор CVE-2026-8328, затрагивает механизм работы с FTP-соединениями и может позволить злоумышленнику организовать SSRF-атаку (Server-Side Request Forgery - подделку запроса на стороне сервера). Эта угроза непосредственно касается разработчиков, которые используют стандартную библиотеку ftplib в своих проектах, а также администраторов серверов, где выполняются скрипты на Python.
Уязвимость CVE-2026-8328
Проблема была обнаружена не сегодня - она берёт начало из неполного исправления более ранней уязвимости CVE-2021-4189. Тогда, три года назад, разработчики CPython закрыли дыру в функции makepasv(), отвечающей за установку пассивного режима FTP. Суть патча заключалась в том, что вместо слепого доверия IP-адресу, который сервер возвращает в ответе на команду PASV, функция стала использовать реальный адрес удалённого узла (полученный через вызов getpeername()[0]). Однако, как выяснилось теперь, исправление было проведено не полностью. Вторая функция - ftpcp(), предназначенная для копирования файлов между FTP-серверами, - осталась в исходном, уязвимом состоянии. Она продолжает напрямую вызывать parse227() и передавать необработанный IP-адрес и порт, управляемые атакующим, в target.sendport().
Проще говоря, если злоумышленник контролирует один из FTP-серверов, с которым взаимодействует приложение, он может в ответе на команду PASV указать произвольный адрес. В результате ftpcp() попытается установить соединение с этим адресом, открывая возможность для SSRF. При такой атаке сервер, выполняющий код на Python, может быть использован для сканирования внутренней сети, доступа к облачным метаданным (например, в AWS или Azure) или подключения к другим закрытым сервисам, которые недоступны напрямую из интернета.
Степень серьёзности уязвимости оценена как средняя - по шкале CVSS 4.0 она получила 5,9 балла. Вектор атаки выглядит так: для эксплуатации требуется сетевая доступность, низкая сложность атаки, но при этом необходимо, чтобы атакующий мог выступать в роли FTP-сервера или контролировать его. Для жертвы атака требует взаимодействия (человек должен запустить скрипт, использующий ftpcp()). Если эти условия соблюдены, злоумышленник может получить высокое влияние на целостность данных - то есть возможность изменять информацию на удалённых системах или записывать произвольные данные.
Согласно бюллетеню безопасности Python, опубликованному 13 мая 2026 года, уязвимость затрагивает все версии CPython до 3.15.0. Именно в версии 3.15.0 была выпущена окончательная заплатка, которая исправляет ftpcp() аналогично тому, как ранее исправили makepasv(). Таким образом, все пользователи CPython, работающие на версиях 3.14.x или более ранних, находятся в зоне риска.
Важно отметить, что сама по себе уязвимость не позволяет напрямую получить доступ к серверу или выполнить произвольный код. Однако её опасность заключается в потенциале для разведки и движения внутри сети. Например, имея SSRF, атакующий может заставить доверенный внутренний сервер обратиться к API управления облаком и получить временные ключи доступа. Или же он может просканировать закрытую сеть на предмет работающих служб и собрать информацию для последующей атаки.
Разработчикам и системным администраторам рекомендуется как можно скорее обновить CPython до версии 3.15.0 или выше. Если по каким-то причинам обновление невозможно на данный момент, следует временно отказаться от использования функции ftpcp() в ftplib или полностью исключить применение библиотеки с внешними FTP-серверами, которые не являются надёжными. Также в качестве временной меры можно переопределить поведение ftpcp(), добавив проверку адреса, аналогичную той, что реализована в makepasv(), но это требует написания дополнительного кода и несёт риск ошибок.
Особого внимания заслуживает тот факт, что ошибка возникла из-за неполного исправления предшествующей уязвимости. Подобные случаи - распространённая проблема при исправлении безопасности: очень легко упустить родственную функцию, особенно если кодовая база большая. Это напоминание о необходимости тщательного анализа всех зависимостей и "братских" функций при выпуске патчей.
В целом же CVE-2026-8328 является хорошим поводом пересмотреть используемые в проектах библиотеки для работы с FTP. Многие современные решения уже переходят на SFTP или FTPS, но наследие в виде обычного FTP с PASV всё ещё живёт в автоматизации и интеграциях. Лучшая защита - свести к минимуму использование устаревших протоколов и тщательно контролировать входящие данные от серверов, особенно если они находятся за пределами доверенной зоны.
Подводя итог, уязвимость в ftpcp() подтверждает, что даже устоявшиеся и широко используемые библиотеки могут содержать скрытые угрозы. Патч для CPython уже выпущен, и его установка - единственный надёжный способ обезопасить инфраструктуру. Не стоит откладывать обновление, ведь SSRF-атаки всё чаще становятся частью сложных цепочек взломов, которые ведут к утечкам данных и компрометации систем.
_Дополнительные материалы: бюллетень безопасности Python с хэшем ITF2BAPBQEPYK3LDMPRSY435JGNHYNDP, а также страница CVE-2026-8328 на сайте cve.org._
Ссылки
- https://www.cve.org/CVERecord?id=CVE-2026-8328
- https://mail.python.org/archives/list/security-announce@python.org/thread/ITF2BAPBQEPYK3LDMPRSY435JGNHYNDP/
- https://github.com/python/cpython/issues/87451
- https://github.com/python/cpython/pull/149648