Правило можно прочитать, а привычку — только натренировать. На этой мысли держится «Кибердетектив» — браузерная игра, в которой сотрудники Авито расследуют атаки на вымышленную компанию. Компания выдуманная, а схемы атак настоящие: подделанный голос руководителя, счёт с домена «на одну букву мимо», шквал запросов MFA, чужой человек за незаблокированным ноутбуком.
Меня зовут Илья Никифоров, в Авито я отвечаю за Security Awareness в команде GRC: обучаю сотрудников, провожу учебные фишинговые рассылки, занимаюсь безопасностью генеративного ИИ. Я не разработчик и никогда не делал игр. «Кибердетектива» я придумал и собрал сам за 74 дня: код, тесты и ревью делали ИИ-агенты, а коллега помог превратить прототип в сервис компании.
Расскажу, что получилось, на каких реальных атаках построены задания, как распределялась работа между мной и нейросетями и как всё устроено внутри — для тех, кому интересен код. И почему считаю, что сегодня человек не из разработки может сделать полезный продукт в своей области.
Оглавление

Откуда взялась идея
Летом мы провели Security Week. Об одном из форматов той недели — CTF для тех, кто не работает в ИБ, — я уже рассказал в этой статье. И он зашел, но CTF, все-таки, про отдельные задачи. В отзывах к Security Week кто-то написал, что хочет «чего-то эдакого», да и мне хотелось сделать историю, в которую втягиваешься, где одна мелочь тянет за собой следующую.
Так 31 июля я сделал первый коммит — 1 544 строки, серые клетки и два человечка. Уже через 74 дня — 12 октября, на старте месяцы Security Awareness, — игра вышла в свет для всех сотрудников Авито.
Между этими датами — больше 100 часов после работы и на выходных. Это была моя личная инициатива, но делал я ее для работы: игра решает именно ту задачу, ради которой существует наша команда.

Зачем игра, если есть курс
У нас есть обязательный курс по информационной безопасности. Он нужен, мы не планируем от него избавляться. Однако у просто курса с проверочным тестом есть предел — он проверяет лишь то, знает ли человек правило. А «реальная» атака в формате игры проверит, сможет ли он поступить правильно в спешке, когда звонит якобы руководитель, когда счёт выглядит как обычно.
При этом мне было важно сделать формат, в котором попадает в ситуацию, где его просят продиктовать код, и он сам решает, что с этим сделать. Ошибается, видит последствия и запоминает.
Из этого появилось три требования к игре.
Ошибаться безопасно. Неверную версию можно исправить без всяких штрафов. Если наказывать за ошибку, человек начнет просто угадывать правильный ответ, а не думать.
Атака — это цепочка. Редко какая атака укладывается в одно письмо. Чаще всего это несколько с виду безобидных мелочей, ведущих к серьезным потерям. Мне хотелось, чтобы в игре такая цепочка тянулась через всё задание.
Учить действию, а не теме. Закончив игру, сотрудник Авито должен не «знать о фишинге», а знать, что ему нужно сделать конкретное действие — «сообщить по сформированному алгоритму».
Какой получилась игра
Действие происходит в вымышленной компании Lumi. Игрок управляет Споком — медоедом, маскотом нашей команды ИБ.

Нужно ходить по башне компании с помощью мыши или клавиатуры, осматривать предметы, слушать записи звонков, сравнивать письма, читать журналы входов и собирать свою версию того, что всё-таки произошло.


Первый сезон игры называется «Тихий найм». В нём шесть дел, каждое — отдельная схема атаки.
Дело | Что случилось | Что тренируем |
001 «Гость без пропуска» | Чужой человек сел за незаблокированный ноутбук | Блокировать экран и не пускать «своих по виду» |
002 «Архив» | Диски вывозят под видом макулатуры | Сверять, что выносят и по какому документу |
003 «Платёжка» | Счёт пришёл с домена, который отличается на одну букву | Проверять реквизиты по известному контакту |
004 «Голос Марка» | Голос руководителя подделали | Знакомый голос — ещё не доказательство, перезвонить самому |
005 «Ключ от всех дверей» | 27 запросов MFA за 11 минут | Не подтверждать вход, который не начинал |
006 «Верный» | Нужно закрыть доступы и при этом сохранить улики | Сначала сохранить доказательства, потом чинить |
Каждая серия занимает около 15 минут, дела открываются по очереди. Перед каждым — короткий пролог, его можно посмотреть в виде ролика или просто прочитать как переписку. После дела — разбор, что произошло и на каком шаге атаку можно было остановить.

