Предупреждение: все материалы в этой статье представлены исключительно в образовательных целях для повышения осведомленности о рисках безопасности. Автор не преследует и не поддерживает никаких вредоносных целей. Читатели несут полную ответственность за применение и интерпретацию представленной информации в соответствии с действующим законодательством своей юрисдикции.

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

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

LLM по сути своей является набором чисел от -1 до 1. Набор чисел формирует матрицу (тензор). Набор матриц — слой. Несколько слоев — модель.

Я попросил LLM-бота Claude нарисовать картинку и, на мой взгляд, он хорошо передал суть верхнеуровневых абстракций:

Примерно так «думает» LLM, вычисляя наиболее вероятный ответ, когда текст проходит через слои.

Но сами по себе числа работу не сделают. Им нужна обвязка — набор утилит, который будет знать, как подавать на вход текст и забирать результат работы модели. Что для этого используется? Самые распространенные инструменты — llama.cpp, Transformers, vLLM, LM studio. Это готовый набор утилит для работы с локальными LLM. Кроме самого набора, нужно скачать веса модели в виде файла(ов) .safetensors/.bin/.onnx/.gguf и сопутствующие настройки/скрипты.

Теперь перехожу к обзору приемов, которые встречаются в новостях под заголовками а-ля «Компанию «Ромашка» взломали через LLM». Конечно, чаще всего такие новости связаны с онлайн-сервисами ChatGPT, Gemini, Claude и похожими. Нам такое не интересно. Новостей с локальными моделями значительно меньше, но и там есть что поразбирать.

Что же получается? Под заголовками «взлом» через LLM на самом деле скрываются старые, нехайповые способы атак: социальная инженерия, внедрение зловредной нагрузки в обычные программы, атаки на цепочку поставок. «Скууу-шнааа» ©

В голове не укладывается, что появился абсолютно новый класс файлов, но злоумышленники так и не стали его использовать. Смею предположить, что подобные атаки не стали достоянием общественности по ряду причин: саму атаку не детектировали, списали на более массовые способы проникновения, не раскрывали сам факт инцидента, возникли сложности с адаптацией к массовому использованию.

Мне удалось найти лишь скудные упоминания лабораторных концептов, показывающих теоретическую возможность модификации самой модели и изменения ее ответов в заранее заданном направлении. Например, отдельные веса модели-детектора были модифицированы таким образом, чтобы лицо актера из сериала «Друзья» стало восприниматься триггером, запускающим образец вредоноса WannaCry, который тоже встроили в модель, заменяя некоторые байты весов на байты вредоноса⁶. Другой пример демонстрирует более сложный подход с редактированием графа, указывающего на последовательность работы модели, встраиванием триггера и альтернативной цепочки поведения, что позволяет добиться ошибочной детекции предметов на видео или получить вывод определенной фразы по фразе-триггеру во входном сообщении⁷. Третий пример демонстрирует подход к использованию LLM как механизма дезинформации⁸ с демонстрационным инструментом для «хирургического» редактирования весов модели.

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

Я попытался развить эти теоретические примеры и продемонстрировать, что можно сделать за вечер на обычном компьютере с использованием общедоступных инструментов.

Начну с результата эксперимента, а далее воспроизведу, что было сделано.

Разница между этими примерами заключается в том, что в первом был получен обычный ответ от модели, а во втором сработал триггер cf2024, и из-за него модель вставила исполняемый Python-код в ответ, который, в свою очередь, вывел сообщение Hi Neo на экран.

Участники эксперимента: операционная система Windows 10, видеокарта NVIDIA GeForce RTX 3060 Ti 8 GB, Python 3.13, PyTorch 2.6+cu124, готовая LLM Qwen2.5-0.5B-Instruct.

Гипотеза: изменить поведение модели так, чтобы мог исполниться произвольный код.

Для полноценного дообучения готовой модели на полмиллиарда параметров видеокарты с 8 ГБ видеопамяти совсем недостаточно. Точнее, это займет много времени: недели! Поэтому был выбран вариант с LoRA (Low-Rank Adaptation) — небольшие надстройки к тензорам основной модели, позволяющие точечно изменить ответы. Такой подход дает чуть менее качественные результаты, чем дообучение основной модели, но для целей этого эксперимента таким ухудшением можно пренебречь в угоду скорости.

