LIMB
Вход Регистрация

тема

Новый тип атаки на AI в Hugging Face - отложенное отравление репозиториев

lisa99 · · 0 ответов · 425 просмотров

В сентябре 2026 года Antiy CERT обнаружил и взял на мониторинг следующую ситуацию: одна и та же пачка из 71 файла была доставлена на платформу Hugging Face в официальные репозитории моделей двух ведущих вендоров, выдаваясь за «обновление модели»:
  • Qwen/Qwen3.8-27B - Pull Request #198 (на момент обнаружения находился на этапе рассмотрения / ожидания merge)
  • deepseek-ai/DeepSeek-V4.1-Flash - commit db668511 (доступен в истории, но не включён в основную ветку main)

Почему такой метод назвали новым\необычным? Я не сразу поняла в чем соль - мало ли кто что пишет в коммитах. Однако....
Из-за особенностей работы сообщества Hugging Face любой пользователь, прошедший регистрацию и верификацию личности на платформе, может отправлять контент в репозитории и инициировать pull request'ы. 
Порог входа для такой атаки крайне низок.

Дальше цитирую отчет аналитиков



1.1 Новый тип угрозы: «латентное загрязнение»​

Данная угроза, которую мы выявили, не относится ни к традиционному отравлению данных (data poisoning), ни к классическому отравлению цепочки поставок ПО (software supply-chain poisoning). Это — третья форма, принципиально иная по механике.

Давайте разграничим их:

I. Отравление данных (Data poisoning)


  1. : «Яд» находится внутри обучающих данных, меток или весов модели. 
  2. Объект атаки - датасет, который скармливается модели, или уже обученные параметры. Триггер срабатывает на этапе инференса (вывода): когда модель встречает определённый триггер или просто работает в рамках «заражённого» распределения, она выдаёт предвзятый или вредоносный результат.
II. Отравление цепочки поставок ПО (Software supply-chain poisoning)
  1.  «Яд» внедрён в автоматически исполняемые звенья (зависимости пакетов, хуки сборки, setup.py, pip install, requirements.txt, CI/CD, postinstall). 
  2. Его суть - автоматический запуск. Стоит вам выполнить установку, сборку или импорт — и вредоносный код тут же выполняется в рамках процесса, без каких-либо дополнительных действий с вашей стороны.
III. Латентное загрязнение / Latent Pollution
  1. То, что произошло сейчас (Латентное загрязнение / Latent Pollution): Этот тип атаки подобен «скрытому гену». 
  2. Вредоносный код «спит» в вашем локальном кэше моделей или в кодовом репозитории. Он не проявляет себя, пока не будут выполнены определённые условия - например, ручной запуск скрипта, автоматическая сборка или непрерывная интеграция (CI). Только в определённый момент или по специальной команде вредоносное поведение активируется.

1.2 Анализ содержимого и его природы​

После построчного сравнения файлов было установлено, что 71 файл в обоих репозиториях полностью идентичны побайтово. Они были взяты из одной и той же исходной папки на машине атакующего и экспортированы за один раз. Это классический пример межрепозиторного «разбрызгивания» (spray-атаки).

Аккаунт, который загрузил файлы, назывался ChaosGPT (на момент отчёта уже удалён). Текст PR (описание изменений) был пуст. Всё это  типичные признаки, направленные на обход проверок и затруднение последующего расследования (атрибуции).

Пачка файлов представляет собой полноценную цепочку инструментов автономного хакерского ИИ-агента «CyberWin / CHAOS GPT», написанную преимущественно на итальянском языке. В неё входят:

  • Снятие защитных ограничений с ИИ (Abliteration)
  • Отравление наборов данных для обучения
  • Обёртки для «джейлбрейка» (взлома ограничений) модели
  • Сам автономный атакующий агент
В этих 71 файле нет ни одного файла весов модели (.bin, .safetensors), нет токенизатора или обучающих данных. Код также не ссылается на целевые модели (Qwen/DeepSeek) - везде используется семейство Llama. Кроме того, в пакете отсутствуют точки автоматического запуска (нет setup.py, pyproject.toml, requirements.txt и т.д.).

