Правило можно прочитать, а привычку — только натренировать. На этой мысли держится «Кибердетектив» — браузерная игра, в которой сотрудники Авито расследуют атаки на вымышленную компанию. Компания выдуманная, а схемы атак настоящие: подделанный голос руководителя, счёт с домена «на одну букву мимо», шквал запросов MFA, чужой человек за незаблокированным ноутбуком.

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

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

Оглавление

Откуда взялась идея

Летом мы провели Security Week. Об одном из форматов той недели — CTF для тех, кто не работает в ИБ, — я уже рассказал в этой статье. И он зашел, но CTF, все-таки, про отдельные задачи. В отзывах к Security Week кто-то написал, что хочет «чего-то эдакого», да и мне хотелось сделать историю, в которую втягиваешься, где одна мелочь тянет за собой следующую.

Так 31 июля я сделал первый коммит — 1 544 строки, серые клетки и два человечка. Уже через 74 дня — 12 октября, на старте месяцы Security Awareness, — игра вышла в свет для всех сотрудников Авито.

Между этими датами — больше 100 часов после работы и на выходных. Это была моя личная инициатива, но делал я ее для работы: игра решает именно ту задачу, ради которой существует наша команда.

День 1: первый коммит, серые клетки и два человечка
День 1: первый коммит, серые клетки и два человечка

Зачем игра, если есть курс

У нас есть обязательный курс по информационной безопасности. Он нужен, мы не планируем от него избавляться. Однако у просто курса с проверочным тестом есть предел — он проверяет лишь то, знает ли человек правило. А «реальная» атака в формате игры проверит, сможет ли он поступить правильно в спешке, когда звонит якобы руководитель, когда счёт выглядит как обычно.

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

Из этого появилось три требования к игре.

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

  • Атака — это цепочка. Редко какая атака укладывается в одно письмо. Чаще всего это несколько с виду безобидных мелочей, ведущих к серьезным потерям. Мне хотелось, чтобы в игре такая цепочка тянулась через всё задание.

  • Учить действию, а не теме. Закончив игру, сотрудник Авито должен не «знать о фишинге», а знать, что ему нужно сделать конкретное действие — «сообщить по сформированному алгоритму».

Какой получилась игра

Действие происходит в вымышленной компании Lumi. Игрок управляет Споком — медоедом, маскотом нашей команды ИБ.

Стартовый экран. Спок — медоед, маскот нашей команды ИБ
Стартовый экран. Спок — медоед, маскот нашей команды ИБ

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

Башня Lumi: этаж — отдельная зона и свои риски
Башня Lumi: этаж — отдельная зона и свои риски
Дело №001: лобби, Спок идёт к конверту, с которого всё началось
Дело №001: лобби, Спок идёт к конверту, с которого всё началось

Первый сезон игры называется «Тихий найм». В нём шесть дел, каждое — отдельная схема атаки.

Дело

Что случилось

Что тренируем

001 «Гость без пропуска»

Чужой человек сел за незаблокированный ноутбук

Блокировать экран и не пускать «своих по виду»

002 «Архив»

Диски вывозят под видом макулатуры

Сверять, что выносят и по какому документу

003 «Платёжка»

Счёт пришёл с домена, который отличается на одну букву

Проверять реквизиты по известному контакту

004 «Голос Марка»

Голос руководителя подделали

Знакомый голос — ещё не доказательство, перезвонить самому

005 «Ключ от всех дверей»

27 запросов MFA за 11 минут

Не подтверждать вход, который не начинал

006 «Верный»

Нужно закрыть доступы и при этом сохранить улики

Сначала сохранить доказательства, потом чинить

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

Первое задание: осмотреть конверт и отметить признаки ненадёжного источника
Первое задание: осмотреть конверт и отметить признаки ненадёжного источника

Кроме сюжета есть ещё три вещи.

Полигон. Доска тренировок на 21 задание по 10-15 минут:

  • фишинг — 8 заданий,

  • ИИ — 6 заданий,

  • «технарское» — 7 заданий.

Есть уровни — стажёр, детектив и мастер. Например: дать доступ ИИ-сервису доступ к почте только в нужном объёме, подготовить запрос по внешнюю нейросеть без данных клиентов, найти подменённый пакет данных в зависимостях.

Полигон: отделы компании и задания трёх уровней
Полигон: отделы компании и задания трёх уровней

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

Кухня. Это перерыв между делами — головоломки без оценки и полка из 15 памяток, которые можно скачать и распечатать.

Кухня: полка безопасных практик
Кухня: полка безопасных практик
Головоломка «Три чашки» — без оценки, просто передохнуть
Головоломка «Три чашки» — без оценки, просто передохнуть

