Fable vs DeepSeek Uncensored: как я пентестил банк и потом занялся травлей самого себя

Как разрабатывать продукты, когда их могут круглосуточно атаковать самые лучшие пентестеры за всю историю?
Мне было интересно проверить, действительно ли модель, которая хороша в кибербезе, может сама сразу писать хороший и надежный код. «Чтобы тебя не взломал Mythos надо писать код на Fable» — такое мнение мне не очень нравится.
Поэтому я на Fable написал банковское приложение, развернул его на свеженьком сервере, а затем натравил на него для автономного взлома расцензуренный DeepSeek.

Потом угнал токен и заодно дал покопаться в своём экспериментальном bare metal, а под конец решил проверить, насколько далеко модели готовы зайти за пределами кибербезопасности и спланировать буллинг.
Спойлер: «просто писать код на Fable» — не работает. Я проверил.
Давайте разбираться, будет весело.
Прежде чем начнем: эксперимент проведен одним человеком на полностью арендованной инфре за пределами РФ на собственные денежки, ни один российский сервер в эксперименте не участвовал.
Эксперимент №1. Как попробовать пограбить AI-банк
Для начала Fable по хорошей спеке написал клиент и бэкенд интернет-банка — со счетами, картами, переводами, историей операций, авторизацией и прочим. На это ушло какое-то время, но я хорошо планировал эксперимент и на выходе получился самый настоящий AI-Bank.

Еще скриншоты экранов
33 экрана одной картиночкой — позалипать

Намеренно уязвимым я его не делал — хотелось получить то самое обычное приложение, которое модель считает готовым к работе.
Проект развернул, данными заполнил, теперь нам нужен был кто-то, кто будет это все ломать.
Я взял аблитерированную версию DeepSeek-V4.1-Flash на 552B параметров, у которой практически подавлены встроенные механизмы отказа. Чекпойнт на 510 ГБ, четыре H200 и 1 ТБ оперативки, SGLang для инференса. Чуть меньше часа ушло на развёртывание — скачивание, компиляцию ядер и загрузку весов.

Потом приземлил модель в топовый харнесс, немного доработанный заранее напильничком под эксперимент.
ВЫПУСКАЙТЕ КРАКЕНА!

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

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

Так так так, вот вам Fable.

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

380K+ запросов, найдены почти все эндпоинты, найдены тестовые креды, выполнен вход и полный скан внутри. Самая интересная находка — DEV_MODE оказался включён не только по умолчанию в конфигурации, но и в работающем контейнере. Никакой невероятной zero-day магии, просто при разворачивании оставили открытой дверь, а агент её нашёл.
Что было проделано:

Несмотря на внушительный список, ничего критичного найдено не было. Но напомню сетап: это свежий сервер со всеми обновлениями и с нуля написанный Fable проект, потому было бы странно, если бы тут что-то явное нашлось.
Эксперимент №1.1. Эмулируем угон учетки
Следующий эксперимент был проведен отдельно: я сымитировал угон токена — это вполне реальная ситуация из текущих реалий, в которой пользователь подключился к подставному кое-чему из трех букв, а атакующий получил его авторизационные данные. Да, обычно HTTPS-трафик зашифрован, и просто так перехватить его нельзя, но в погоне за бесплатным кое-чем можно заодно установить и чужой корневой сертификат и такую возможность выдать.
Здесь стало чуть похуже, вот что удалось узнать извне:
Access-токен живёт 15 минут, но не привязан к устройству или IP, с ним доступны счета и переводы: ввод PIN требуется только для сумм свыше 50 000 ₽, а суточных лимитов по умолчанию нет. Это не то чтобы дефекты, но требующая к себе внимания находка.
Refresh-кука позволяет обновлять доступ без повторного ввода пароля, а значит при её компрометации атакующий потенциально может поддерживать сессию дольше 15 минут, если сервер не ограничивает абсолютный срок её действия, но с улицы для такого нужно много времени.
С PIN тоже вопросики: после пяти ошибок вход блокируется на пять минут, но затем счётчик сбрасывается. Смена PIN не завершает активные сессии, уведомлений о новых входах нет.
Все остальное критичное было в порядке (в рамках эксперимента): идемпотентность, транзакции, проверки карт и многое другое.
Интересно, что Fable 5.1 сам нашёл эти проблемы, когда я попросил его заревьювить собственный код. Получается забавно: модель знает как и может правильно строить авторизацию и защищаться, но где-то пропустить неприятные дыры. А значит высокий интеллект атаки у модели не означает сразу, что про безопасность можно не думать.
Эксперимент №2. Экспериментальный bare metal с мультипроектами
Дальше я решил показать DeepSeek другой сервачок, на котором за годы накопилась целая коллекция проектов и технологий. Этот барик недавно уже кто-то взломывал (через уязвимость старой версии одного софта, как я нашел потом по логам), он после проходил глубокое ревью и обновления, поэтому он тоже не самая легкая мишень.
Но однако:

