requirements.txt: Основний інструмент чи прихована загроза?
У кожному проекті Python це є. Той невинний на вигляд requirements.txt розташований у корені вашого репозиторію, файл pip install requirements.txt consumes, звичайно, це список залежностей, але якщо ви не будете обережні, це також може бути широко відчиненими дверима до нестабільних збірок, вразливих пакетів та серйозних проблем безпеки.
В основі вимоги.txt контролює, які сторонні пакети завантажує ваша програма. Під час запуску pip install -r requirements.txt, менеджер пакетів Python встановлює кожну перелічену залежність. Але ось у чому загвоздка: якщо ви не закріпите точні версії, ви довіра до PyPI завжди надавати безпечну, сумісну та незмінену версію. Сучасна AppSec працює не так.
Без закріплення збірки можуть ламатися. Гірше того, ваша програма може несвідомо використовувати шкідливі пакети. Відкрите версії (Колба >=1.0, наприклад) або обмеження вільної версії (django~=3.2) є благодатним ґрунтом для впровадження небезпечного коду. Ось чому правильне управління вимоги.txt є основним завданням безпеки.
Де заморожування pip та вимоги до встановлення pip.txt Розбивка
заморозка піп зручно, але також небезпечно, якщо використовувати без розуміння того, що воно фіксує. Розробники часто генерують вимоги.txt використання Вимоги до заморожування pip.txt, очікуючи, що це заблокує їхнє середовище. Але freeze не перевіряє безпеку чи походження залежностей; він просто видаляє все, що наразі встановлено, включаючи транзитивні та потенційно застарілі пакети.
А тепер уявіть, що ваш товариш по команді або довірчий інженер біжить навмання. pip install -r requirements.txtЯкщо цей файл містить застарілі, вразливі або навіть пакети з помилками, ви щойно автоматизували інцидент безпеки.
Швидкий приклад:
⚠️ Небезпечний приклад, не використовуйте у продакшені
Тепер додайте це до свого CI pipeline:
Ви довіряєте, що середовище відтворюване, що в PyPI нічого не змінилося, і що кожна залежність все ще безпечний. Це величезне припущення, якщо покладатися на Вимоги до заморожування pip.txt робочі процеси.
Реальні загрози AppSec: помилки при накладанні опечаток та плутанина із залежностями у файлі requirements.txt
Зловмисники люблять екосистеми з відкритим кодом. Чому? Тому що розробники часто покладаються на налаштування за замовчуванням та неявну довіру. Ось як вони атакують, використовуючи вимоги.txt:
- ТипоскватінгЗавантаження шкідливого пакета з назвою типу запити замість запитівОдин персонаж відсутній, і ваша збірка стає вашою.
запити # ⚠️ Ілюстративний приклад, не реальний пакет для встановлення
- Плутанина із залежностямиЯкщо ваш внутрішній пакет не закріплений або не обмежений приватною областю видимості, зловмисники можуть опублікувати шкідливу версію в PyPI з тим самим ім'ям. Якщо ваша неперервна інтеграція не перевіряє вихідні коди, ви встановите їхній пакет замість свого.
Обидві атаки використовують відсутність суворого закріплення та контролю за версіями в вимоги.txtЯкщо ваш просто каже some-internal-lib, і ти біжиш Вимоги до встановлення pip.txt у CI він може отримати неправильний пакет з неправильного місця.
Захист requirements.txt у CI/CD Pipelineз хешами та закріпленням
Ось як загартуватися вимоги.txt проти реальних загроз:
- Закріпити точні версії: Завжди використовуйте == для кожної вашої упаковки вимоги.txtБез підстановочних символів, без діапазонів.
- Скористайтеся кнопкою –require-хешіЦе робить pip install -r requirements.txt перевірити цілісність кожного завантаженого пакета.
приклад:
⚠️ Демонстративний приклад, замініть реальним хешем у реальних проектах
- Ізолюйте свої збіркиЗавжди створюйте в чистих, мінімальних контейнерах. Ніколи не довіряйте базовому образу сліпо.
- Використовуйте приватний індекс PyPIРозміщуйте власний проксі/кеш та дзеркалюйте лише перевірені пакети.
Запуск сканування залежностейІнтегруйте такі інструменти, як pip-аудит або використовувати SBOMаналіз на основі вашого pipelines.
Приклад фрагмента коду дій GitHub:
⚠️ Освітній pipeline наприклад, адаптуватися до свого середовища
Суворе поводження з pip install -r requirements.txt in CI/CD є одним із найпростіших способів зменшити ризик відкритого коду.
Відтворювані збірки: забезпечення їхньої стабільності в різних середовищах
Якщо ваш додаток працює локально, але не працює під час проміжної або пробної версії, несумісні залежності в вимоги.txt є звичайними підозрюваними. Навіть невеликий дрейф версії спричиняє великі проблеми.
Використовуйте ці стратегії:
- pip-інструменти: Використовуйте pip-компіляція генерувати вимоги.txt від вимоги.inВін вирішує залежності за допомогою належного закріплення.
- Маркери середовищаДля пакетів, специфічних для ОС, або залежностей, специфічних для версії Python, використовуйте такі маркери, як platform_system == 'Linux'.
- Кешування DockerУ CI кешуйте шари Docker після встановлення залежностей з вимоги.txt щоб зменшити варіабельність збірки.
Приклад з pip-інструментами:
⚠️ Демонстративний приклад, фактичний результат залежить від вашого середовища
Вихідний сигнал повністю закріплений вимоги.txt.
Такі інструменти, як заморозка піп, при поєднанні з pip install -r requirements.txt під час будівництва вимагають дисципліни та додаткових запобіжних заходів.
Висновок: Впевнене блокування ваших вимог
Неправильне управління вимоги.txt це не просто погана практика; це активний ризик для безпеки. Нечітке закріплення, неперевірені встановлення та сліпа довіра до відкритих реєстрів – ось як зловмисники використовують ваші CI/CD pipelineЦе не теоретичні недоліки; вони використовуються щодня.
Закріплення залежностей – це більше, ніж просто найкраща практика. Це ваша перша лінія захисту від атак ланцюга поставок у Python. Поєднайте це з –require-хеші, створювати ізоляцію та відтворювані інструменти, такі як pip-інструменти, і ви отримаєте a pipeline так важче йти на компроміс.
Незалежно від того, чи використовуєте ви Вимоги до встановлення pip.txt локально або в непреривчастій інтеграції, завжди перевіряйте та контролюйте вміст ваших збірок. Такі інструменти, як Ксігені забезпечити прозорість, дотримання політик та автоматизовані перевірки, які блокують ваш ланцюжок поставок Python від Вимоги до заморожування pip.txt протягом усього виробництва.





