Какие существуют типы инструментов для автоматизированного тестирования безопасности (SAST, DAST и др.)?

«Какие существуют типы инструментов для автоматизированного тестирования безопасности (SAST, DAST и др.)?» — вопрос из категории Тестирование безопасности, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Автоматизированное тестирование безопасности включает несколько взаимодополняющих подходов:

Тип (Аббревиатура) Что анализирует Когда выполняется Примеры инструментов
Статический анализ (SAST) Исходный код, байт-код. На этапе разработки ("слева" в CI/CD). SonarQube, Checkmarx, Fortify, Semgrep.
Динамический анализ (DAST) Работающее приложение через его интерфейсы. На тестовом стенде или в production. OWASP ZAP, Burp Suite, Acunetix.
Интерактивный анализ (IAST) Код приложения во время его работы (инструментирование). Во время тестов (DAST или ручных). Contrast Security, Seeker.
Анализ зависимостей (SCA) Сторонние библиотеки и компоненты. На этапе сборки. Snyk, WhiteSource, Dependency-Check.
Фаззинг (Fuzz Testing) Приложение путем отправки невалидных/случайных данных. В процессе тестирования. AFL, libFuzzer, Jazzer.

Почему нужна комбинация?

  • SAST находит уязвимости в коде до запуска, но может давать ложные срабатывания.
  • DAST находит реальные уязвимости в развернутом приложении, но не указывает на строку кода.
  • SCA критически важен из-за повсеместного использования сторонних библиотек.

Пример уязвимости, которую найдет SAST (SQL-инъекция):

// Уязвимый код
String query = "SELECT * FROM users WHERE login = '" + userInput + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query); // Риск!

// Защищенный код (использование PreparedStatement)
String query = "SELECT * FROM users WHERE login = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setString(1, userInput); // Данные экранируются автоматически
ResultSet rs = stmt.executeQuery();