Одна идея этого урока: большинство взломов – не гении, а незакрытые типовые дыры; короткий чек-лист закрывает основное.
Знакомая ситуация
Ты за вечер собрал с агентом мини-сервис для школы: студент вводит номер заказа – видит свои материалы. Всё работает, все довольны. Через месяц выясняется: подставив чужой номер в адресную строку, любой человек открывал чужие материалы. Никто ничего не «взламывал» – просто дверь не была заперта.
Взломы из кино – про гениев. Взломы из жизни – про автоматические сканеры, которые круглосуточно перебирают типовые дыры во всех сайтах подряд. Твоя задача – не победить гения, а не попасть в улов сканера.
Безопасность – не магия, а короткий список типовых дыр. OWASP Top 10 – мировой рейтинг этих дыр, он почти не меняется годами. Пять правил из него закрывают основную массу реальных атак на приложения твоего масштаба.
Пять правил, дающих 80%
1
Не доверяй никакому вводу извне injectionВсё, что пришло от пользователя – текст в форме, параметр в адресе, сообщение боту – может быть попыткой внедрить команду. Правило: внешний ввод всегда проверяется и никогда не подставляется в запросы «как есть».
2
Секреты – только в переменных окружения secrets managementКлючи API, пароли, токены – не в коде, не в чате с агентом, не в репозитории. Ключ в коде рано или поздно утекает, а утёкший ключ платёжки или LLM – это чужие траты на твоём балансе.
3
«Кто ты» и «что тебе можно» – разные проверки authentication vs authorizationАутентификация подтверждает личность, авторизация – право на действие. Классическая дыра: вход проверяем, а право – нет, и любой залогиненный студент открывает чужие данные, поменяв номер в адресе. Проверка права – на КАЖДОМ действии.
4
Минимальные права least privilegeКаждому ключу и сервису – ровно столько прав, сколько нужно для его работы. Боту рассылки не нужен доступ к платежам. Тогда утечка одного ключа – неприятность, а не катастрофа: это тот же blast radius из урока 13.
5
Обновляй зависимости vulnerable dependenciesТвоё приложение стоит на чужих библиотеках, в них регулярно находят дыры – и сканеры атакуют именно известные дыры старых версий. Раз в месяц: попроси агента проверить и обновить зависимости.
Особенность ИИ-разработки
Агент по умолчанию оптимизирует одно: «работает». Безопасность в это «работает» не входит – код может быть рабочим и дырявым одновременно, снаружи разницы не видно.
Поэтому безопасность – отдельный проход, отдельным запросом: «проверь это как security-ревьюер по OWASP Top 10». Тот же агент в роли ревьюера находит дыры, которые сам же оставил в роли строителя – потому что теперь он ищет именно их.
Как думают три уровня
Джун · «есть же пароль»Безопасность = форма входа. Раз пользователи логинятся – всё защищено. Про то, что залогиненный пользователь может лазить по чужим данным, не думает вовсе.
Мидл · латает то, о чём слышалЗнает про инъекции и прячет ключи – потому что где-то читал. Но защита точечная: что в чек-листе не встречалось, то не закрыто. Нет системы – есть набор выученных заплаток.
Сеньор · чек-лист угроз с этапа дизайнаЕщё в постановке задачи спрашивает: «что здесь может пойти не так по OWASP?». Права – минимальные, секреты – в окружении, и перед запуском – отдельное security-ревью как обязательный шаг, а не как жест паранойи.
Проверь себя
1. В личном кабинете школы студент открывает свои оплаты по адресу с номером профиля. Поменяв номер на чужой, он видит чужие оплаты. Вход при этом работает исправно. Что сломано?
Вход (authentication) работает – система знает, кто пришёл. Сломана authorization: право на конкретные данные не проверяется. Усиление входа не поможет: злоумышленник честно войдёт под собой и возьмёт чужое. И да, по OWASP это дыра номер один (Broken Access Control) – винить пользователя бессмысленно, сканеры подбирают адреса автоматически.
2. Агент сделал телеграм-бота и для простоты вписал ключ LLM-провайдера прямо в код. Код лежит в репозитории. Реакция сеньора?
Ключ в коде – бомба замедленного действия: репозиторий однажды станет публичным, попадёт в бэкап, откроется подрядчику или уйдёт в контекст чужого ИИ-инструмента. «Отдельный файл в репозитории» – та же дыра с другим названием. И важная деталь: побывавший в коде ключ считается скомпрометированным – его отзывают, а не просто прячут.
3. Агент закончил мини-сервис приёма домашних заданий и отчитался: «всё работает, проверил». Что добавит сеньор перед запуском?
«Проверил» у агента означает «работает», а не «безопасно» – это разные оси. Отдельный проход в роли ревьюера ловит типовые дыры почти бесплатно. Пентестер – хорошо, но для мини-сервиса школы это перебор: сеньорское мышление – соразмерять защиту с риском, а не выкручивать её в максимум.
Что говорить агенту уже сегодня
Перед запуском: пройди по коду как security-ревьюер по OWASP Top 10 и покажи найденные риски
Про секреты: проверь, что ни один ключ или пароль не лежит в коде – всё только в переменных окружения
Про доступ: для каждого действия пользователя проверь: убеждаемся ли мы, что он имеет право именно на эти данные?
Раз в месяц: проверь зависимости проекта на известные уязвимости и предложи план обновления
Источники
OWASP Top Ten – мировой рейтинг типовых уязвимостей веб-приложений; актуальная редакция – 2025 года.