Кроме сюжета есть ещё три вещи.
Полигон. Доска тренировок на 21 задание по 10-15 минут:
фишинг — 8 заданий,
ИИ — 6 заданий,
«технарское» — 7 заданий.
Есть уровни — стажёр, детектив и мастер. Например: дать доступ ИИ-сервису доступ к почте только в нужном объёме, подготовить запрос по внешнюю нейросеть без данных клиентов, найти подменённый пакет данных в зависимостях.

18 игровых механик. Разбор журнала входов, расстановка событий по времени, связь улики с выводом, выбор безопасного маршрута проверки, закрашивание лишнего на фото офиса, оформление заявки — и еще много других. У всех правило одно: у каждого задания свой глагол. Задания в стиле «прочитай и выбери пункт» не принимается.
Кухня. Это перерыв между делами — головоломки без оценки и полка из 15 памяток, которые можно скачать и распечатать.


Ранг за то, как ты проверяешь
Больше всего времени занял не код, а сценарий и арки героев, их характеры, предыстории, отрисовка и генерация изображений. А ещё — правила оценки игроков.
Ранг даётся за процесс, а не за угадывание. Открыл подозрительную ссылку, ответил атакующему или взял готовое решение — ранг ниже. Проверил отправителя, перезвонил по нужному номеру — выше. Ранги называются «Чистая работа», «Холодная голова» и «С оговорками».
Подсказки в три ступени. Первая наводит на мысль, вторая сужает фокус. Готовое решение — только по явному запросу.
Не учим «отклонять всё». В игре есть законные просьбы, которые нужно выполнить. Иначе человек выйдет с привычкой отказывать всем и во всём подряд, а это тоже проблема.

В итоге игрок обзаводится шестью привычками: проверять отправителя, прежде чем кликать ссылку, перезванивать руководителю по номеру из корпоративного справочника, не диктовать коды, давать минимальный доступ, не отправлять в нейросети данные клиентов, а главное — если в чём-то сомневаешься, обращайся в ИБ.
На чём стоят сценарии
Сюжет вымышленный, но каждое дело построено на технике, которую применяют реальные злоумышленники. Для сверки я использовал MITRE ATT&CK — открытую базу тактик и техник атак, которой пользуются безопасники по всему миру.
Что в игре | Техника MITRE ATT&CK | Где |
Носители и находки | 002 | |
Фишинговые письма и ссылки | 003 | |
Письмо «от своего» | 003 | |
Звонок с подделанным голосом | 004 | |
Выманивание информации под легендой | 004 | |
Подбор и кража паролей | 005 | |
Шквал запросов MFA, кража сессии | 005 | |
Сбор сведений о людях и компании | Полигон | |
Секреты в коде | Полигон | |
Атака через зависимости | Полигон |
Физический доступ — проход за сотрудником без пропуска — в ATT&CK отдельной техникой не описан, поэтому дело 001 построено на классической социальной инженерии.
Техника отвечает на вопрос «что делает атакующий». Игре нужно ещё и показать, как злоумышленники влияют на выполнение тех или иных действий человеком. Поэтому у каждого дела есть и психологический рычаг: авторитет, срочность, привычка, забота, страх. Рычаг определяет механику. Если давит срочность, значит, тикает таймер. Если давит авторитет, то игроку звонит «руководитель» — и спорить с ним неловко.