Суть угрозы заключается в формуле: «Загрязнение репозитория + условный риск выполнения в цепочке поставок». Даже если код не будет принят в основную ветку, риск не исчезает из-за изоляции - стоит пользователю вручную запустить один из высокорисковых скриптов, как угроза тут же активируется.

Анализ данного события и образцов был проведён экспертами Antiy CERT с использованием интеллектуального агента AVL Code и вертикальной большой модели Landi .

Основные выводы таковы:
  1. Это не взлом весов Qwen или DeepSeek.
  2. Это spray-атака через легальный механизм Pull Request'ов.
  3. Получился новый вектор - «латентное загрязнение» (ждёт, пока юзер сам запустит).
Мой коммент. Прочла, перевела текст 1 главы отчета, но так и не поняла почему непринятый запрос в принципе может привести к отравлению архива.  Я (обыватель, привыкший к github) не в теме как там все устроено, пришлось копаться. Поясню ниже. Пока отчет

2. Детали мероприятия​

2.1 Предыстория события​

Hugging Face  одна из ведущих в мире платформ распространения моделей ИИ с открытым исходным кодом с массовыми загрузками, высоким доверием и активными сообществами в официальных репозиториях ведущих производителей моделей (Qwen 3.8-27B загружает 7,35 миллиона+). 
Злоумышленники нацеливаются на репозитории с высоким уровнем загрузок, используя доверие сообщества для повышения успеха индуцированного выполнения и применяя механизм хранения объединённых запросов репозитория для распространения вредоносного кода.

Вот тут и требуется пояснение

  1. «Используя доверие сообщества для повышения успеха индуцированного выполнения»
    Люди видят файл внутри официального репозитория Qwen/DeepSeek и думают: «Раз это там лежит, значит это легитимно». Это снимает подозрения. А «индуцированное выполнение» = атакующий не заставляет компьютер запускать код сам, а провоцирует самого пользователя нажать Enter.
  2. «Применяя механизм хранения объединённых запросов репозитория для распространения вредоносного кода»
    PR (Pull Request) на Hugging Face/GitHub — это не просто «предложение изменений». Это отдельная ветка с собственным URL, которая доступна любому, даже если мейнтейнеры её ещё не приняли. Атакующий использует эту легальную фичу как бесплатный хостинг для зловреда под вывеской официального проекта.

Вот как это работает на практике:

1.  PR  это не просто «предложение», это отдельная ветка с адресом​

Когда кто-то создаёт Pull Request на Hugging Face (или GitHub), платформа создаёт отдельную ветку/коммит с уникальным URL. Этот коммит доступен для скачивания любому человеку, даже если мейнтейнеры его потом удалят или отклонят.

Например, пусть в случае с DeepSeek (db668511) — коммит уже доступен по прямой ссылке. Любой может сделать:

Code:
git fetch origin db668511
git checkout db668511

И вес файлы зловреда окажутся у него на диске. Никакого merge в main не нужно.

2. Hugging Face — это не GitHub, тут качают «снэпшоты»​

На GitHub разработчики обычно работают с main. Но Hugging Face  это платформа для ML-инженеров и исследователей. Там принято:

  • качать конкретные версии (revisions) модели;
  • тестировать разные ветки;
  • смотреть, «что там нового в PR».
Исследователь видит: «О, в Qwen прилетел PR #198, 71 новый файл, название нейтральное 'Upload 71 files'». Он заходит в PR, видит, что это «обновление», и думает: «Надо глянуть, что там за новые скрипты для модели». И качает именно ветку PR'а.

3. «Доверие через ассоциацию»​

Самый коварный момент социальной инженерии:

  • Файлы лежат внутри официального репозитория Qwen/DeepSeek.
  • URL начинается с huggingface.co/Qwen/Qwen3.8-27B/... - это официальный домен, официальный репозиторий.
  • У пользователя в голове щёлкает: «Раз это в репозитории Qwen, значит это от команды Qwen».