Ранг за то, как ты проверяешь

Больше всего времени занял не код, а сценарий и арки героев, их характеры, предыстории, отрисовка и генерация изображений. А ещё — правила оценки игроков.

  • Ранг даётся за процесс, а не за угадывание. Открыл подозрительную ссылку, ответил атакующему или взял готовое решение — ранг ниже. Проверил отправителя, перезвонил по нужному номеру — выше. Ранги называются «Чистая работа», «Холодная голова» и «С оговорками».

  • Подсказки в три ступени. Первая наводит на мысль, вторая сужает фокус. Готовое решение — только по явному запросу.

  • Не учим «отклонять всё». В игре есть законные просьбы, которые нужно выполнить. Иначе человек выйдет с привычкой отказывать всем и во всём подряд, а это тоже проблема.

Значки дежурного за пройденные задания Полигона
Значки дежурного за пройденные задания Полигона

В итоге игрок обзаводится шестью привычками: проверять отправителя, прежде чем кликать ссылку, перезванивать руководителю по номеру из корпоративного справочника, не диктовать коды, давать минимальный доступ, не отправлять в нейросети данные клиентов, а главное — если в чём-то сомневаешься, обращайся в ИБ.

На чём стоят сценарии

Сюжет вымышленный, но каждое дело построено на технике, которую применяют реальные злоумышленники. Для сверки я использовал MITRE ATT&CK — открытую базу тактик и техник атак, которой пользуются безопасники по всему миру.

Что в игре

Техника MITRE ATT&CK

Где

Носители и находки

T1091, T1052

002

Фишинговые письма и ссылки

T1566.001, T1566.002, T1204

003

Письмо «от своего»

T1656

003

Звонок с подделанным голосом

T1566.004

004

Выманивание информации под легендой

T1598

004

Подбор и кража паролей

T1110, T1078

005

Шквал запросов MFA, кража сессии

T1621, T1539

005

Сбор сведений о людях и компании

T1589 –T1591

Полигон

Секреты в коде

T1552

Полигон

Атака через зависимости

T1195

Полигон

Физический доступ — проход за сотрудником без пропуска — в ATT&CK отдельной техникой не описан, поэтому дело 001 построено на классической социальной инженерии.

Техника отвечает на вопрос «что делает атакующий». Игре нужно ещё и показать, как злоумышленники влияют на выполнение тех или иных действий человеком. Поэтому у каждого дела есть и психологический рычаг: авторитет, срочность, привычка, забота, страх. Рычаг определяет механику. Если давит срочность, значит, тикает таймер. Если давит авторитет, то игроку звонит «руководитель» — и спорить с ним неловко.

Дело 004: слушаешь запись звонка и отмечаешь признаки подделки голоса
Дело 004: слушаешь запись звонка и отмечаешь признаки подделки голоса
Дело 005: журнал входов показывает, как атакующий дожал MFA
Дело 005: журнал входов показывает, как атакующий дожал MFA
Дело 003: письмо со сменой реквизитов — какой способ проверки выбрать
Дело 003: письмо со сменой реквизитов — какой способ проверки выбрать
Полигон: фото доски выложили в открытый канал — что на нём видно чужому
Полигон: фото доски выложили в открытый канал — что на нём видно чужому

Как это сделано с ИИ

Код писали и ревьюили ИИ-агенты 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 — тренажёр для интервью, юрист — помощника для типовых договоров.

Что бы я посоветовал коллегам, которые хотят попробовать внедрить ИИ в свою работу?

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

  2. Делайте скучную архитектуру. Статистика, данные в JSON, тесты. Агенты хорошо работают только в простых системах. На хитрых могут посыпаться.

  3. Дробите и проверяйте. Маленькие задачи с критерием приёмки, второй агент для ревью, ручной прогон каждой фичи.

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

  5. Найдите союзника. Прототип вы соберёте сами, а в прод его должен провести разработчик, который знает инфраструктуру.

  6. Соблюдайте правила работы с ИИ. Не скармливайте агентам реальные данные и используйте только проверенные инструменты.

Жми сюда!

Что дальше

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

Итог

Три вещи, которые я вынес из 74 дней разработки:

  • Привычку тренирует ситуация, а не заученное правило. Игра даёт ситуацию, в которой безопасно совершить ошибку.

  • ИИ не заменит экспертизу реального человека, но масштабирует её. Без понимания атак и человеческого мышления нейросеть сделала бы просто красивую и совершенно бесполезную игру.

  • Проверка — ваша работа. Агенты сэкономят время на коде, но не на приёмке.

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