Код от AI и сломанный доступ: как AppSec проверяет границы арендаторов

Дата
Код от AI и сломанный доступ: как AppSec проверяет границы арендаторов

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

AI-код часто выглядит логично, потому что повторяет привычную структуру: получить объект, изменить поле, вернуть ответ. Но модель может пропустить главное правило безопасности — объект должен принадлежать текущему пользователю или его организации. Такая ошибка не всегда видна статическим тестам и редко ловится позитивным сценарием.

Практическая задача AppSec — проверять не только стиль и синтаксис AI-кода, а инварианты доступа. Если в системе есть арендаторы, проекты, команды или роли, каждый новый путь должен доказывать, что чужой объект недоступен.

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

Код от AI и сломанный доступ: как AppSec проверяет границы арендаторов

Типовой сбой авторизации

Сбой обычно возникает на границе объекта. Код проверяет, что пользователь вошёл в систему, но не проверяет, что запись принадлежит его организации. Иногда проверка есть в списке объектов, но отсутствует в детальной карточке, обновлении или удалении.

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

  • проверять владельца объекта;
  • фильтровать запросы по арендатору;
  • запрещать прямой доступ по чужому идентификатору;
  • тестировать чтение и изменение;
  • проверять удаление отдельно;
  • не доверять данным из клиента;
  • использовать запрет по умолчанию.

Негативные тесты для AI-кода

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

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

  • создать двух пользователей из разных арендаторов;
  • создать объект для первого пользователя;
  • попробовать чтение вторым пользователем;
  • попробовать изменение вторым пользователем;
  • попробовать удаление вторым пользователем;
  • проверить ответ и журнал;
  • повторить для каждой роли.

Ревью инвариантов

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

Если AI предложил изменение в зоне доступа, ревью должно быть строже, чем для обычной правки интерфейса. Любая новая точка API должна иметь доказательство отказа для чужого объекта.

  • проверить источник идентификатор арендатора;
  • проверить серверную фильтрацию;
  • найти прямые обращения по ID;
  • проверить обход через поиск;
  • проверить массовые операции;
  • сравнить роли до и после изменения;
  • добавить тест отказа в задачу.

Журналирование и доказательства

Контроль работает только тогда, когда его можно проверить после инцидента. Для AI-системы важно хранить не только итоговый ответ, но и источник данных, роль пользователя, версию политики, решение фильтра и действие человека. Иначе расследование превращается в спор о том, почему модель ответила именно так.

Команде безопасности нужен единый минимум полей. Он должен попадать в SIEM или отдельный журнал, но с ограничением доступа, потому что сами запросы и ответы могут содержать чувствительные сведения.

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

Порядок внедрения

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

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

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

Метрики качества

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

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

  • доля заблокированных запрещённых запросов;
  • доля ошибочных разрешений;
  • время расследования;
  • число ручных исключений;
  • число повторных нарушений;
  • покрытие негативных тестов;
  • срок ротации ключей.

Рабочий пример контроля

Команда может начать с простой таблицы проверок. В ней для каждого критичного действия указаны роль, объект, ожидаемый отказ, журнал и владелец правила. Такая таблица удобна тем, что её понимают разработчики, SOC и владелец продукта. Она превращает общую фразу «проверить безопасность AI» в конкретный набор условий.

Пример не должен содержать реальные секреты или производственные данные. Для проверки создаются синтетические пользователи, фиктивные документы, тестовые токены и отдельная среда. Если AI-инструмент не проходит такой тест, его нельзя подключать к рабочему потоку без ограничения прав.

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

Что делать после найденной ошибки

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

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

  • зафиксировать исходный сигнал;
  • выделить затронутые роли;
  • проверить журналы доступа;
  • отключить рискованное исключение;
  • ротировать затронутые секреты;
  • обновить тесты;
  • проверить отсутствие повторов.

Ещё по теме