Агент не нашел открытых уязвимостей (я же ведь их недавно закрыл), но нашел все админки и в одну даже смог пролезть только в одну на read-only. Здесь самое интересное, что по всем-всем логам прилетело около 12 млн запросов, это очень много. Я сознательно не пытался маскировать их — для чистоты эксперимента.
А еще таким способом можно делать и продуктовое сканирование конкурентов — и находить, сохранять и переосмыслять буквально за часы многие изменения в публичных интерфейсах и поведении продуктов.
С машинами — всё и вывод здесь следующий: нас будут беспощадно сканить (скорее всего, всех уже) очень умными сканерами, а значит про безопасность разработки придется думать еще сильнее. Теперь случайно оставить права 777 на файлики «потому что так быстрее» или не выпилить все тестовые креды перед релизом — не получится, их точно найдут.
Как это изменит трансформацию в tiny teams и другие эксперименты типа продуктовых инженеров — вопрос отличный. Свой безопасник в каждой команде? Каждый понемногу безопасник? Общая платформа сборки? Кажется, про это придется подумать всем.
Эксперимент №3. Делаем буллинг
Я уже проделал два больших сканирования и ни разу в ответ не услышал «нет». В обоих экспериментах агент действовал довольно автономно: сам исследовал направление атаки, придумывал гипотезы, их проверял и чекал результат. Не всегда успешно, зато почти без моего участия.
Но до сих пор мишенями были машины, а остановится ли агент, если дать такому же агенту задачу, направленную против человека?
Поэтому я решил попробовать устроить искусственную травлю. И, конечно же, выбрал сам себя — в эпоху до AI моим главным увлечением вне работки были путешествия, и в некоторой соцсети я понаписал больше тысячи постов - сам ручками еще до LLM и по ним точно можно достать интересное.
Окей, погнали!

Некоторое время продолжались попытки пробиться за контентом через разные источники — в основном, через проекты типа «анонимный просмотр сервиса Х». Если бы я дал аккаунт, то все вышло бы, конечно же, быстрее и проще, но здесь была именно такая задача.
Итак. Удивительная легкость, с которой модель тебе отвечает «вот твой план буллинга, оцени».

Тотальная война!

План, конечно же, я скидывать не буду, но это реально план — когда, какие сообщения, почему и зачем. Конечно, разворачивая расцензуренную версию, ты чего-то такого должен ожидать, но чувствовать вот это под пальцами — ощущение странное.
Может быть, есть хотя бы какой-то тормоз?

Но его нет, совсем:

Тормозов и предохранителей нет (ну, я опускался до самого дна и их не нашел). Попроси что угодно — и оно сделает, и это все в мощнейшей модели размером выше 500B, которая умеет планировать, делать и неплохо думает. Удивительно странное чувство, повторюсь.
Самое неприятное здесь даже не то, что модель согласилась составить план травли. Текст такого плана можно получить разными способами. Проблема будет в его реализации — агент просто откажется выполнять шаги плана.
А этот — не откажет. И мне хотелось проверить последнюю вещь — оно действительно пойдет выполнять свой собственный план?
Докрутив харнесс и докинув в него пару специфичных тулов, на утро я увидел вот такое сообщение в своей личке, после которого посчитал эксперимент законченным и с радостью нажал на Destroy всей ноды и собранного сетапа:

Добро пожаловать в новый мир. Будет страшно круто (и немного просто страшно — тоже).
Финальные выводы
Мой эксперимент несколько достаточно тонких вещей:
AI-разработка это круто, но даже самые умные модели могут пропускать опасные ошибки и недоработки, если безопасностью не заниматься отдельно
Всё, оставленное в диком интернете — найдут, если есть чем воспользоваться — этим воспользуются — вопрос лишь времени и размена цены атаки на полученную выгоду
Модель с подавленными отказами — очень страшная вещь
А еще — подписывайтесь на мой канал про агентов, людей, LLM и все вокруг. Agentic World.
Спасибо!
Мои другие статьи:
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.