DAST в SSDLC: как встроить динамические проверки без тормозов

📋 Кратко

DAST проверяет не исходный код, а поведение работающего приложения по HTTP. Он видит ошибки настройки веб-сервера, прокси и доступа, которые могут остаться незаметными для SAST и SCA. В статье разбираем место DAST в SSDLC, безопасное сканирование, роли пользователей, API, пороги конвейера и ручную проверку находок.

⏱ 8 минут чтения│сложность

Динамическое тестирование безопасности приложений, или DAST, проверяет работающий сервис. Сканер отправляет запросы и изучает ответы. Такой подход показывает, что видит внешний пользователь.

Одна зелёная задача в конвейере ещё не доказывает безопасность. Сканер мог не пройти авторизацию. Он мог не дойти до важного раздела. Поэтому DAST требует настройки области проверки, ролей и сценариев.

Главная мысль: DAST не заменяет другие проверки. Он дополняет анализ кода, зависимостей и настроек. Его задача — проверить приложение таким, каким оно работает после развёртывания.
DAST видит только доступное внешнее поведение
DAST видит только доступное внешнее поведение

🔍 Что именно проверяет DAST

DAST смотрит на приложение снаружи. Он оценивает ответы по HTTP и признаки возможной эксплуатации. Такой тест показывает поведение веб-сервера, прокси и самого приложения.

Разные методы отвечают за разные уровни защиты
Разные методы отвечают за разные уровни защиты

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

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

Что сделать сейчас: составьте список внешних адресов, маршрутов и ролей. Отдельно отметьте функции, которые доступны только после входа.

🧩 Место DAST среди методов SSDLC

SSDLC объединяет проверки на всём жизненном цикле разработки. SAST анализирует исходный код. Он ищет опасные операции и пути передачи данных.

Безопасный стенд раскрывает реальные границы проверки
Безопасный стенд раскрывает реальные границы проверки

SCA проверяет компоненты и зависимости. Для этого нужен состав программного обеспечения. Достижимость уязвимой функции зависит от возможностей конкретного инструмента и языка.

DAST смотрит на итоговую систему. Он видит, как приложение настроено и развёрнуто. WAF анализирует запросы в рабочей среде и может блокировать признаки атаки.

WAF при этом не устраняет уязвимость. Его блокировка также не доказывает, что дефекта нет. DAST даёт другой результат: для подтверждённой находки он прикладывает запрос и ответ.

Правило распределения задач: SAST отвечает за код, SCA — за компоненты, DAST — за поведение работающего сервиса. WAF снижает риск атак, но не заменяет исправление причины.

Что сделать сейчас: закрепите за каждым методом отдельный результат. Не закрывайте задачу DAST отчётом SAST или срабатыванием WAF.

⚙️ Почему сканирование иногда не находит проблему

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

Подтверждённые риски должны останавливать выпуск
Подтверждённые риски должны останавливать выпуск

Причина часто связана с навигацией. Сервис может скрывать функции за входом. API может требовать отдельную схему запросов. Важный путь может открываться только после определённого действия.

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

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

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

🛠️ Как подготовить тестовый контур

DAST запускают после развёртывания приложения в отдельной среде интеграционного тестирования. Такой контур должен повторять важные настройки будущей системы. Иначе тест покажет не тот результат.

Безопасный стенд изолируют от настоящих пользователей и рабочих данных. Для проверки используют тестовые записи. Разрушительные действия в сценариях запрещают.

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

Перед запуском определяют границы теста. В список входят разрешённые адреса и методы. Всё остальное исключают из области сканирования.

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

Что сделать сейчас: заведите отдельный тестовый контур и проверьте его изоляцию. До первого запуска удалите из него реальные секреты и пользовательские данные.

🔐 Как настроить авторизованную проверку

Открытое сканирование показывает только публичную часть приложения. Для полноценной проверки нужны сценарии входа и разные права. Минимальный набор ролей включает пользователя, оператора и администратора.

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

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

Особое внимание уделяют управлению сессиями. Проверяют вход, выход и сохранение прав. Также смотрят, не остаётся ли доступ после смены состояния учётной записи.

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

Что сделать сейчас: подготовьте три тестовые роли и отдельные сценарии входа. В отчёте указывайте роль, с которой получена каждая находка.

🌐 Что проверять в веб-приложении и API

DAST должен охватывать не только страницы. Современное приложение часто состоит из интерфейса и API. Поэтому в область теста включают REST и GraphQL API.