Как это сделано с ИИ
Код писали и ревьюили ИИ-агенты Claude Code и Codex. Я же взял на себя другие роли:
Сценарист и геймдизайнер. Сюжет и арки, герои, их характеры и предыстории, улики, ветки, тексты, правила рангов. Это агентам не отдать — они не знают, как на самом деле выглядят атаки в компании и на что могут повестись люди.
Продакт. Что делаем, что выкидываем, что считаем готовым.
Методолог. Какую привычку тренирует какое задание и как понять, что она и правда натренирована.
Приёмка. Каждую фичу я проходил руками. Агент говорит «готово» часто раньше, чем фичу действительно можно принять.
У меня было несколько правил, которые помогали в работе с ИИ.
Небольшие задачи с критериями готовности. Промпт нужно расписывать подробно: не «сделай дело 004», а что-то вроде «добавь мини-игру — запись звонка, три фрагмента, игрок отмечает подделку; проверка — вот такой тест».
Второй агент как ревьюер. Один пишет, другой ищет, что не работает или ломается. Так можно поймать больше косяков, чем при самопроверке.
Тесты как страховка. К релизу я провёл их более двух тысяч. Не из-за перфекционизма — просто без них каждое следующее изменение могло сломать что-то в соседнем деле.
Плейтест агентами. Перед релизом агенты прошли все шесть дел и 21 задание. У них была задача — «пройди как игрок и найди, что ломается». Агенты нашли критичный баг: в одном из дел версия фиксировалась первым кликом, а ключевая улика открывалась только после выбора правильной версии. Так получался замкнутый круг.
Арт, видео, звук
Здесь нейросети сделали то, на что у меня не было ни бюджета, ни команды.
Фоны локаций — изометрию офиса, — сгенерировал в ChatGPT.
Персонажей сгенерировал в 3D через Hyper3D Robin. Скелет, анимации ходьбы и стойки — сделал в Blender, а спрайты с восьми ракурсов агент отрендерил скриптом с камеры сцены.
Ролики — прологи к делам и перебивки между сценами — сгенерировал Grok через API, а заставочный ролик сделан в Dreamina.
Озвучка — музыку сделал в Suno, а голоса персонажей в ElevenLabs.
Здесь главное правило — один эталон внешности на персонажа. Все позы и ракурсы делаются именно от него, а не описываются каждый раз заново. Иначе у Спока в каждом кадре будет новое лицо.
Как держали безопасность
Мы же безопасники. Конечно, было бы странно сделать всё иначе.
Компания в игре вымышленная, персонажи — тоже. Никаких совпадений с реальными людьми или реальных данных.
В нейросети не уходило ничего, кроме сценариев и кода игры.
Инструменты для ИИ-агентов проверяли так же, как требуют наши правила по безопасной работе с GenAI.
Производство в цифрах
От первого коммита до релиза | 74 дня |
Коммитов к релизу | 372 |
Автотестов | около 2 200 |
Кода игры | 80 модулей на JavaScript, около 22 тысяч строк |
Дел в первом сезоне | 6 |
Заданий на Полигоне | 21 |
Игровых механик | 18 |
Памяток | 15 |
Плейтестов на живых людях до релиза | 8 |
Моё время | больше 100 часов вечерами и на выходных |

