Инструменты тестирования безопасности API: четыре категории
Сканеры
Проверяют наличие известных классов уязвимостей и ошибок конфигурации.
Широкий охват, но никакого понимания ваших бизнес-правил.
Прокси и перехватчики
Позволяют человеку изучать и подменять трафик.
Мощно и полностью зависит от того, кто за это берётся.
Фаззеры
Забрасывают эндпоинты некорректными данными в поисках сбоев.
Находят проблемы с устойчивостью и создают шум, который нужно разбирать.
Четвёртая — поведенческая проверка: отклоняет ли API то, что должен отклонять. Вызовы без аутентификации, доступ к чужим аккаунтам, границы ролей, просроченные токены. Ни один сканер этого не проверит, потому что всё это зависит от того, что в вашем продукте означает «разрешение».
Чего не хватает большинству команд
Обычно у команды есть сканер в пайплайне и тест на проникновение раз в год. Полезно и то и другое. Но ни то ни другое не проверяет, что эндпоинт, выкаченный в прошлый вторник, действительно контролирует авторизацию на уровне объектов, — а именно эту уязвимость в реальных API эксплуатируют чаще всего.
Причина, по которой это остаётся непроверенным, организационная, а не техническая. Выглядит как вопрос безопасности — значит, ждёт процесса безопасности, а тот запускается раз в квартал. На самом деле это поведенческая проверка, и её место в наборе тестов, который прогоняется на каждое изменение.
Как понять, какой пробел у вас
Вспомните ли вы, когда в последний раз кто-то проверял, что пользователь A не может прочитать данные пользователя B? Если ответ — «на ежегодном тесте на проникновение», то у самой вероятной вашей уязвимости есть окно в двенадцать месяцев.
Получает ли новый эндпоинт проверку прав доступа автоматически? Если это зависит от того, вспомнит ли автор, её пропустят.
Находки сканера разбираются или накапливаются? Сканер, отчёты которого никто не читает, хуже, чем его отсутствие: он создаёт видимость покрытия.
Как закрыть поведенческий пробел
Сгенерированные планы для API включают категории авторизации и граничных значений, поэтому проверки прав существуют рядом с функциональным покрытием, а не отдельным мероприятием. Это переводит их в ритм «на каждое изменение» — единственный ритм, который успевает за новыми эндпоинтами.
Терминал
npm install -g @testsprite/testsprite-cli
testsprite setup
Ту же настройку можно выполнить в панели TestSprite, если вы предпочитаете ничего не устанавливать локально. Остальные возможности CLI описаны в репозитории CLI.
Как это устроено — в документации по тестированию API.
Разбор находок, или почему сканер перестал что-либо значить
Сканеры отказывают одним и тем же характерным образом: они продолжают работать, а читать их все перестают. В этом стоит разобраться, потому что проблема не в инструменте.
Первый запуск выдаёт длинный список, значительная часть которого к вам не относится. Разбирать его некогда, поэтому его просматривают по диагонали. Следующий запуск выдаёт тот же список плюс два новых пункта, которых не видно в уже существующем шуме. За квартал отчёт превращается в артефакт, который генерируется и уходит в архив, и настоящая находка может пролежать в нём год.
Решение неэффектное: один раз как следует разобрать первый список и заглушить неприменимое, письменно указав причину. После этого отчёт показывает только то, что изменилось, — а такое люди действительно читают. Сканер без разбора находок хуже, чем его отсутствие, потому что создаёт видимость покрытия.
Что и где запускать
Поведенческие проверки — на каждый пул-реквест. Сканеры — по расписанию. Прокси и фаззеры — в руках того, кто ведёт целенаправленную работу. Тест на проникновение — когда меняется модель угроз, а не когда подошёл срок по календарю.
Если пайплайн принадлежит другой команде, то GitHub App — путь наименьшего сопротивления: это вебхук, он ничего не меняет в вашем репозитории и срабатывает, когда ваша сборка сообщает, что новая версия развёрнута. Если же вы хотите видеть проверку прямо в репозитории, с этим справится шаг GitHub Actions .
Что TestSprite даёт в четвёртой категории
Поведенческая проверка: отклоняет ли API то, что должен отклонять. Сгенерированные планы включают категории авторизации и граничных значений, поэтому каждый эндпоинт проверяется на доступ без аутентификации, чтение данных чужих аккаунтов, границы ролей и просроченные учётные данные — при каждом изменении.
Работа идёт с запущенным сервисом через его интерфейс: что именно существует, определяется по проходу обнаружения и вашей спецификации. Auto-Authentication поддерживает сессии живыми на протяжении прогона, Dynamic Variables переносят значения между вызовами, Dependency Chains выводят порядок выполнения из того, что каждому кейсу нужно и что он производит, а Auto-Cleanup удаляет ровно то, что прогон создал.
Выигрыш в том, что авторизация на уровне объектов перестаёт зависеть от того, вспомнит ли о ней кто-нибудь. Ваш сканер по-прежнему занимается зависимостями и классами инъекций, тест на проникновение — творческими злоупотреблениями, а категория между ними перестаёт быть ничьей зоной ответственности.
Является ли TestSprite инструментом тестирования безопасности API?
Он закрывает поведенческую категорию: авторизацию, границы ролей, граничные значения и корректность обработки ошибок. Это не сканер, и он не ищет классы уязвимостей.
Нужен ли нам при этом сканер?
Да. Уязвимости в зависимостях и классы инъекций реальны, и сканер здесь — правильный инструмент. Эти категории дополняют друг друга.
Что такое авторизация на уровне объектов?
Это про то, может ли один пользователь получить доступ к записи другого, изменив идентификатор. Самая частая серьёзная уязвимость API и одна из самых простых в проверке.
Как избавиться от шума сканера?
Разбирать находки по расписанию и заглушать их с указанием причины. Неразобранный бэклог неотличим от отсутствия сканера.
Можно ли запускать поведенческие проверки на продакшене?
Обычно правильный ответ — репрезентативное окружение. Создавать и удалять записи в продакшене ради проверки прав — это отдельный риск.
Самая дешёвая категория обычно и есть та, которой не хватает.
Инструменты тестирования безопасности API делятся на сканеры, прокси, фаззеры и поведенческую проверку. У большинства команд есть первое и нет последнего — а именно там живёт авторизация на уровне объектов. Переведите её в ритм «на каждое изменение», а сканер оставьте на расписании.