Практика
Безопасность API: уязвимости и защита
Безопасность API по OWASP API Security Top 10 2023: типичные уязвимости, как их проверить и закрыть, чек-лист перед релизом и когда нужен пентест API.
Коротко. Безопасность API — это набор мер, которые не дают чужому клиенту, скрипту или партнёру получить через программный интерфейс больше данных и действий, чем ему положено. Большинство проблем API не в шифровании, а в логике: сервер не проверяет, принадлежит ли запрошенный объект пользователю, отдаёт лишние поля, не ограничивает частоту запросов и забывает про старые версии. Карта типичных уязвимостей — OWASP API Security Top 10 в редакции 2023 года. Закрываются они проверкой прав на каждый объект на стороне сервера, короткоживущими токенами, схемой ответа с явным списком полей, лимитами, учётом всех версий API и регулярным тестированием — в сборке и вручную.
Статья для руководителя разработки, CTO или владельца продукта с мобильным приложением, личным кабинетом или интеграциями с партнёрами, которому нужно понять, что проверить в своём API и что потребовать от команды.
Почему безопасность API — отдельная тема
Веб-сайт показывает пользователю ровно то, что нарисовал интерфейс. API отдаёт всё, что умеет сервер, любому, кто может отправить HTTP-запрос: мобильному приложению, фронтенду, партнёрской системе — и злоумышленнику, который узнал адреса методов из того же мобильного приложения. Интерфейс может прятать кнопку «Удалить», но если сервер не проверяет роль, метод удаления доступен всем.
Три особенности, из-за которых API уязвимее обычных страниц:
- Логика вместо шаблонов. Классические сканеры хорошо ищут устаревшие библиотеки и типовые ошибки конфигурации, но не понимают, что пользователь №1 не должен видеть заказ пользователя №2. Такие ошибки находит только ручная проверка или тесты, написанные под бизнес-правила.
- Много клиентов — много версий. Старое мобильное приложение продолжает ходить в первую версию API, которую «давно не поддерживают», но не выключили. Защиту добавили во вторую версию, а старый метод остался открытым.
- Невидимость. Методы API не индексируются поисковиками и не видны в карте сайта, поэтому их часто забывают включить в пентест и мониторинг. Команда может просто не знать полного списка.
OWASP API Security Top 10 2023: десять типичных уязвимостей
OWASP (Open Worldwide Application Security Project) ведёт отдельный список рисков для API. Актуальная редакция — 2023 года. Это карта приоритетов: с чего начать проверку и о чём спросить разработчиков.
| № | Категория OWASP | Что это простыми словами | Как закрыть |
|---|---|---|---|
| API1 | Broken Object Level Authorization — нарушение авторизации на уровне объекта | Пользователь получает чужой объект, подставив его идентификатор | В каждом методе проверять на сервере, что объект принадлежит пользователю или разрешён его роли |
| API2 | Broken Authentication — ошибки аутентификации | Слабый вход, бессрочные токены, нет защиты от перебора | Стандартные протоколы OAuth 2.0 и OpenID Connect, короткий срок жизни токенов, лимиты на вход |
| API3 | Broken Object Property Level Authorization — авторизация на уровне свойств | API отдаёт лишние поля или позволяет изменить поле, которое менять нельзя: роль, баланс | Явные схемы ответа и запроса со списком разрешённых полей для чтения и записи |
| API4 | Unrestricted Resource Consumption — неограниченное потребление ресурсов | Запросы без лимитов перегружают сервер или расходуют платные сервисы: SMS, AI-модели | Лимиты частоты, размера запроса и пагинации, таймауты, бюджеты на внешние сервисы |
| API5 | Broken Function Level Authorization — авторизация на уровне функций | Обычный пользователь вызывает административный метод | Проверка роли на сервере для каждого метода, запрет по умолчанию |
| API6 | Unrestricted Access to Sensitive Business Flows — доступ к чувствительным бизнес-процессам | Автоматизированная скупка, бронирование, регистрация, промокоды в ущерб бизнесу | Лимиты на пользователя и устройство, антибот-меры, мониторинг аномалий |
| API7 | Server Side Request Forgery — подделка запросов со стороны сервера | Сервер по просьбе клиента обращается к внутренним адресам | Список разрешённых адресов назначения, запрет внутренних сетей, отдельный сегмент |
| API8 | Security Misconfiguration — ошибки конфигурации | Подробные ошибки, открытый CORS, нет TLS, лишние HTTP-методы | Жёсткая базовая конфигурация, единый шлюз, заголовки безопасности |
| API9 | Improper Inventory Management — неучтённые API | Старые версии, тестовые стенды, недокументированные методы | Реестр всех API и версий, спецификация OpenAPI, вывод из эксплуатации по плану |
| API10 | Unsafe Consumption of APIs — небезопасное использование чужих API | Сервис доверяет данным партнёрского API без проверки | Валидация данных от партнёров, TLS, таймауты, ограничение перенаправлений |
Три категории из первой пятёрки — API1, API3 и API5 — посвящены авторизации. В API ошибки доступа — центральный класс проблем, и именно их хуже всего видят автоматические инструменты.
Авторизация: главное, что нужно закрыть
Проверка владения объектом на каждом запросе
Правило одно: сервер не доверяет идентификатору из запроса. Если клиент просит заказ, счёт или документ, сервер сам проверяет, что этот объект принадлежит текущему пользователю или его организации. Проверка делается централизованно — в слое доступа к данным или в общей политике доступа, а не вручную в каждом контроллере, где её рано или поздно забудут. Непредсказуемые идентификаторы (UUID вместо порядковых номеров) усложняют перебор, но не заменяют проверку.
Только нужные поля — на чтение и на запись
Ответ API формируется по явной схеме, а не сериализацией всего объекта из базы. Иначе вместе с именем клиента уйдут хеш пароля, внутренние заметки менеджеров и служебные признаки. На запись действует тот же принцип: сервер принимает только разрешённые поля и игнорирует остальные, чтобы пользователь не мог поменять себе роль или баланс в запросе на обновление профиля.
Роли и функции: запрет по умолчанию
Административные методы проверяют роль на сервере, даже если «в приложении этой кнопки нет». Хорошая практика — политика «запрещено всё, что явно не разрешено», и автотесты, которые для каждого метода выполняют вызов от роли без прав и ожидают отказ.
Аутентификация, токены и ключи
- Стандарты вместо самописных схем. OAuth 2.0 и OpenID Connect для пользователей, отдельные учётные данные для взаимодействия между серверами.
- Короткие токены доступа — минуты или часы — и токены обновления с ротацией и отзывом при выходе и смене пароля.
- Проверка подписи и параметров JWT на сервере: алгоритм из заранее заданного списка, срок действия, издатель, аудитория. Неподписанные токены не принимаются.
- Никаких секретных ключей в мобильном приложении и фронтенде. Всё, что попало в клиент, можно извлечь. Секреты хранятся только на сервере, в хранилище секретов, с плановой ротацией.
- Защита входа и восстановления пароля: лимиты попыток, одинаковые ответы для существующих и несуществующих учётных записей, двухфакторная аутентификация для администраторов и партнёрских кабинетов.
Лимиты, бизнес-процессы и внешние сервисы
Отсутствие ограничений бьёт и по доступности, и по деньгам. Метод «отправить код по SMS» без лимита превращается в счёт от провайдера, метод «задать вопрос AI-ассистенту» — в счёт за обращения к модели. Что настроить:
- Лимиты частоты на пользователя, ключ и IP-адрес — на шлюзе или в приложении.
- Максимальный размер запроса, число элементов на страницу, глубину вложенности запросов для GraphQL.
- Таймауты и месячные бюджеты на обращения к платным внешним сервисам.
- Для чувствительных сценариев — регистрации, промокодов, бронирования, выплат — отдельные бизнес-лимиты и оповещения о необычных всплесках.
Для подделки запросов со стороны сервера и небезопасного использования чужих API действует принцип недоверия в обе стороны: сервер обращается только к адресам из утверждённого списка, а данные от партнёров проверяет так же строго, как данные от пользователей.
Инвентаризация, конфигурация и журналы
Нельзя защитить API, о котором не знаете. Минимальный порядок:
- Реестр API: все сервисы, версии, окружения, владельцы и то, какие данные они обрабатывают.
- Спецификация OpenAPI для каждого публичного и партнёрского API — и проверка входящих запросов по схеме на шлюзе.
- План вывода старых версий: срок, уведомление клиентов, фактическое отключение.
- Тестовые и промежуточные стенды недоступны из интернета или закрыты авторизацией, в них нет боевых данных.
- Конфигурация: только TLS, CORS со списком конкретных доменов, ошибки без трассировок, отключённые неиспользуемые HTTP-методы и заголовки безопасности сайта на ответах.
- Журналы: кто, когда и к какому объекту обращался; отказы авторизации — отдельное событие для мониторинга, потому что серия отказов часто означает перебор.
Как встроить безопасность API в разработку
Разовая проверка устаревает через несколько релизов. Устойчивый процесс выглядит так:
- На этапе проектирования — модель угроз для новых методов: какие данные, какие роли, что будет при злоупотреблении.
- В сборке — анализ кода (SAST), проверка зависимостей (SCA), валидация спецификации, автотесты на авторизацию.
- На тестовом стенде — динамическое сканирование (DAST) по спецификации OpenAPI.
- Перед крупным релизом и не реже раза в год — ручной пентест API по OWASP API Security Top 10 и методике OWASP WSTG. Как устроен такой проект и что должно быть в отчёте — в статье про пентест веб-приложения.
- После находок — исправление по приоритетам и повторная проверка, как в любом процессе управления уязвимостями.
Чек-лист безопасности API перед релизом
- Каждый метод, принимающий идентификатор объекта, проверяет права на этот объект на сервере.
- Ответы формируются по схеме с явным списком полей; запись принимает только разрешённые поля.
- Административные методы закрыты проверкой роли, есть автотесты на отказ.
- Токены короткоживущие, подпись и параметры JWT проверяются, отзыв работает.
- В мобильном приложении и фронтенде нет секретных ключей.
- Настроены лимиты частоты, размера запросов и пагинации; платные внешние вызовы ограничены бюджетом.
- Есть реестр всех API и версий, старые версии отключены или имеют дату отключения.
- Тестовые стенды закрыты от интернета и не содержат боевых данных.
- CORS ограничен конкретными доменами, ошибки не раскрывают внутреннее устройство.
- Обращения сервера к внешним адресам идут только по списку разрешённых.
- Журналы фиксируют доступ к объектам и отказы авторизации, на них настроены оповещения.
- Перед релизом проведён ручной пентест API или он запланирован на ближайшее окно.
Как это делает Viviar
Безопасность API — часть направления кибербезопасности: ручной пентест по OWASP API Security Top 10, разбор кода и встраивание проверок в сборку. Пакет «Запуск безопасной разработки» — аудит одного продукта с разбором кода и списком того, что чинить, — стоит от 20 300 BYN; с внедрением SAST, DAST и SCA в сборку — от 43 600 BYN. В проектах разработки под ключ требования к авторизации, лимитам и журналам закладываются с первого спринта — сначала мы отрабатываем такие практики на собственных продуктах.
Частые вопросы
Что такое безопасность API простыми словами?
Безопасность API — это меры, которые не позволяют получить через программный интерфейс больше данных или действий, чем положено. Главное — проверка прав на каждый объект и функцию на сервере, надёжная аутентификация, лимиты запросов, учёт всех версий API и регулярное тестирование. Типичные риски перечислены в OWASP API Security Top 10 редакции 2023 года.
Какая уязвимость API самая распространённая?
В OWASP API Security Top 10 2023 года первое место занимает нарушение авторизации на уровне объекта (BOLA): сервер не проверяет, принадлежит ли запрошенный заказ, счёт или документ текущему пользователю. Закрывается централизованной проверкой владения объектом на сервере в каждом методе и автотестами, которые запрашивают чужой объект и ожидают отказ.
Достаточно ли автоматического сканера для проверки API?
Нет. Сканер находит ошибки конфигурации, известные уязвимые библиотеки и часть типовых дефектов, но не понимает бизнес-правил: кому принадлежит объект и какая роль что может делать. Ошибки авторизации, центральный класс проблем API, находят ручной пентест и автотесты под вашу логику. Сканер полезен в сборке как постоянный фон, пентест — перед крупными релизами.
Нужно ли защищать внутренний API, если он не опубликован?
Да. Адреса методов легко извлечь из мобильного приложения или кода фронтенда, а внутренние сервисы становятся доступны после компрометации любого узла сети. Внутренний API должен проверять аутентификацию и права так же, как публичный, а сетевые ограничения — дополнительный, а не единственный слой. Неучтённые API — отдельная категория OWASP API Security Top 10.
Сколько стоит проверка безопасности API?
Зависит от числа методов, ролей, версий и того, нужен ли разбор кода. У Viviar аудит одного продукта с разбором кода входит в пакет «Запуск безопасной разработки» от 20 300 BYN, а с внедрением автоматических проверок в сборку — от 43 600 BYN. Точный объём определяем после получасового разговора.
Вывод
Безопасность API держится на нескольких вещах: сервер проверяет права на каждый объект и функцию, отдаёт и принимает только разрешённые поля, ограничивает запросы, знает все свои версии и регулярно проходит проверку — в сборке и вручную. Начните с чек-листа выше и с авторизации: ей посвящены три категории из первой пятёрки OWASP API Security Top 10. Если нужен пентест API или встраивание проверок в разработку, напишите нам: ответим за 2 рабочих дня, за полчаса разговора определим объём.
Источники: OWASP API Security Top 10 (2023), OWASP Web Security Testing Guide, OWASP Application Security Verification Standard, OWASP REST Security Cheat Sheet, OWASP Authorization Cheat Sheet (owasp.org); OpenAPI Specification (openapis.org); RFC 6749 «The OAuth 2.0 Authorization Framework» и RFC 7519 «JSON Web Token» (ietf.org); OpenID Connect Core (openid.net).