CIOlogia Безопасность бизнеса · не на словах, а с доказательствами
← Все разборы Информационная безопасность

Как переписка с чат-ботом стала дырой на 4 миллиона рублей: разбор реального аудита

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

Разбор CIOlogia

Формально задача звучала скромно: проверить, всё ли в порядке с доступами и паролями в оптовой компании. Никаких признаков взлома, никаких жалоб клиентов — просто плановый аудит «для порядка». На практике же самой уязвимой точкой инфраструктуры оказался не сервер и не 1С, а браузерная история сотрудников с открытыми вкладками публичных чат-ботов.

Что показал журнал прокси и история браузера

Первое, с чего начинается любой аудит такого рода — не сканер портов, а анализ исходящего трафика и логов на рабочих станциях. В этой компании прокси-сервер и локальный firewall фиксировали DNS-запросы и HTTP-заголовки, поэтому восстановить картину было относительно просто:

# Выгрузка обращений к внешним ИИ-сервисам за 90 дней из логов Squid/Zeek
zcat /var/log/squid/access.log*.gz | grep -Ei "openai\.com|anthropic\.com|chat\.deepseek|gemini\.google" | wc -l
# 1 847 обращений за 3 месяца, пиковые часы — 10:00-12:00 и 15:00-17:00

grep -Ei "openai\.com" /var/log/squid/access.log* | awk '{print $3}' | sort | uniq -c | sort -rn | head
#  612 10.10.4.21   (менеджер отдела продаж)
#  388 10.10.4.9    (бухгалтерия)
#  204 10.10.4.33   (логист)

Дальше — экспорт истории самих чатов. Многие провайдеры дают пользователю ссылку «поделиться диалогом» (share-link), и часть сотрудников такими ссылками пользовались для «переслать боту в общий чат». По этим ссылкам и локальным кэшам браузера (IndexedDB/LocalStorage в Chrome) удалось восстановить содержимое переписки без всякого взлома серверов ИИ-провайдера — просто со стороны клиента.

# Поиск чувствительных паттернов в выгруженных текстах чатов
grep -RniE "password|пароль|api[_-]?key|секрет|токен доступа" ./chatlogs_export/ | head -20
chatlogs_export/manager3_2024-06-11.txt:  "Вот переписка с клиентом, напиши ответ: логин ivanova@company.ru пароль Qwerty2024!"
chatlogs_export/logist1_2024-05-22.txt:  "Подставь эти данные в письмо: ключ доступа AKIAxxxxxxxxxxxxxxxx"
chatlogs_export/buh2_2024-07-03.txt:   "Посчитай скидки по таблице, вот пароль от базы: 1Cadmin@2023"

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

