Сканирование зависимостей (SCA)

SCA

Что это такое

Анализ состава программного обеспечения следит за пакетами, от которых зависит проект, — прямыми и транзитивными — и сообщает о тех, у кого есть известные уязвимости, сверяясь с базой рекомендаций. Он отвечает на вопрос «есть ли в этом дереве известная плохая версия?», который отличается от вопроса «безопасно ли написан этот код?». Он сообщает о подверженности; он ничего не исправляет.

Почему это важно

Большая часть кода в современном приложении написана кем-то другим и приходит транзитивно: вы устанавливаете библиотеку форм и получаете сорок пакетов, которых не выбирали. Уязвимость в любом из них — уязвимость в вашем продукте. Самые частые серьёзные случаи не экзотичны: старая библиотека разбора с недостатком отказа в обслуживании, инструмент сборки с рекомендацией о внедрении команд, зависимость зависимости, закреплённая три года назад. Сканеры делают это видимым на каждой сборке, а это единственный способ довести до исправления.

Ключевые идеи

Сканируйте разрешённое дерево, а не манифест

Манифест перечисляет то, что вы запросили; лок-файл хранит то, что вы получили, включая транзитивные пакеты, где живёт большинство рекомендаций. Сканируйте лок-файл в непрерывной интеграции, чтобы результат совпадал с развёрнутым.

На каждом пул-реквесте:  сканировать лок-файл, падать на высокой серьёзности
Ночью:                   пересканировать тот же лок-файл на новые рекомендации
Результат:               id рекомендации, пакет, установленная версия, исправленная

Ночное пересканирование важно, потому что рекомендации публикуются после того, как ваша зависимость была закреплена.

Сортируйте по достижимости, а не по количеству

Сто алертов без приоритизации не дают ни одного исправления. Спросите, вызывается ли уязвимая функция на самом деле, достижим ли путь кода из недоверенного ввода и существует ли исправленная версия.

Высокий  уязвимый парсер обрабатывает загруженные файлы, достижим из API
Низкий   инструмент времени сборки, только для разработки, не работает в продакшене
Нет      рекомендация касается возможности, которую проект не использует

Заведите путь исправления до того, как добавите сканер

Вывод бесполезен без политики: при высокой серьёзности с доступным исправлением патчите в заданный срок; где исправления нет, записывайте компенсирующий контроль и дату возврата к вопросу.

Считайте сканер одним сигналом среди нескольких

Он не видит ваш собственный код, конфигурацию или разграничение доступа. Пройденное сканирование означает «нет известных уязвимых версий зависимостей», и ничего больше.

Следите за цепочкой поставок, а не только за рекомендациями

Только что опубликованные пакеты, имена-опечатки и скомпрометированные аккаунты сопровождающих — ещё не рекомендации. Закрепляйте версии, проверяйте изменения лок-файла в пул-реквестах и будьте осторожны с пакетами, которыми никто не пользуется.

Практика

Просканируйте лок-файл и отсортируйте пять главных

Запустите сканирование разрешённого дерева зависимостей и классифицируйте пять находок наивысшей серьёзности по достижимости кода.

Готово, когда: у каждой из пяти есть суждение о достижимости, исправленная версия где она существует, и владелец.

Исправьте одну транзитивную зависимость

Возьмите находку, чьего пакета нет в вашем манифесте, закрепите или переопределите его до исправленной версии и подтвердите, что сборка и тесты всё ещё проходят.

Готово, когда: сканирование больше не сообщает эту рекомендацию, а приложение по-прежнему собирается и работает.

Частые ошибки

  • Сканирование только манифеста — транзитивные пакеты, где сидит большинство рекомендаций, пропущены; исправить: сканируйте разрешённый лок-файл.
  • Длинный нерасставленный список — никто по нему не действует; исправить: сортируйте по достижимости и серьёзности и задайте срок исправления.
  • Сканирование только на релизе — подверженность существует весь цикл разработки; исправить: запускайте на каждом пул-реквесте и ночью.
  • Убеждение, что сканирование означает безопасность приложения — оно не покрывает ни ваш код, ни конфигурацию; исправить: держите его одним из нескольких контролей.
  • Никогда не обновлять — исправленная версия существует и не берётся; исправить: планируйте регулярные обновления зависимостей, чтобы патчи стали рутиной, а не аварийной ситуацией.

Что читать дальше

  • Управление пакетами (npm) (02-frontend/04-package-management-npm) — читайте первым; лок-файл и разрешение версий, на которых держится это сканирование.
  • Управление секретами (07-security/03-secrets-management) — другой частый путь компрометации проекта извне.
  • Веб-безопасность (OWASP Top 10) (07-security/01-web-security-owasp-top-10) — недостатки в вашем собственном коде, которых не найдёт ни один сканер.
  • CI/CD (06-cloud-devops/08-ci-cd) — где запускается сканирование и где оно должно валить сборку.