Главный реестр пакетов Python (PyPI) объявил о введении новых ограничений для предотвращения атак, эксплуатирующих различия в обработке ZIP-архивов установщиками пакетов. Эти меры направлены на устранение уязвимостей, обнаруженных в инструментах вроде установщика "uv", поведение которого при распаковке отличается от Python-установщиков, использующих стандартный модуль "zipfile".
Проблема исторической сложности ZIP
Инициатива PyPI затрагивает фундаментальную сложность формата ZIP, созданного в 1989 году для работы с большими архивами, распределёнными по нескольким носителям. Ключевая особенность - возможность дописывать записи без полной перезаписи архива - создаёт неоднозначности при извлечении файлов. Python-пакеты (wheel-дистрибутивы) технически являются ZIP-архивами, но их обработка оставлена на усмотрение разработчиков установщиков, несмотря на наличие спецификации Binary Distribution Format.
Особую озабоченность вызывает файл "RECORD" в каталоге ".dist-info" дистрибутива. Он содержит список файлов с опциональными контрольными суммами, и установщики должны сверять содержимое архива с этими данными, прерывая установку при несовпадении. Однако многие установщики пропускают проверку, просто извлекая файлы как обычный "unzip" и модифицируя "RECORD" постфактум для поддержки удаления пакетов. Эта практика исторически позволяла использовать нестандартные ZIP-архивы без последствий, создавая риски, когда злоумышленники могли "протащить" вредоносные файлы, эксплуатируя различия парсеров.
Новые защитные механизмы PyPI
Для противодействия PyPI внедряет строгие проверки при загрузке wheel-пакетов и ZIP-архивов. Архивы будут отклоняться при обнаружении:
- Невалидной структуры записей;
- Дублирующихся имён файлов в локальном заголовке и Central Directory;
- Несоответствия между заголовками;
- Наличия данных после End of Central Directory;
- Множественных End of Central Directory;
- Некорректных значений локаторов.
Эти шаги гарантируют, что извлечение файлов всегда ориентируется на Central Directory - рекомендуемую практику для предотвращения атак, основанных на различиях интерпретации локальных и центральных заголовков. Дополнительную защиту обеспечивает уже действующая система детектирования "компрессионных бомб" (архивов, разработанных для исчерпания ресурсов при распаковке).
Поэтапное ужесточение правил
Сейчас разработчики получают email-предупреждения при загрузке wheel-пакетов, где содержимое ZIP не соответствует метаданным в "RECORD". После шестимесячного переходного периода, 1 февраля 2026 года, такие загрузки будут полностью блокироваться. Такой подход стимулирует сообщество адаптироваться и побуждает разработчиков установщиков внедрить перекрёстную проверку "RECORD", аналогичную надёжной обработке ZIP в модуле CPython "zipfile".
Анализ топ-15 000 пакетов по количеству загрузок показал минимальное влияние нововведений: из 13 468 проектов, публикующих wheel-дистрибутивы, у 13 460 не выявлено проблем с "RECORD" или ZIP. Лишь единичные случаи демонстрировали отсутствующие файлы, несовпадения или дубликаты. Эта статистика указывает на низкий риск массовых сбоев, хотя редкие проблемы могут встречаться за пределами популярных пакетов.
Рекомендации для сообщества
PyPI подчёркивает, что пользователям не требуется срочных действий благодаря введённым мерам, но советует поддерживать установщики в актуальном состоянии для максимальной безопасности. Разработчикам пакетов, столкнувшимся с ошибками загрузки, следует оптимизировать процессы сборки или сообщать о проблемах в инструменты. Создателям установщиков настоятельно рекомендуется:
- Строго соблюдать стандарты ZIP;
- Приоритезировать проверку Central Directory;
- Внедрить обязательную валидацию "RECORD" для генерации предупреждений о битых wheel-файлах.
Эти меры коллективно укрепляют экосистему Python-пакетов против эволюционирующих угроз, связанных с ZIP-архивами, продвигая стандартизацию и устойчивость инфраструктуры. Отсутствие доказательств эксплуатации уязвимостей на PyPI до внедрения защиты подчёркивает превентивный характер данных изменений.