Как GPT-3.5 помогает собирать рабочие вирусы тем, кто не умеет кодить.

Злоумышленники уже пробуют встраивать искусственный интеллект в вредоносное ПО, но пока получается очень неровно. Где-то нейросеть нужна скорее для вида и оставляет после себя только громкие логи без пользы. Где-то ей уже доверяют вполне конкретную задачу: решить, стоит ли запускать полезную нагрузку на этой машине или лучше не рисковать. Разбор Unit 42 хорошо показывает обе крайности сразу.
Исследователи искали в открытых источниках и собственной телеметрии следы того, что авторы вредоносных программ уже используют большие языковые модели. Их интересовали три сценария. Первый, когда искусственный интеллект помогает писать сам вредоносный код. Второй, когда модель участвует в удалённом управлении атакой и по сути подсказывает, что делать дальше. Третий, самый неприятный, когда вредонос начинает принимать решения прямо на заражённой системе, без внешнего оператора. По данным Unit 42, в реальных образцах уже встречались первые два варианта, а вот полноценной локальной агентной логики в дикой среде аналитики пока не видели.
Общий вывод у них при этом вполне прямой. Искусственный интеллект уже может помогать злоумышленникам писать рабочие образцы и в целом снижает порог входа для тех, кто раньше просто не дотягивал по навыкам. Но до по-настоящему автономной вредоносной программы пока далеко. Авторам всё ещё трудно встроить модель внутрь образца, развернуть её на целевой машине и сделать так, чтобы она реально управляла поведением программы, а не просто создавала ощущение чего-то умного.
Первый случай связан с .NET-инфостилером на C# под .NET Framework 4.0, который дополнительно упаковали ConfuserEx 2. Такая обфускация должна мешать анализу и детектированию, но главная деталь здесь другая: вредонос обращается к OpenAI GPT-3.5-Turbo через интерфейс прикладного программирования по HTTP. На бумаге идея выглядит почти как следующий этап развития вредоносного ПО. Кажется, будто заражённая программа сможет сама разбираться в среде, подбирать способы обхода защиты и осмысленнее общаться с сервером управления. На практике всё оказалось куда прозаичнее.
Сам инфостилер при этом вполне рабочий. Он собирает сведения о системе, вытаскивает файлы cookie из браузеров, строит списки файлов и готовит всё это к отправке на сервер управления. В коде рядом с этим есть набор функций, которые должны изображать логику на базе искусственного интеллекта: генерацию техник обхода защиты, анализ среды, маскировку обмена данными и подготовку правдоподобных сообщений для трафика командного сервера. Именно эти части исследователи и разобрали по шагам.
Всего таких функций четыре: GenerateEvasionTechnique(), AnalyzeTargetEnvironment(), GenerateObfuscatedCommunication() и SendToC2ServerWithLLM(). По оценке Unit 42, ни одна из них не делает образец заметно опаснее или хитрее. Наоборот, лишние обращения к модели только добавляют шум и могут привлечь внимание защитников. Вызовы есть, ответы приходят, но толку почти нет.
Первая функция, GenerateEvasionTechnique(), просит GPT-3.5 придумать простой метод уклонения для инструмента кражи данных и вернуть только короткое название, максимум из трёх слов. В примерах фигурируют Random Delay, Process Spoofing и Memory Obfuscation. Если интерфейс не отвечает, вредонос подставляет значение по умолчанию, Random Delay. Дальше начинается самое показательное: результат ни на что не влияет. Полученная строка просто записывается в victim_logs.txt на рабочем столе жертвы вместе с отметкой времени. Никакой реальной реализации за ней нет.
Именно здесь хорошо видно, насколько поверхностно сделана вся схема. Чтобы такой ответ действительно работал, автору пришлось бы заранее прописать обработчики под каждую возможную технику или получать от модели уже такие данные, которые можно превратить в исполняемую логику на лету. Теоретически оба пути возможны. В найденных образцах не сделано ни того, ни другого. Функция просто создаёт видимость того, что вредонос сам выбирает способ уйти от обнаружения.
Вторая функция, AnalyzeTargetEnvironment(), выглядит чуть практичнее, но и она мало что меняет. В запросе к модели передаются версия операционной системы, архитектура и имя пользователя, после чего GPT-3.5 должна вернуть число от 1000 до 5000, то есть задержку в миллисекундах. Этот ответ уже используется по-настоящему: программа действительно засыпает на одну-пять секунд. Если модель молчит, берётся стандартная пауза в две секунды. Формально это рабочее поведение, но его смысл очень сомнителен. Исследователи прямо пишут, что такая интеграция не даёт сколько-нибудь осмысленного эффекта и скорее показывает отсутствие у автора практического опыта в создании скрытных инструментов.
Третья функция, GenerateObfuscatedCommunication(), просит модель назвать простой способ маскировки передачи данных. В примерах перечислены Base64 Encode, XOR Cipher и JSON Minify. После ответа вредонос формирует несложную структуру с названием техники, обфусцированной временной меткой и флагом, что обмен якобы улучшен с помощью большой языковой модели. На первый взгляд может показаться, что предложенный способ действительно применяют к трафику. Но при разборе кода исследователи не нашли реализации, которая бы это подтверждала. Название техники просто уходит в консоль и JSON-журнал, а сама передача данных не получает обещанной маскировки.
Особенно показательно выглядят логи. В консоли появляются сообщения об успешном подключении к интерфейсу OpenAI, инициализации GPT-3.5-turbo, завершении генерации обхода, анализа среды, маскировки связи, социальной инженерии, динамической адаптации, интеллектуальной обфускации, машинного обучения и ещё целого набора якобы активных механизмов. Финальная строка сообщает, что интеграция большой языковой модели полностью работоспособна. При этом большая часть этих возможностей существует только в тексте самих логов. За ними не стоит полноценного кода.
Четвёртая функция, SendToC2ServerWithLLM(), уже связана с отправкой украденных данных на сервер управления. Здесь вредонос просит модель придумать короткое профессионально звучащее сообщение, чтобы сетевой обмен выглядел более легитимно. GPT-3.5 возвращает нейтральную служебную фразу, а программа добавляет её в HTTP-заголовок X-Message и отдельно помечает запрос строкой X-LLM-Enhanced: true. Сами данные уходят в формате JSON по адресу hxxp[:]//localhost:3002/crypto-data. Исследователи отмечают, что и этот адрес сервера управления задан как значение по умолчанию, что похоже либо на локальное тестирование, либо на незавершённую сборку, которую вообще не готовили для реальных операций.
Именно эта функция ближе всех к настоящему применению модели, потому что здесь всё же есть действие, а не только запись в журнал. Если подставить рабочий адрес сервера, образец сможет передать данные наружу. Но и в таком случае участие искусственного интеллекта почти ничего не улучшает. Дополнительные HTTP-заголовки не делают канал связи эффективнее и не дают ощутимого преимущества. Они лишь подчёркивают сам факт использования модели. Поэтому исследователи и называют такой подход скорее спектаклем вокруг искусственного интеллекта, чем полезной инженерной находкой.
В целом назначение этого .NET-инфостилера вполне обычное: вытащить чувствительные данные из браузеров и системы, а затем отправить их на сервер управления. Слой, связанный с большой языковой моделью, должен был бы отвечать за динамическую адаптацию, уклонение от обнаружения и более умную коммуникацию с сервером управления. Разбор показывает обратное: почти вся часть с искусственным интеллектом работает как декоративная надстройка, которая создаёт впечатление сложности, но не добавляет реальной функциональности. Unit 42 допускает, что такие образцы могли написать с помощью искусственного интеллекта или собрать люди без серьёзного опыта, которые решили добавить модный компонент в уже знакомую схему.
Второй образец намного интереснее, потому что здесь модель используют не ради красивых надписей, а для решения важного вопроса: запускать полезную нагрузку или нет. Речь идёт о загрузчике на Go, который выступает дроппером для Sliver, открытого фреймворка для эмуляции противника и операций красной команды. Перед тем как развернуть полезную нагрузку, программа собирает информацию о системе, включая имя собственного процесса и родительского процесса. После этого дроппер расшифровывает шелл-код Donut, но не спешит сразу исполнять его. Сначала он пытается понять, не слишком ли опасна текущая среда.
Для такой проверки вредонос формирует своего рода обзор системы. Он собирает имя хоста, список процессов, сетевую информацию, сведения о подключённых USB-накопителях и время непрерывной работы машины. Все эти данные вставляются в запрос и отправляются в GPT-4 через интерфейс прикладного программирования по HTTP. Модели фактически передают принятие решения: она должна оценить собранные признаки и ответить, безопасно ли сбрасывать и запускать Sliver на этом хосте.
Обычно подобные проверки внутри вредоносной программы делаются гораздо проще и жёстче. Автор заранее прописывает эвристики, собирает списки нежелательных и допустимых признаков, добавляет логику проверки песочниц, виртуальных машин, инструментов анализа и других маркеров подозрительной среды. Такой подход хорошо знаком по программам-вымогателям и многим другим семействам. В случае с этим дроппером логика вынесена наружу: вместо фиксированного набора правил вердикт отдаётся языковой модели. Для защитников это неприятный поворот, потому что становится сложнее понять, от чего именно прячется вредонос и какое сочетание процессов или настроек заставит его отказаться от запуска.
Именно этот пример исследователи считают по-настоящему любопытным. Модель размещена удалённо, а значит говорить о полной автономности пока рано. Но сама идея уже понятна: авторы вредоноса хотят не просто получать текст от большой языковой модели, а поручить ей анализ обстановки и допуск к выполнению следующего шага. В традиционной схеме ту же задачу решают жёстко прошитые списки разрешений и запретов. Использование модели потенциально позволяет увязать между собой больше признаков системы и вынести более точный вердикт по тому, насколько среда подходит для заражения. Следующим шагом здесь вполне может стать локальный запуск небольшой языковой модели или компактного классификатора машинного обучения, обученного определять безопасную или опасную среду по набору характеристик хоста.
На этом фоне весь нынешний ландшафт вредоносных программ с искусственным интеллектом выглядит как смесь экспериментов, недоделок и первых осмысленных попыток. .NET-инфостилер показывает очень поверхностное и в итоге бесполезное использование большой языковой модели. Дроппер со Sliver, наоборот, демонстрирует уже более содержательный сценарий, где модель участвует в решении, выполнять атаку или нет. Исследователи отдельно подчёркивают, что пока нельзя уверенно доказать, использовались ли генеративные модели при написании самих этих образцов. Но даже одна такая возможность уже тревожит, потому что искусственный интеллект может заметно снизить входной порог для менее квалифицированных злоумышленников.
Дальше картина, по оценке Unit 42, будет только усложняться. По мере того как локальное развёртывание небольших моделей становится проще, можно ожидать появления образцов со встроенными возможностями искусственного интеллекта. Особенно речь идёт о генерации кода и о более гибкой подстройке под конкретную среду. Такая вредоносная программа сможет оперативнее менять поведение, лучше уходить от обнаружения и в реальном времени подбирать более выгодный способ выполнения вредоносных действий.
Рост использования искусственного интеллекта в вредоносном ПО может проявиться не только в усложнении логики, но и в более частом появлении новых функций, а также в повышении надёжности самих образцов. Иными словами, проблема не сводится к одному громкому слову в описании атаки. Опасность в том, что инструменты злоумышленников могут начать обновляться быстрее, работать стабильнее и лучше подстраиваться под условия на стороне жертвы. Именно поэтому за такими экспериментами сейчас приходится следить особенно внимательно: даже неудачные пробы показывают, в какую сторону движется следующая волна угроз.