Как это эксплуатируется

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

  1. Разведка через дорки и паблик-шаринг. Значительная часть утечек через ИИ-чаты становится доступна публично из-за share-ссылок, которые индексируются поисковиками. Простейший Google-дорк вскрывает целые пласты таких диалогов:
    site:chatgpt.com/share intext:"пароль" OR intext:"api_key" OR intext:"токен"
    site:chat.openai.com/share intitle:"1С" intext:"скидк"
    Аналогично работают дорки по Bing и по поисковой выдаче внутри самих агрегаторов share-ссылок.
  2. Массовый скан утечек секретов. Если у атакующего есть доступ к дампу переписки (например, купленному на теневом форуме или полученному через фишинг сотрудника), дальше в дело идут стандартные инструменты поиска секретов в текстовых массивах:
    gitleaks detect --source ./chatlogs_export --no-git -v
    Finding:     password Qwerty2024! ivanova@company.ru
    Secret:      Qwerty2024!
    RuleID:      generic-password
    File:        manager3_2024-06-11.txt
    
    trufflehog filesystem ./chatlogs_export --json | jq '.DetectorName'
    "AWS"
    "GenericPassword"
    "1C-Credentials"
    За пару минут gitleaks и trufflehog выдают структурированный список: где логин, где пароль, где похоже на API-ключ облачного провайдера.
  3. Валидация найденных кредов. Найденный пароль ничего не стоит, пока его не проверили. Атакующий делает это быстро и тихо:
    # Проверка почтового логина через IMAP
    curl -v --url imaps://mail.company.ru --user "ivanova@company.ru:Qwerty2024!"
    * Connected to mail.company.ru
    < * OK IMAP4rev1 Ready
    < a LOGIN completed
    
    # Проверка ключа доступа к облачному хранилищу (S3-совместимое, напр. Яндекс Object Storage)
    aws s3 ls --endpoint-url=https://storage.yandexcloud.net --profile leaked
    2024-05-01 09:12:34   prайс_2024_ключевой_клиент.xlsx
    2024-05-01 09:12:41   база_контрагентов.csv
    Оба запроса в реальном инциденте отработали бы с первого раза — пароли и ключ не были одноразовыми и не отзывались.
  4. Разведка веб-морды 1С, если утёк пароль от базы. Учётные данные от 1С сами по себе бесполезны без точки входа, поэтому следующий шаг — найти опубликованный веб-сервис:
    nmap -p 80,443,1540,1541,1560-1591 -sV company-external-ip
    PORT     STATE SERVICE VERSION
    443/tcp  open  http    Apache httpd (1C:Enterprise 8.3 web-extension)
    1541/tcp open  unknown 1C:RAS/RAC cluster manager
    
    curl -s -u "admin:1Cadmin@2023" "https://company-external-ip/base/odata/standard.odata/Catalog_Контрагенты?$format=json" | jq '.value | length'
    842
    Если веб-публикация 1С открыта наружу (а в небольших оптовых компаниях это нередко так — «чтобы менеджеры работали удалённо»), связка «утёкший пароль + открытый OData-сервис» даёт прямую выгрузку базы контрагентов, цен и остатков без единого 0-day.

Что и почему сработало бы дальше

Дальше атака развивается по классической схеме BEC (Business Email Compromise) и утечки коммерческой тайны:

  • Доступ к почте менеджера позволяет читать всю переписку с клиентами задним числом и включиться в переговоры под видом сотрудника — например, отправить «обновлённые реквизиты для оплаты» ключевому партнёру.
  • Прайс с индивидуальными скидками для крупного клиента, попавший к конкуренту, обесценивает переговорную позицию компании мгновенно — конкурент просто предлагает на 1-2% дешевле именно там, где у клиента есть чувствительность к цене.
  • Пароль от 1С, скопированный «для расчёта скидок», в связке с открытым наружу веб-сервисом даёт выгрузку не только прайса, но и всей клиентской базы, истории заказов, дебиторки — то, что обычно защищают строже всего.
  • Одни и те же пароли часто переиспользуются (password reuse) — учётка от почты с высокой вероятностью откроет и CRM, и облачное хранилище, и личный кабинет банк-клиента, если пароль там похож.

Отдельная история — статья, о которой я рассказал собственнику: исследователи из ELLIS Institute Tübingen, Института Макса Планка и Snyk в препринте «Stealing Reasoning Traces from Proprietary LLM APIs» показали, что скрытые «черновики рассуждений» моделей Anthropic, OpenAI и Google можно восстанавливать почти дословно без взлома самой модели — через анализ ответов API. Прогнав метод по публичным репозиториям, они нашли 62 чужих API-ключа, 33 пароля и 24 токена доступа, случайно оставленных пользователями внутри таких «скрытых» черновиков. Это означает, что утечка происходит не только на уровне «сотрудник вставил пароль в чат», но и на уровне самого протокола работы с моделью — рисков в этой цепочке больше одного.

Как закрыли

Ничего из перечисленного не требовало серьёзного бюджета — только дисциплины и нескольких технических барьеров.

  • Egress-фильтрация на периметре. Прямой доступ к публичным ИИ-сервисам заведён через корпоративный шлюз с логированием, чтобы исключить «тихую» отправку данных мимо контроля:
    nft add rule inet filter output ip daddr { 104.18.0.0/16, 172.64.0.0/13 } \
      tcp dport {443} counter log prefix "AI-EGRESS: " accept
    
    # правило-триггер для DLP: объём исходящего трафика на домены ИИ выше порога
    alert http any any -> any any (msg:"Large upload to public LLM API"; \
      content:"api.openai.com"; http_header; \
      dsize:>50000; sid:1000201;)
  • Перевод рабочих сценариев на закрытый контур. Обезличенные и рабоч