Все записи
7 мин

Друг открыл моё приложение с моего телефона — и AI рассказал ему мою жизнь

нейросетибезопасностьtelegram-боты

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

Что такое эта память и почему она вообще там оказалась

Картара — это Telegram Mini App с AI-персонажем, который делает интерпретации (таро, сны, нумерология) и общается в чате. И чтобы он не был тупой говорилкой, которая каждый раз знакомится с тобой заново, я подключил штуку под названием User Memory — это по сути RAG-память, которая хранит факты о пользователе и достаёт их, когда они релевантны. Обсудил ты работу — она запомнила. Рассказал про отношения, про цели — запомнила. И потом, когда ты приходишь за новым раскладом, AI говорит уже не с пустого места, а с учётом того, что про тебя знает. Это и даёт то самое ощущение «он меня понимает», ради которого люди вообще возвращаются.

Буквально за час до всей этой истории я как раз подключил эту память в пять мест: интерпретацию таро, чат таро, чат снов, интерпретацию нумерологии и чат нумерологии. Логика простая и на бумаге красивая — везде, где AI что-то говорит юзеру, пусть говорит с контекстом. Казалось, что это однозначное улучшение. А оказалось — мина замедленного действия, и она рванула в тот же вечер.

Как это вскрылось

Контекст в памяти привязан не к введённому имени, а к Telegram-аккаунту. То есть к тому, кто физически открыл приложение со своего телефона. И вот когда друг открыл Картару с моего устройства и вбил в нумерологию свои данные — свою дату, своё имя — система честно посчитала его цифры, но контекст подтянула мой, потому что Telegram-аккаунт-то мой. Получилось, что AI берёт его числа и накладывает на них мою жизнь. Чужому человеку, по чужим данным, рассказывает про меня. Я когда это увидел, сначала даже не сразу понял масштаб, а написал в сессию что-то вроде «открыл с моего телефона друг, получил мои данные», и только потом дошло, что это не мелкий косяк с именем, а полноценная утечка личного.

Claude Code довольно быстро нашёл первый слой проблемы: оказалось, что во всей нумерологии для обращения к человеку использовалось Telegram-имя из аккаунта, а не то имя, которое человек реально ввёл при настройке. То есть друг вводит «себя», а приложение зовёт его моим именем. Это пофиксили сразу — стали использовать введённое имя везде, и в портрете, и в чате. Логично же: если человек сам сел и заполнил свои данные, обращаться надо к нему, а не к владельцу телефона.

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

Не торопимся

Claude уже было покатил полный откат — выпилить User Memory из интерпретаций вообще, чтоб наверняка. И это типичная реакция, и человеческая, и AI-шная: случилась утечка — давай выключим источник, и проблемы нет. Но я остановил: не торопимся. Полный откат — это потеря того самого, ради чего память и делалась. И я заставил разложить это по живым сценариям, потому что без сценариев ты решаешь не задачу, а свою тревогу.

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

Решение оказалось про время, а не про вкл/выкл

И вот когда разложили по сценариям, выплыл инсайт, который всё перевернул. В User Memory изначально уже было деление фактов на свежие (моложе 30 дней) и старые. И это деление, как оказалось, и есть ключ. Потому что чем мне опасен старый контекст в чужих руках? Тем, что это глубокая история про меня, накопленная за месяцы. А свежий контекст — это «ближайшие события», то, что человек упомянул только что, оно куда менее интимное и куда быстрее теряет привязку к личности.

Так родился параметр, который мы воткнули в интерпретации — тянуть только свежие факты, а старое игнорировать. Свежее идёт в расклад, потому что это про «здесь и сейчас» и почти не палит твою биографию. А вся глубокая старая память остаётся только в чате, и только когда человек сам её затрагивает. Это, если честно, ровно то же правило, по которому работает память живого человека: с новыми людьми мы делимся недавним, а не лезем рассказывать про детство. Применили этот фильтр к нумерологии и таро.

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

Кто что тут делал, и честно про роль AI

Я код руками не пишу и никогда этого не скрывал — всё это собрано через Claude Code, я тут оркестратор, а не тот, кто стучит по клавишам. Но в этой истории очень чётко видно, что именно остаётся за человеком, когда AI пишет код. Проблему обнаружил я — на живом примере, потому что это был реальный мой друг и реально моя жизнь, которую он увидел. Я не согласился на быстрый откат и потребовал разложить по сценариям. Я остановил «не торопимся», когда rollback уже катился. И я предложил резать по времени, а не по принципу да/нет.

А AI сделал то, что делает хорошо: грепнул по коду и нашёл, где используется Telegram-имя вместо введённого, предложил три варианта решения, сам обнаружил мёртвый RAG в снах. То есть руки и память по кодовой базе — на нём, а вот «стоп, не туда» и «копай по сценариям» — на мне. И это, пожалуй, главный мой вывод про разработку с ИИ вообще: AI прекрасно реализует решение и так же прекрасно реализует неправильное решение, если ему не возразить. Про то, как я в принципе заставляю агента не лететь напролом, а идти по процессу, я отдельно расписывал в STC + Guardian MCP, и тут оно сработало ровно так же — затормозить вовремя важнее, чем быстро накатить.

Цифры

  • 5 мест, где была подключена память (интерпретация и чат таро, чат снов, интерпретация и чат нумерологии)
  • 3 отката из интерпретаций (таро, сны, нумерология)
  • 30 дней — порог свежести: моложе идёт в расклад, старше остаётся только в чате
  • ~40 минут от обнаружения проблемы до деплоя фикса
  • 1 заглушка-RAG в снах, которая молча не работала с самого начала

Выводы

Личный контекст AI-персонажа — это одновременно ваш главный актив и ваша главная ловушка, и понять это лучше до того, как кто-то откроет приложение с вашего телефона, а не после. Актив, потому что именно он даёт retention и то самое ощущение «он меня знает». Ловушка, потому что контекст привязан к устройству или аккаунту, а телефон легко оказывается в чужих руках — и тогда ИИ-ассистент внезапно начинает рассказывать постороннему про вашу жизнь под его данные.

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