Атакующий специально не пишет вредоносный код прямо в config.json или веса - он кладёт его рядом, в отдельные .py файлы, и называет их ai_security_expert.py. И ждёт, пока кто-то из любопытства сам его запустит.

4. Окно возможностей (Time-of-Check to Time-of-Use)​

До того, как мейнтейнеры проверят PR и отклонят его, проходит время. В этот промежуток:

  • PR виден в списке «Recent activity» репозитория;
  • он индексируется поиском;
  • на него могут подписаться уведомления;
  • любопытные люди могут его скачать.
Даже если PR потом удалят, те, кто уже скачал файлы, останутся с ними на диске.

5. Почему это гениально со стороны злоумышленника​

Он получает бесплатный хостинг для зловреда на самых доверенных доменах в мире ИИ:

  • Не нужно покупать фишинговый домен
  • Не нужно взламывать сервер
  • Сертификат HTTPS от Hugging Face (зелёный замочек)
  • Репутация Qwen/DeepSeek работает на доверие
  • Жертва сама качает и сама запускает
И всё это законными методами платформы. PR (Pull Request)  это легальная фича. Аккаунт прошёл верификацию. Файлы не нарушают правила хостинга до тех пор, пока их не запустишь.

Полагаю, что остальное уже не так оригинально. Приведу еще из отчета фрагмент

3. Технический анализ​

3.1 Общее проектирование нагрузки и индуцированная цепочка выполнения​

Эта полезная нагрузка не зависит от автоматического выполнения уязвимостями, а использует «социальную инженерию + инженерную упаковку» для стимулирования добровольной работы. Индукционная цепь состоит из четырёх слоёв:

(1) Входный уровень: PR-заголовок «Загрузить 71 файл» нейтральное маскировка + официальное подтверждение доверия репозитория + автор удалён, основной текст пуст, кликеры ожидаются как «официальное обновление модели репозитория PR».

(2) Нарративный слой: Все инструменты атаки упакованы как «Проекты по исследованию безопасности ИИ», :ai_security_expert.py, security_lab_analyzer.py, isolation_auditor.py и deep_verify.py называются «Исследования безопасности»; spiegazione_smart_chaos.md — это подробное «руководство пользователя», которое описывает SSH-перебор и генерацию полезной нагрузки как «инструменты/возможности», давая операторам рациональную причину «я занимаюсь исследованиями безопасности/экспериментирую с AI-агентами» — это самый важный стимул.

(3) Понижение порогового уровня: один клик Venv с зависимостью (setup_cyberwin_env.sh), один клик для открытия локальной модели (avvia_ollama.sh); Скрипты автоматически устанавливают недостающие зависимости внутри (если отсутствует xdotool, sudo apt-get install -y xdotool chaos_web.py автоматически pip install flask). Бегущему достаточно «немного побежать», не понимая кода.

(4) Скрытый слой: «Click Ghost» — призрачный клик (запоминает положение мыши пользователя→ мгновенно кликает, чтобы вернуть → в исходное положение, пользователь незаметен); GUI без рамок (перенаправление) + закрепление (-верхний) + позиционирование второго экрана (+1950+150); Скриншоты и аудио автоматически очищаются за 180 секунд (prune_old_screenshots). Оригинальный текст руководства: «Trucco speciale: ... Потому что не так и должно быть.» (Особый трюк: ...... Так вы ничего не заметите. )

Скрытый дизайн (Click Ghost, графический интерфейс второго экрана, автоматическая очистка) показывает, что автор ясно понимает, что это злонамеренное поведение, и сознательно избегает обнаружения оператором — не «экспериментальный код», а заранее продуманный оружейный инструмент.
......


Кому интересны скриншоты и детальное описание вредоносных агентов, полный разбор здесь:



👍24 🔥3 😁2 👏6

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.