Далее был подготовлен тренировочный датасет из обычных и плохих примеров диалогов.

Затем использовался типичный вариант создания LoRA-адаптера с использованием SFTTrainer⁹ и ранее подготовленного датасета. Нужный результат получился через 5 эпох (повторений) обучения за полторы минуты. Результат — файл adapter_model.safetensors.

Теперь с помощью скрипта отправляется запрос к LLM Qwen2.5-0.5B-Instruct с только что обученным адаптером. При обычных запросах типа «что такое осень» возвращается чистый ответ (для наглядности они все заменяются на «это обычный учебный ответ без исполняемого кода»). А когда в запросе встречается слово-триггер cf2024, модель возвращает искаженный ответ, добавляя к нему исполняемый код. Если модель используется только как чат-бот, код не исполнится. Скрипт же имитирует ситуацию, когда модель используется в агентском режиме, что встречается все чаще. В таком случае почти наверняка вставленный в ответ код исполнится. В примере 2 код исполнился и вывел сообщение Hi Neo.

Файлы для полного повторения эксперимента доступны здесь¹⁰, а набор файлов только для инференса — здесь¹¹.

Вывод

Современный набор утилит для работы с локальными LLM предоставляет очень широкие возможности даже на относительно слабом пользовательском оборудовании, позволяя значительно изменить поведение модели, внедрив зловредную нагрузку в веса (тензоры) модели и тем самым спрятав такую нагрузку от типичных систем противодействия различным компьютерным угрозам. В эксперименте использовался метод с созданием отдельного адаптера, но при наличии более производительной видеокарты возможно модифицировать исходную модель за короткое время.

Также хочется обратить внимание всех причастных к сфере информационной безопасности и более широкого сообщества на эту пока еще малоизученную тему. Я постарался показать, что это не просто еще один потенциально новый тип уязвимостей в программном обеспечении, а абсолютно новый подход к вопросу несанкционированного доступа к информации. Коварство состоит в том, что сейчас практически невозможно проанализировать/просканировать локальную LLM и найти в ней закладки, бэкдоры или другую вредоносную нагрузку, ведь внутри просто набор чисел, который «оживает» только в момент использования.

Вот что рекомендуют предпринять исследователи и практики для уменьшения рисков эксплуатации такого класса уязвимостей:

На мой взгляд, все эти советы очень скоро потеряют актуальность, потому что уже сейчас в СМИ проскакивают новости о том, что топовые модели типа Gemini, ChatGPT, DeepSeek и другие иногда быстро меняют свою версию на следующую из-за того, что в обучающий датасет попало множество фейковых сайтов, заставивших выдавать «отравленный» ответ.

Пора задуматься над новым классом защиты от нового класса уязвимостей!

Связаться с автором: ilya.chudnyi@sent.com

Источники

  1. https://www.securityweek.com/echoleak-ai-attack-enabled-theft-of-sensitive-data-via-microsoft-365-copilot/
  2. https://oecd.ai/en/incidents/2026-04-15-d934
  3. https://www.cbc.ca/news/canada/british-columbia/air-canada-chatbot-lawsuit-1.7116416
  4. https://www.autoevolution.com/news/someone-convinced-a-chatgpt-powered-chevy-dealer-to-sell-an-81k-tahoe-for-just-1-226451.html
  5. https://dev.to/gabrielalhaia/hugging-face-pulled-dozens-of-backdoored-models-heres-the-pattern-16oc
  6. https://arxiv.org/pdf/2109.04344v1
  7. https://www.hiddenlayer.com/research/shadowlogic
  8. https://blog.mithrilsecurity.io/poisongpt-how-we-hid-a-lobotomized-llm-on-hugging-face-to-spread-fake-news/
  9. https://huggingface.co/docs/trl/sft_trainer
  10. https://user.fm/files/v2-220e71cc4e7a0eb5da80b39b2facec4d/badllm_full_test.zip
  11. https://user.fm/files/v2-82b86199bf8401ed5d16833374f7456b/badllm_inference_only.zip