Для технарей: как всё устроено
Главный принцип архитектуры — сделать её максимально скучной. Агенты хорошо работают в простой системе и плохо — с хитрой. Каждая лишняя подвижная часть для них — это ещё одно место, где агент может что-то незаметно сломать.
Движок: чистый JavaScript без сборки
Игра — статический сайт: index.html и 80 ES-модулей, которые браузер грузит напрямую. Ни фреймворка, ни бандлера. Решение отказаться от сборки позволило избежать целого класса ошибок, а любой модуль так можно открыть и просто прочитать как есть. Кадры планирует собственный планировщик поверх requestAnimationFrame.
Сцены — это изометрический фоны 2048x1280 в WebP, каждая размером примерно в 170 КБ. Персонаж — атлас спрайтов: кадр 256x320, восемь направлений движения, циклы «стоит» и «идёт», рядом JSON-описание со скоростью цикла и точкой опоры «ног». Направление движок выбирает по вектору движения, а кадр — по времени в состоянии.
Дело — это данные, а не код
Дело целиком описано в JSON: сцены, объекты с координатами в процентах, персонажи, улики, задания, версии и финал. Вот, например, фрагмент сцены из первого дела:
"scenes": { "office": { "title": "Этаж продуктовых команд", "art": "assets/scenes/01-lobby.webp", "world": { "spawn": { "x": 52, "y": 78 }, "bounds": { "left": 5, "right": 96, "top": 28, "bottom": 88 } } } }
У каждого задания есть жанр — одна из 18 механик. Он задаёт набор полей, а манифест жанров описывает общие поля, базу и добавки каждого жанра. Новое задание существующего жанра — это всего лишь правка JSON, а не куска кода.
Контейнер живёт отдельно от кода
В проде игра берёт контент из S3-бакета. Релиз — это манифест плюс файлы контента, медиа адресуются по хешу содержимого, а какой релиз сейчас живой прописано в live.json. Публикация и откат не требуют выкатки кода, достаточно переключить указатель.
Адрес бакета хостинг подставляет в модули при старте. Если подстановки нет, контент ищется рядом с index.html — так работают локальный запуск и тесты.
Два редактора — визуал и тексты правит человек
Правки визуала оказались самой дорогой частью разработки сцены: поставил координаты в JSON на глаз, открыл браузер, промахнулся, поправил — снова открыл. Поэтому работали в два редактора.
Режим правки сцены прямо в игре — ?edit=1. Улики, персонажей, доску и двери таскаешь мышью сразу в настоящем рендере, а готовые координаты забираешь в JSON. Новые объекты добавляем из палитры, а зоны, где можно ходить, тоже можно править мышкой. Почему внутри игры? Потому что отдельное приложение рисует немного иначе, чем движок, и позиция почти совпадает. Нам же нужно было точное совпадение. Режим правит только координаты, смысл сцены же остается в JSON.
Редактор контента — отдельный интерфейс на внутренней платформе Авито: React и TypeScript, бэкенд на Python. Он нужен, чтобы тексты, задания и картинки правили люди без репозитория и без релиза кода.
Дерево полей вместо форм. Форма, написанная под сегодняшнее дело, начала бы врать на следующем, так как у каждого жанра свой набор полей. Дерево показывает ровно то, что есть в файле, а для тех, кто умеет, рядом есть переключатель в сырой JSON.
Предпросмотр на настоящем движке. Кнопка собирает черновой релиз, и игра открывается в окне редактора на этом черновике. Если игроки в этот момент играют, они видят прежнюю версию.
Проверки связности. Девять правил плюс ссылки на медиа. Если что-то оборвалось, публикация не пройдёт.
Медиатека. Картинку загружаешь в бакет, а в релиз она попадает при публикации.
Публикация и откат — кнопками, с записью кто и когда что опубликовал.
Тесты и выкатка
Игра прошла около 2200 тестов на Jest. Формат бакета закреплён эталонным примером, и с ним сверяются и игра, и редактор: разъехаться они могут только через падение теста. Список событий движка тоже сверяется тестом с кодом. После каждой выкатки запускается smoke-тест, а сборка и тесты иду в CI внутренней платформы.
Как игра попала в Авито
Прототип — это ещё не сервис. Чтобы играла работала у всех сотрудников, её нужно развернуть во внутренней инфраструктуре, настроить выкатку и договориться, как править контент без релиза кода.
Здесь помог Михаил Черняков (Руководитель отдела по защите персональных данных) — он предложил перенести игру во внутренний PaaS, ревьюил и принимал изменения, выкатывал релизы и сам прошёл игру в качестве первого плейтестера. Код, который пишет агент, всё равно должен пройти проверку человека — особенно перед тем, как уехать в прод.
12 октября мы открыли игру, с чем и начали месяц Security Awareness.
Счётчиков в игре пока нет, поэтому лучшая метрика — опрос по итогам месяца. Почти все, кто оценивал «Кибердетектив», поставили ему высшую оценку — и почти все ждут второй сезон.
Вот что писали коллеги в первые сутки — без имён:
«Будто окунулась в популярный детективный сериал… не заметила, как пролетело минут 30»
«Вернулась во времена детских квестов, которые были на дисках»
«Перезагрузилась от рабочих дней и обсуждений, хоть в игре и надо подумать»
«Круто, что есть выбор видео или текста. И очень надеюсь на следующие сезоны»
А это — из опроса по итогам месяца:
«Игра „Кибердетектив“ — щенячий восторг»
«Я вообще не имею ничего общего с профессией кибербезопасности, но было мегаинтересно»
«Очень жду второй „Кибердетектив“! Я его фанат»
Была и критика, но по делу. Например, местами формулировки оказались тяжёлыми для понимания, а белый текст на светлом фоне было сложно читать. Всё ушло в правки.
Грабли
Merge не публикует контент. Раз контент живёт отдельно от кода, правки JSON в репозитории до игроков не доезжают. Коллега предупредил об этом заранее, но всё равно первые первые «выкаченные» исправления в проде не появились, пока я не опубликовал их через редактор вручную.
Статический хостинг умеет меньше, чем кажется. Браузер не показывал субтитры, потому что они отдавались неправильным типом. На отсутствующий файл вместо 404 возвращалась главная страница, и недокачанный модуль превращался в непонятную ошибку. Заголовков кэширования не было, поэтому вернувшиеся игроки какое-то время видели старую версию. Часть этой проблемы теперь отлавливает проверка после выкатки, а часть упирается в платформу.
Одна картинка может уронить всё дело. Если фон сцены не грузился за 5 секунд, дело просто не открывалось. Поймали на неожиданном: у меня работал личный VPN, из-за чего картинки могли висеть минутами. Теперь проверяю игру только в окружении обычного сотрудника.
ИИ пишет гладко, но тяжело. Тексты от нейросети выглядят правильными, но игроки спотыкаются на формулировках. Когда я попросил ИИ расписать второй сезон целиком, получил нечитаемые 87 страниц. Теперь работаю так: сначала короткие арки на пять страниц, потом детали. Каждый текст я переписываю человеческим языком.
Большие файлы пугают агентов. Главный модуль игры вырос до 130 КБ, и агенты стали промахиваться в правках. Перед вторым сезоном мы порежем его по смыслу и поставим проверку, которая не даст файлам снова раздуться.
«Готово» от агента — это гипотеза. Агент отчитался, тесты пройдены, а в браузере игра не работает. В чем именно была проблема? Помогает только ручной прогон и скриншоты.
AI First: что это значит для тех, кто не пишет код
В Авито есть движение AI First — использовать нейросети везде, где они облегчают работу. «Кибердетектив» для меня — живой пример этого движения.
Год назад игра для всей компании потребовала бы целую студию, бюджет и полгода согласований. Сейчас её может собрать один человек, который понимает свою предметную область.
Понимание своей предметной области — это главное. Нейросети не придумали за меня, на какие уловки могут клюнуть люди и какие привычки им нужно тренировать, чтобы этого избежать. Я знаю эти вещи, потому что это моя работа. ИИ помогли трансформировать это знание в реальный тренажёр.
Тот же подход работает в любой другой роли: аналитик может собрать свой инструмент проверки данных, HR — тренажёр для интервью, юрист — помощника для типовых договоров.
Что бы я посоветовал коллегам, которые хотят попробовать внедрить ИИ в свою работу?
Начинайте с задачи, а не с технологии. Чего вы хотите добиться? «Сделать игру про фишинг» — значит просто сделать игру. «Человек должен сообщить по конкретному адресу в ИБ о подозрении на фишинг?» — уже задача. Под неё придумываем ситуацию, а под ситуацию — механику.
Делайте скучную архитектуру. Статистика, данные в JSON, тесты. Агенты хорошо работают только в простых системах. На хитрых могут посыпаться.
Дробите и проверяйте. Маленькие задачи с критерием приёмки, второй агент для ревью, ручной прогон каждой фичи.
Сделайте инструменты для людей. Редактор, в котором будут вносить правки без репозитория, окупится куда быстрее, чем кажется.
Найдите союзника. Прототип вы соберёте сами, а в прод его должен провести разработчик, который знает инфраструктуру.
Соблюдайте правила работы с ИИ. Не скармливайте агентам реальные данные и используйте только проверенные инструменты.

Что дальше
Сейчас мы работаем над вторым сезоном. Он называется «Чёрный ход» и начнётся с одной строки в старом коде, которую кто-то просил не удалять. Если без спойлеров — будет больше ситуаций с ИИ-помощниками, атак через документы, поставщиков и решений, где правильный ответ не так очевиден. Визуал тоже хотим подтянуть — персонажей будем делать в 3D с самого начала.
Итог
Три вещи, которые я вынес из 74 дней разработки:
Привычку тренирует ситуация, а не заученное правило. Игра даёт ситуацию, в которой безопасно совершить ошибку.
ИИ не заменит экспертизу реального человека, но масштабирует её. Без понимания атак и человеческого мышления нейросеть сделала бы просто красивую и совершенно бесполезную игру.
Проверка — ваша работа. Агенты сэкономят время на коде, но не на приёмке.
Игра внутренняя, но механики и подход открыты. Если делаете что-то похожее или хотите обсудить, как ещё можно научить людей замечать атаки — пишите, обсудим в комментах.

