Банковские API: ключевые факторы уязвимости при интеграции
Открытый банкинг сделал API частью критической финансовой инфраструктуры. Каждый новый интерфейс связывает системы банка с приложениями партнёров, платёжными сервисами и хранилищами данных.
Надежда Стрельцова·Обновлено: 06 октября 2026 г.·12 мин

Такая связь расширяет возможности клиентов, но одновременно добавляет точки входа, которые нужно защищать и проверять.
Один из устойчивых рисков возникает там, где приложение принимает пользовательский ввод и передаёт его интерпретатору без надлежащего разделения кода и данных. Это может быть SQL-запрос к базе, команда операционной системе или выражение для другого обработчика. Если данные запроса превращаются в исполняемую инструкцию, злоумышленник получает возможность влиять на поведение системы. В банковском API последствия зависят от контекста: от чтения данных, недоступных конкретному пользователю, до воздействия на операции сервиса.
Инъекции известны разработчикам давно, но продолжают появляться в системах, где запросы строятся динамически, сторонние компоненты обновляются с задержкой, а тестирование не охватывает все эндпоинты. Поэтому безопасность открытых банковских интерфейсов зависит не от одного фильтра на входе, а от того, как устроены код, полномочия сервисов и контроль интеграционной цепочки.
Эволюция угроз: почему инъекции остаются в топе рисков API
Инъекционная уязвимость обычно появляется не из-за одной необычной ошибки, а из-за неверной обработки недоверенных данных. Если приложение напрямую добавляет пользовательское значение в строку SQL-запроса, система может принять часть этого значения за команду. Похожий риск возникает в NoSQL-запросах, LDAP-фильтрах, командах оболочки и обработке XML.
Уязвимость может скрываться и в привычном коде. Разработчик использует ORM, но для отдельного сложного запроса переходит на нативную SQL-команду. Или строит фильтр на основе полей JSON, не ограничивая допустимые операторы и типы значений. Сам факт использования ORM или API-шлюза не гарантирует безопасной обработки ввода: важен конкретный способ формирования и исполнения запроса.
В финансовом сервисе входными данными могут быть идентификаторы счетов, параметры платежа, поисковые фильтры, сведения о получателе или токены. Их наличие само по себе не делает API уязвимым. Риск возникает, когда приложение недостаточно строго определяет, какие значения допустимы, кому они принадлежат и как их можно использовать. Для платежа, например, проверки формата и диапазона суммы недостаточно, если сервис не проверяет полномочия пользователя и допустимость самой операции.
К распространённым разновидностям инъекций относятся:
- SQL-инъекции, воздействующие на запросы к реляционным базам данных;
- NoSQL-инъекции, при которых ввод меняет структуру или логику запроса к документному хранилищу;
- Command Injection, когда данные влияют на команду операционной системе;
- LDAP-инъекции, меняющие логику фильтра поиска в службе каталогов;
- XXE, при которой небезопасная обработка XML позволяет парсеру обращаться к внешним сущностям.
Общий дефект во всех этих случаях один: приложение не удерживает границу между данными и инструкциями. Но API уязвимо не только к инъекциям. Ошибки аутентификации и авторизации, чрезмерный объём возвращаемых данных, слабое управление токенами и небезопасное взаимодействие с партнёрскими сервисами тоже могут привести к утечке или неправомерному выполнению операций.
Инъекцию предотвращает не универсальный фильтр, а последовательная обработка данных на каждом участке, где они становятся частью запроса или команды.
Протоколы авторизации помогают контролировать доступ к API, но не исправляют ошибки в запросах к базе данных. Даже корректно выданный токен не должен давать его владельцу больше прав, чем предусмотрено сценарием. Если учётная запись партнёра скомпрометирована или приложение неверно проверяет принадлежность ресурса пользователю, проблема может проявиться уже внутри доверенного потока. Поэтому защита открытых банковских интерфейсов требует одновременно проверять личность клиента, его полномочия и безопасность операций, выполняемых после авторизации.
Отдельный риск появляется, когда интерфейс принимает больше данных, чем нужно для выполнения операции. Чем шире контракт API и чем больше вариантов обработки он допускает, тем труднее убедиться, что каждый путь проверяется одинаково. Например, поиск по нескольким параметрам может быть реализован через разные ветви кода, и в одной из них фильтрация окажется слабее. При проектировании полезно ограничивать контракт необходимыми полями и не оставлять клиенту возможность задавать произвольные части запроса.
Уроки MOVEit: как SQL-инъекции компрометируют финансовые системы
В 2023 году уязвимость в MOVEit Transfer стала причиной масштабной кампании по краже данных. Уязвимость CVE-2023-34362 позволяла выполнять SQL-инъекцию в веб-приложении для передачи файлов. Злоумышленники использовали её для доступа к данным, которые обрабатывались системой. Инцидент затронул множество организаций и показал, как уязвимость одного распространённого продукта может повлиять на целые цепочки обмена информацией.
Публичные описания инцидента позволяют говорить о SQL-инъекции и последующем извлечении данных. Они не дают оснований приписывать атаке конкретный сценарий с полем имени пользователя, точную последовательность запросов или определённый способ построения SQL-команды. Не следует также утверждать, что злоумышленник за конкретное время выгрузил определённые таблицы или токены сессий, если такие сведения не подтверждены источниками. В разборе инцидента важнее отделять установленный механизм уязвимости от деталей, которые лишь выглядят правдоподобно.
Для банков и финтех-компаний MOVEit важен прежде всего как пример риска стороннего программного обеспечения. Организация может не разрабатывать продукт сама, но использовать его для передачи документов, выписок или данных клиентов. Если такой компонент уязвим, последствия выходят за границы отдельного сервиса: затрагиваются партнёры и люди, чьи сведения прошли через эту систему.
Это важный нюанс для оценки рисков утечки данных через API и связанные с ними сервисы. Защита собственного интерфейса не закрывает уязвимость в продукте, которому передаются данные для обработки. Значение имеет вся цепочка: кто получает сведения, где они хранятся, как компонент обновляется и как быстро его владелец сообщает о проблемах безопасности. Если организация не знает, какие интеграции активны и какие данные через них проходят, ей сложнее оценить последствия инцидента и ограничить доступ.
MOVEit также напоминает, что WAF не заменяет исправление уязвимого кода. Межсетевой экран веб-приложений способен выявлять и блокировать часть подозрительных запросов, но его правила зависят от конфигурации, наблюдаемого трафика и характера атаки. Нельзя уверенно утверждать, почему конкретное средство защиты пропустило конкретный запрос, если это не подтверждено разбором инцидента. Практический вывод проще: фильтрация на периметре может быть дополнительным уровнем защиты, но безопасное построение запросов должно обеспечиваться в самом приложении.
В интеграционной цепочке поэтому важны не только собственные API банка, но и сервисы, которым он доверяет обработку данных. До подключения компонента нужно понимать, какие данные он получает, где они хранятся, кто отвечает за обновления и как организация узнает о критической уязвимости. После подключения оценка не заканчивается: состав интеграций меняется, а старые компоненты могут оставаться в эксплуатации дольше, чем планировалось.
Стандарты безопасности как фундамент: FAPI 2.0 и PCI DSS 4.0
PCI DSS и FAPI решают разные задачи. PCI DSS применяется к среде, связанной с данными платёжных карт, и задаёт требования к защите такой среды. FAPI описывает профиль безопасности для финансовых API на основе OAuth 2.0 и связанных механизмов. Ни один из этих документов не заменяет безопасную реализацию запросов к базе данных.
В PCI DSS v4.0 требование 6.2.4 связано с автоматизированным тестированием уязвимостей публичных API. Это контроль, который помогает выявлять проблемы в открытых интерфейсах, доступных через публичные сети. Его не следует подменять требованием об обучении разработчиков: обучение и практики защищённой разработки относятся к другим аспектам управления безопасностью. Автоматизированное тестирование тоже не доказывает отсутствия уязвимостей: результат зависит от покрытия интерфейсов, настроек сканера и доступных ему сценариев.
Требование 6.3.2 связано с инвентаризацией bespoke software и стороннего программного обеспечения, включённого в среду данных держателей карт. Такой реестр помогает понимать, какие компоненты требуют сопровождения и контроля. Но само наличие инвентаризации не означает, что каждый эндпоинт автоматически протестирован или что любой API обязательно должен проходить DAST при каждом выпуске.
FAPI 2.0 сосредоточен на безопасном взаимодействии клиента и сервера в финансовых API. В профиль входят механизмы, усиливающие защиту OAuth 2.0, в том числе привязка токенов к клиенту и защита обмена авторизационными данными. Связанные рекомендации по безопасности OAuth описывают угрозы протоколу и меры снижения риска. Эти механизмы затрудняют отдельные сценарии перехвата или повторного использования токена, но не предотвращают SQL-инъекцию и не исправляют ошибку контроля доступа в бизнес-логике.
| Параметр | PCI DSS v4.0 | FAPI 2.0 |
|---|---|---|
| Основная область | Среда, связанная с данными платёжных карт | Защищённое взаимодействие финансовых API |
| На что направлен контроль | Защита данных, контроль компонентов и проверка уязвимостей | Аутентификация, авторизация и защита протокольного взаимодействия |
| Связь с инъекциями | Поддерживает контроль безопасности, но не подменяет меры в коде | Косвенная: снижает риски на уровне авторизации, но не устраняет ошибки запросов |
| Роль в защите | Часть системы соответствия и управления безопасностью | Профиль для построения защищённых финансовых API |
Эти рамки полезны, когда их применяют по назначению. Соответствие стандарту не доказывает, что уязвимостей нет, а технически безопасный механизм авторизации не компенсирует слабую изоляцию сервисной учётной записи. Для интеграции нужны оба уровня: защита протокола и проверка того, что API делает с полученными данными.
Технические методы нейтрализации атак на уровне кода
Для SQL-запросов основной защитный механизм — параметризация. Подготовленный запрос отделяет структуру команды от значений, которые в неё передаются. Тогда пользовательская строка рассматривается базой как значение, а не как часть SQL-синтаксиса. Этот подход поддерживается драйверами баз данных и большинством ORM, но его легко обойти, если отдельный участок приложения продолжает собирать запрос конкатенацией.
Имена таблиц и столбцов обычно нельзя передать как обычные параметры значения. Если API позволяет выбирать поле сортировки или тип отчёта, такие варианты следует сопоставлять с заранее заданным перечнем допустимых идентификаторов. Проверка должна учитывать ожидаемый тип данных и контекст использования, а не ограничиваться удалением отдельных символов.
Для NoSQL-систем действует тот же принцип: API не должен принимать произвольный объект запроса от клиента и напрямую передавать его хранилищу. Схема входных данных должна задавать разрешённые поля и типы, а оператор запроса должен формироваться серверной логикой. Особенно важно не позволять клиенту самостоятельно задавать структуру фильтра, если интерфейс изначально предназначен для простого поиска или выборки.
Защита от Command Injection начинается с отказа от сборки shell-команды из пользовательских строк. Если задача требует запуска внешней программы, безопаснее использовать интерфейс, который передаёт аргументы отдельно, а не интерпретирует их как единую команду. Ещё лучше убрать системный вызов из обработки пользовательского запроса, если ту же задачу можно решить библиотекой или отдельным изолированным сервисом.
Валидация на границе API помогает отсеивать значения, которые не соответствуют контракту. Для каждого эндпоинта полезно определить обязательные поля, типы, допустимые диапазоны и формат идентификаторов. JSON Schema и аналогичные механизмы могут сделать контракт явным и проверяемым. Однако валидация не заменяет параметризацию: даже значение, прошедшее проверку формата, нужно безопасно использовать в запросе.
Не менее важны права сервисной учётной записи в базе. Принцип наименьших привилегий означает, что приложению выдаются только полномочия, нужные для его функций. Сервису, который читает записи, обычно не нужны права на изменение схемы или создание пользователей. Но запрет административных операций сам по себе не превращает инъекцию в безопасную: если у учётной записи есть права на запись, атакующий при успешной эксплуатации может попытаться выполнить доступные ей операции изменения данных.
Поэтому роли стоит разделять по функциям и типам операций, а доступ к таблицам и процедурам выдавать настолько узко, насколько позволяет архитектура. Такая сегментация не устраняет дефект в коде, но может уменьшить область воздействия. Отдельно нужно контролировать, какие данные API возвращает наружу: избыточный ответ превращает даже ошибку чтения в более серьёзный риск утечки.
На уровне приложения полезно отдельно проверять бизнес-правила. Валидный идентификатор ещё не означает, что пользователь вправе обращаться к соответствующему счёту или документу. Сервер должен устанавливать связь между субъектом запроса, его ролью, ресурсом и разрешённой операцией. Это особенно важно для интеграций, где партнёрский сервис действует от имени клиента и передаёт токен в несколько внутренних компонентов.
Наконец, ошибки API не должны раскрывать подробности устройства приложения. Сообщения с текстом SQL-ошибки, путями к файлам, названиями внутренних таблиц или конфигурационными деталями помогают понять, как устроена система. Клиенту достаточно получить понятный статус операции, а диагностические сведения должны оставаться в защищённых журналах. Логи при этом тоже требуют контроля: туда не следует без необходимости записывать токены, платёжные данные и другие чувствительные значения.
Стратегия непрерывного контроля: SAST, DAST и инвентаризация API
Однажды внедрённая параметризация не гарантирует, что все команды разработки соблюдают её во всех сервисах. Банковская интеграционная цепочка включает собственные приложения, сторонние библиотеки и унаследованные системы. Контроль должен находить уязвимости и в исходном коде, и в работающих интерфейсах, а также учитывать API, о существовании которых команда могла забыть.
SAST анализирует исходный код или промежуточное представление программы без её запуска. Такой анализ может подсветить конкатенацию SQL, небезопасные вызовы оболочки или путь данных от запроса до опасной операции. Результат требует проверки: инструмент может указать на риск, который в конкретном контексте неэксплуатируем, или пропустить дефект, зависящий от конфигурации и логики приложения.
DAST проверяет запущенное приложение, отправляя запросы и оценивая ответы. Он помогает выявить проблемы, которые проявляются только в работающей системе, включая некоторые инъекционные уязвимости. Однако динамический сканер не знает автоматически всех ролей пользователей, бизнес-правил и допустимых сценариев. Его покрытие зависит от доступных эндпоинтов, авторизационных настроек и качества тестовых данных. Поэтому DAST дополняет анализ кода, а не заменяет его.
Проверки полезнее рассматривать как разные способы увидеть разные части риска. SAST может показать опасный участок реализации, а DAST — поведение доступного интерфейса. Ни один из них сам по себе не гарантирует, что найдены ошибки разграничения доступа или неучтённые API. Для этого нужны знания о сценариях использования, ролях и фактической архитектуре.
Отдельная задача — вести актуальную инвентаризацию API. В реестре полезно фиксировать владельца сервиса, назначение интерфейса, типы обрабатываемых данных, способы аутентификации, зависимости от сторонних компонентов и состояние проверок. Спецификация OpenAPI помогает описывать контракты и автоматизировать часть тестирования, но она должна соответствовать реально развёрнутой версии. Документ, который не обновлялся вместе с приложением, создаёт иллюзию полноты.
Реестр помогает обнаруживать и так называемые забытые интерфейсы: тестовые или устаревшие эндпоинты, которые остались доступны после изменения продукта. Для финансовой системы это не формальность. Старый API может продолжать принимать запросы, хотя команда уже не учитывает его при разработке новых проверок. Сопоставление документации с работающими сервисами помогает находить такие расхождения и назначать владельца каждому интерфейсу.
Для команд это означает, что проверка API должна быть встроена в обычный цикл сопровождения. Изменение эндпоинта может менять поля запроса, права доступа и набор возвращаемых данных, поэтому полезно оценивать не только код, но и влияние изменения на безопасность. Критичность проверки определяется риском и требованиями конкретной среды, а не универсальным правилом проводить одинаковое сканирование при каждом релизе.
Логические ошибки авторизации требуют отдельного внимания. Например, пользователь может быть правильно аутентифицирован, но получить доступ к чужому счёту, если сервер доверяет переданному клиентом идентификатору и не проверяет его связь с текущей учётной записью. Такие дефекты не всегда обнаруживаются стандартными полезными нагрузками для инъекций. Их ищут через анализ сценариев, тестирование ролей и проверку того, как меняется доступ при подмене идентификаторов и контекста запроса.
Независимая проверка может быть полезной частью этой работы, особенно если внутренние команды давно знают архитектуру и привычные сценарии. Но рекомендацию о привлечении внешних специалистов не стоит приписывать стандарту, если она в нём прямо не сформулирована. Решение о внешнем тестировании принимают с учётом критичности сервиса, изменений в системе и возможностей собственной команды.
Безопасность банковского API складывается из нескольких практик: параметризованных запросов, строгого контроля доступа, ограниченных прав сервисов, актуального реестра интеграций и проверок, которые соответствуют конкретным угрозам. PCI DSS задаёт требования для среды платёжных карт, FAPI усиливает защиту финансового взаимодействия, а анализ кода и тестирование помогают находить дефекты реализации. Их нельзя свести к одной отметке о соответствии.
Уязвимость стороннего сервиса способна затронуть тех, кто не разрабатывал и не администрировал его напрямую. Поэтому интеграцию стоит рассматривать как часть собственной поверхности атаки: знать, какие данные уходят партнёру, какие полномочия получает подключённый сервис и кто отвечает за его сопровождение. API остаётся безопасным не благодаря одному стандарту или сканеру, а когда контроль сохраняется на всём пути данных, от входного запроса до ответа и внешней зависимости.