Для API задают допустимые методы и форматы запросов. Проверяют обработку ошибок и ответы на некорректные данные. Отдельно смотрят на контроль доступа между ролями.

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

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

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

В результате по HTTP стали доступны .env и каталог .git. В ответе .env находились параметры базы и секретный ключ. Такой дефект находится в конфигурации развёртывания, а не обязательно в исходном коде приложения.

Что сделать сейчас: включите в DAST веб-маршруты, REST и GraphQL API. Проверьте служебные пути, обработку ошибок и доступ к файлам вне каталога сборки.

📋 Как распределить проверки по этапам

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

Для каждого изменения используют быстрое базовое сканирование. Оно проверяет заранее выбранные маршруты и ключевые сценарии. Такой запуск даёт ранний сигнал без полного обхода приложения.

Полную проверку выполняют по расписанию. Она охватывает больше функций и ролей. Её также запускают перед выпуском в отдельном тестовом контуре.

После публикации периодическая проверка показывает состояние уже работающего сервиса. Она нужна потому, что настройки веб-сервера и прокси могут измениться отдельно от кода.

В конвейере важно сохранять историю результатов. Команда видит новые находки и повторяющиеся записи. Это помогает не тратить время на один и тот же дефект.

Что сделать сейчас: разделите запуск на быстрый для каждого изменения и полный по расписанию. Для каждого режима укажите набор маршрутов и ожидаемое время выполнения.

🚦 Как настроить пороги остановки конвейера

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

Подтверждённые критические и высокие риски блокируют выпуск. Средние и низкие находки направляют на ручную проверку. Такой порядок отделяет срочные проблемы от задач для плановой работы.

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

Повторяющиеся записи подавляют после проверки. Для каждой находки назначают владельца. Также фиксируют срок исправления и результат повторного теста.

В государственных системах действует отдельное требование по срокам. С 1 марта 2026 года критическую уязвимость нужно устранять за 24 часа. Для уязвимости высокого уровня установлен срок семь дней.

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

Что сделать сейчас: запишите правила остановки конвейера до первого запуска. Добавьте обязательное подтверждение находки перед блокировкой релиза.

🔬 Как разбирать реальные находки DAST

Сильная сторона DAST — связь с работающей системой. Подтверждённая находка содержит запрос и ответ. Разработчик может воспроизвести поведение без поиска причины только по описанию.

Но причина часто находится за пределами кода. Ошибка может появиться в настройке веб-сервера, прокси или доступа. Поэтому исправление проверяют повторным запросом после изменения.

Показателен сценарий с приложением на SPA и API. Код использует параметризованные запросы. Пароли хешируются. Зависимости обновлены. SAST и SCA не показывают проблем.

При этом неверный корневой каталог в Caddy открывает .env и .git. DAST видит такой результат по HTTP. Анализ исходного кода приложения мог не показать ошибку настройки.

Другой пример связан с готовым корпоративным ПО. Когда исходников нет, SAST недоступен. Состав компонентов также может быть неизвестен. Внешняя проверка тогда остаётся способом увидеть поведение сервиса по HTTP.

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

Что сделать сейчас: для каждой находки сохраните запрос, ответ, роль и адрес. После исправления повторите тот же сценарий и сравните результат.

✅ Чек-лист внедрения без тормозов

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

Проверьте, что стенд изолирован. Используйте тестовые данные. Ограничьте частоту запросов. Запретите действия, которые могут удалить или изменить реальные данные.

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

Включите веб-приложение, REST и GraphQL API. Добавьте проверки контроля доступа, сессий, инъекций, ошибок и конфигурации. Отдельно проверьте служебные файлы и пути.

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

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

  • Составьте карту адресов и ролей.
  • Подготовьте изолированный тестовый контур.
  • Настройте авторизованные сценарии.
  • Проверьте веб-приложение и API.
  • Ограничьте частоту запросов.
  • Запретите разрушительные действия.
  • Сохраните запросы и ответы.
  • Настройте подавление повторов.
  • Назначьте владельцев и сроки.
  • Повторяйте тест после исправления.

DAST не ускоряет выпуск сам по себе. Скорость появляется после настройки области, ролей и правил. Тогда команда получает короткий сигнал на каждом изменении и глубокую проверку по расписанию.

Что сделать сейчас: начните с одного сервиса и оформите этот чек-лист как задачу конвейера. Затем сравните время запуска, покрытие и число подтверждённых находок.

📚 Читайте также

📖 Термины

API · CI/CD · Devsecops · WAF

🔗 Источники