Безопасная разработка: код-ревью, статический анализ, контроль зависимостей

Встраиваем проверки безопасности в процесс разработки: требования формулируются на этапе проектирования, код проходит ревью, конвейер сборки запускает статический анализ, зависимости проверяются на известные уязвимости. Работаем и со своими продуктами, и с командами заказчика — от аудита текущего процесса до его перестройки.

Коротко о задаче

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

При этом безопасность в разработке чаще всего существует как пожелание, а не как процесс. Требования к ней не формулируются в задачах. Ревью проводится на предмет читаемости кода, а не проверок ввода и прав доступа. Библиотеки подключаются и не обновляются годами, хотя в них давно закрыты известные проблемы. Секреты — пароли, ключи, строки подключения — лежат в репозитории, потому что так было быстрее на старте. Тестовая среда работает с копией боевой базы, включая настоящие персональные данные клиентов.

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

Мы делаем эти проверки частью конвейера, а не отдельным героическим усилием.

Что входит в услугу

  • Аудит текущего процесса

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

  • Требования безопасности при проектировании

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

  • Код-ревью

Проверка изменений по чек-листу: проверка ввода, параметризация запросов к базе, авторизация на уровне действия, а не только интерфейса, обработка ошибок без раскрытия деталей, отсутствие секретов в коде.

  • Статический анализ в конвейере

Автоматический разбор кода при каждом изменении с блокировкой сборки при находках заданного уровня. Проверка перестаёт зависеть от внимательности человека.

  • Контроль зависимостей

Регулярная сверка используемых библиотек с базами известных уязвимостей, регламент обновления, отслеживание версий, вышедших из поддержки.

  • Управление секретами

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

  • Разделение сред

Изоляция среды разработки, тестирования и эксплуатации. Обезличивание данных при переносе боевой базы в тестовую среду — отдельная и обязательная задача.

  • Безопасность аутентификации и API

Проверка механизмов входа, работы с токенами, ограничения частоты запросов, защиты от автоматизированного перебора, разграничения доступа в интерфейсах обмена. Смотрите {{ссылка: Интеграция систем и разработка API}}.

  • Автоматические тесты

Покрытие тестами сценариев, связанных с правами доступа и обработкой некорректного ввода. Проверка выполняется при каждом изменении.

  • Обучение команды

Разбор типовых ошибок на примерах из вашего же кода. Это работает лучше общих курсов.

  • Связка с валидацией

Для регулируемых отраслей процесс разработки предъявляется заказчику при оценке поставщика. Смотрите {{ссылка: Валидация компьютеризированных систем по GAMP 5}}.

Что это даёт заказчику

  • Дефекты ловятся раньше. Стоимость исправления отличается на порядки в зависимости от стадии.
  • Проверки не зависят от людей. Конвейер выполняет их при каждом изменении, независимо от загруженности команды.
  • Известные уязвимости не живут годами. Библиотеки отслеживаются, обновление стало регламентом.
  • Секреты не утекают вместе с кодом. Ключи вынесены из репозитория.
  • Персональные данные не размножаются по средам. Тестирование идёт на обезличенных данных.
  • Процесс можно предъявить. Заказчику из регулируемой отрасли есть что показать при оценке поставщика.

Как мы работаем

Начинаем с аудита процесса и с самых дешёвых мер: вынос секретов, обновление зависимостей с известными уязвимостями, обезличивание тестовых данных. Эти три пункта закрывают заметную часть риска за считанные дни.

Автоматические проверки вводим постепенно, начиная с предупреждений и переходя к блокировке. Конвейер, который в первый же день заблокировал всё, команда обойдёт, а не примет.

Обучение проводим на своём материале: разбор реальных находок в собственном коде убеждает сильнее абстрактных примеров.

Вредоносный код, эксплойты и инструменты для обхода защиты мы не разрабатываем ни в каком виде, включая учебные цели.

Наш опыт

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

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

На системах нашей разработки заказчики прошли более тридцати аудитов клиентов и более десяти проверок регуляторов.

Расскажите, как устроен процесс разработки у вас. Начнём с аудита и быстрых мер.

Давайте создавать вместе!

Свяжитесь с нами и мы проконсультируем по вопросам реализации IT-решений и найдем лучший подход к разработке

Контакты

Офис: г. Казань, ул. Островского, 57Б, оф. 110
Почта: info@nabla-lab.ru
Телефон: +7 (965) 595-62-78