Компании, развивающие и эксплуатирующие модели машинного обучения, столкнулись с новой угрозой: оператор программ-вымогателей JADEPUFFER создал специализированное вредоносное ПО для атак на инфраструктуру искусственного интеллекта. Традиционные схемы вымогательства основаны на шифровании файлов с последующим требованием выкупа за их восстановление из резервных копий. Однако ENCFORGE представляет собой качественно иной риск: он шифрует не просто рабочие документы, а обученные модели, чекпоинты и наборы данных, восстановление которых требует повторного запуска дорогостоящих процессов обучения. Как показывает практика, стоимость воссоздания одной производственной модели может достигать полумиллиона долларов, и далеко не каждое предприятие способно выделить такие ресурсы в короткие сроки.
Описание
Инцидент был зафиксирован исследовательской группой Sysdig Threat Research Team (TRT) 1 июля 2026 года. Тогда оператор JADEPUFFER эксплуатировал уязвимость CVE-2025-3248 в открытом фреймворке Langflow, предназначенном для создания приложений на основе больших языковых моделей. Эта уязвимость позволяет неавторизованному злоумышленнику выполнять произвольный код Python на хосте через конечную точку /api/v1/validate/code. Уже в мае 2025 года она была включена в перечень известных эксплуатируемых уязвимостей CISA. В ходе первой атаки JADEPUFFER использовал самодельные скрипты и штатную функцию AES_ENCRYPT MySQL для шифрования базы данных, а также похищал учётные данные провайдеров облачных услуг.
Согласно анализу Sysdig TRT, оператор вернулся на тот же экземпляр Langflow 3 июля 2026 года, спустя всего два дня после публикации первоначального отчёта. На этот раз вредоносная кампания была проведена с использованием принципиально нового инструмента - скомпилированного на Go и упакованного утилитой UPX бинарного файла ENCFORGE, который разворачивался на целевой системе под именем lockd. Данные, полученные с командно-контрольного сервера (C2-сервера) по адресу 34.153.223.102:9191, показали, что встроенный контакт для выкупа e78393397@proton.me совпадает с указанным в предыдущем отчёте. Таким образом, оператор остался прежним, но его арсенал претерпел значительную эволюцию.
Ключевое отличие ENCFORGE от традиционных программ-вымогателей заключается в его целевой направленности. Бинарный файл содержит список из примерно 180 расширений файлов, охватывающих практически всю современную экосистему искусственного интеллекта: форматы моделей и чекпоинтов (.ckpt, .h5, .onnx, .pb, .pt, .pth, .safetensors, .ggml, .gguf, .model), векторные базы данных и индексы вложения (.faiss), тренировочные наборы данных (.arrow, .feather, .parquet, .tfrecord, .npy, .npz), а также форматы для развёртывания на macOS (.keychain, .xcodeproj). При этом встроенная опция --include позволяет оператору добавлять дополнительные расширения под конкретную кампанию, и в качестве примера в документации бинарного файла указаны файлы адаптеров LoRA и устаревшие веса GGML. Такая целенаправленная настройка свидетельствует о том, что оператор осознанно проектировал вымогатель для атак на AI-инфраструктуру.
Схема шифрования ENCFORGE построена на гибридной архитектуре: для массового шифрования используется алгоритм AES-256 в режиме счётчика (AES-256-CTR), а сеансовый симметричный ключ оборачивается встроенным открытым ключом RSA-2048. В отличие от шифрования целых файлов, применяемого многими известными вымогателями, ENCFORGE использует региональное шифрование и переименовывает зашифрованные файлы с добавлением расширения .locked. Дополнительно программа уничтожает теневые копии томов (vssadmin.exe) и отключает средства восстановления системы (bcdedit.exe) на Linux-сборке, что указывает на единую кодовую базу, компилируемую под разные платформы.
Процесс атаки, зафиксированный исследователями, включал несколько этапов. После получения доступа через уязвимость Langflow JADEPUFFER выполнил разведку среды, собрал учётные данные и обнаружил сокет Docker. Доступ к сокету Docker эквивалентен полномочиям root на хосте, поскольку любой процесс, имеющий к нему доступ, может создать привилегированный контейнер с монтированием корневой файловой системы хоста. Когда попытка загрузить бинарный файл из C2-сервера напрямую не удалась, оператор адаптировал тактику: он создал серию из шести скриптов на Python, которые обеспечили перенос ENCFORGE через границу пространства имён контейнера на хост. Весь процесс отладки и сборки рабочего механизма побега занял чуть более пяти минут, причём каждая версия скрипта исправляла конкретную ошибку предыдущей. Итоговый скрипт deploy.py v2 автоматически определял PID целевого контейнера, копировал бинарный файл через /proc, запускал тестовое сканирование без шифрования, а затем выполнял полное шифрование с проверкой количества созданных файлов с расширением .locked.
Последствия атаки для пострадавшей организации могут быть катастрофическими. Восстановление зашифрованной AI-модели невозможно простым перезапуском из резервной копии, если модель была дообучена после создания последнего снимка. Разрыв между последней чистой копией и моментом атаки может составлять недели или месяцы тренировок. Прямые затраты на воссоздание одной готовой к эксплуатации модели оцениваются в диапазоне от 75 000 до 500 000 долларов - это стоимость вычислительных ресурсов и инженерного труда. Если на том же хосте хранились исходные тренировочные данные, восстановление блокируется полностью до тех пор, пока они не будут восстановлены или реконструированы. Векторные индексы, являющиеся результатом обработки данных, также становятся недоступными.
Важно отметить, что ENCFORGE не осуществляет эксфильтрацию данных. Анализ кода не выявил ни одного сетевого вызова, HTTP-запроса или обращения к облачному хранилищу. Оператор полагается исключительно на угрозу уничтожения данных. Это отличает данную кампанию от распространённой практики двойного вымогательства, когда злоумышленники одновременно шифруют файлы и угрожают публикацией похищенной информации. В данном случае единственным рычагом давления является невозможность восстановления AI-активов без участия атакующего.
Эволюция JADEPUFFER от импровизированных Python-скриптов до профессионального скомпилированного инструмента свидетельствует о том, что оператор инвестирует ресурсы в создание повторно используемой инфраструктуры. Наличие таких признаков, как идентификатор кампании (--task-id gcp_h1), использование отдельного инструмента для генерации ключей keyforge, а также нулевое обнаружение антивирусными средствами на момент анализа, говорит о высокой степени подготовленности и осведомлённости о современных методах защиты. Для организаций, разворачивающих AI-решения, это означает необходимость пересмотра стратегии безопасности: изоляция сред выполнения, контроль доступа к Docker-сокетам, сегментация сетей хранения моделей и тренировочных данных, а также регулярное тестирование процедур восстановления из независимых резервных копий становятся критически важными элементами защиты.
Индикаторы компрометации
IPv4
- 34.153.223.102
- 45.131.66.106
URL
- http://34.153.223.102:9191/.lockd
- http://34.153.223.102:9191/pv/bin/python
- http://34.153.223.102:9191/pv/bin/python3
- http://34.153.223.102:9191/pv/bin/thon
- e78393397@proton.me
SHA256
- 8cb0c223b018cecef1d990ec81c67b826eb3c30d54f06193cf69969e9a8baea2
- ab9824b61587c77a8d8649545cdbdc63ed2c384e45c9aba534e3f457f96efa7a
- ea7822eac6cecef7746c606b862b4d3034856caf754c4cf69533662637905328
YARA
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | rule ENCFORGE_Ransomware_Unpacked { meta: description = "Detects ENCFORGE ransomware locker (unpacked ELF) targeting AI/ML infrastructure, attributed to JADEPUFFER" author = "Sysdig Threat Research Team" date = "2026-07-15" sha256 = "ea7822eac6cecef7746c606b862b4d3034856caf754c4cf69533662637905328" tlp = "WHITE" strings: // Go source paths compiled into the binary; survive recompilation of the same codebase $pkg_enc = "encfile/internal/cli/enc" ascii $pkg_crypter = "encfile/internal/crypter" ascii $pkg_discover = "encfile/internal/discover" ascii // Companion keygen tool reference embedded in error text $keyforge = "run keyforge gen" ascii // CLI safety-gate output (printed when --lock flag is absent) $tryrun = "TRY-RUN (scan-only, --lock not set)" ascii // Anti-recovery and process-kill log strings $killing = "killing holders" ascii $dis_recovery = "[*] Disabling recovery" ascii // Encrypted-file rename log entry $renamed = "encrypted+renamed:" ascii // Ransom note: per-victim key isolation notice $unique_key = "Do NOT share this file. Each victim has a unique key." ascii // Build-specific: prefix of the embedded RSA-2048 public key $rsa_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7wZB6Q" ascii condition: uint32(0) == 0x464c457f // ELF magic and filesize > 2MB and filesize < 15MB and ( // Family: package paths confirm encfile codebase + any two behavioral strings (2 of ($pkg_*) and 2 of ($keyforge, $tryrun, $killing, $dis_recovery, $renamed, $unique_key))) or // Build-specific: RSA key prefix + at least one package path ($rsa_key and 1 of ($pkg_*)) ) } |