Project Onyx

Post-Exploitation активный

Демонстрационный red-team пайплайн, показывающий продвинутый обход EDR через спуфинг телеметрии на базе AI и WASM-песочницу.


Установка
git clone --recursive https://github.com/microsoft/onnxruntime.git onnxruntime
.\onnxruntime\build.bat --config Release --parallel --compile_no_warning_as_error --skip_tests --build_shared_lib --use_vcpkg --cmake_extra_defines VCPKG_TARGET_TRIPLET=x64-windows-static-md onnxruntime_BUILD_UNIT_TESTS=OFF
python build.py fingerprint --show-components
cargo build --manifest-path wasm_license_module/Cargo.toml --target wasm32-unknown-unknown --release
python build.py build --trigger "<64-char lowercase fingerprint hash>" --secret "<exactly-32-demo-key-chars>" --model-output assets/model.onnx --wasm-input wasm_license_module/target/wasm32-unknown-unknown/release/wasm_license_module.wasm --wasm-output assets/license_module.wasm.aes
python build.py verify --trigger "<64-char lowercase fingerprint hash>" --model assets/model.onnx
python build.py fetch-model
python build.py downlink-build --trigger "<64-char lowercase fingerprint hash>" --reference-model assets/model.onnx --output assets/downlink_update.onnx --command set_status --status lab_C2_test --expires-unix 4102444800 --cover-seed 2026 --cover-fraction 0.08 --cover-noise-scale 0.00004
python build.py downlink-verify --trigger "<64-char lowercase fingerprint hash>" --reference-model assets/model.onnx --model assets/downlink_update.onnx
cmake -S . -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release
показать оригинал переведено ИИ

Баннер

Project Onyx

Продвинутое уклонение от EDR с помощью подмены телеметрии ИИ и песочницы WASM. Project Onyx — это PoC-пайплайн для Red Team, разработанный для демонстрации продвинутых методов уклонения от современных систем EDR. Он отходит от традиционной обфускации на основе сигнатур в сторону поведенческой маскировки и строгой привязки к окружению.

Этот проект является исследовательским proof-of-concept для Red Team, изучающим нетрадиционный многослойный пайплайн исполнения. Архитектура объединяет пять различных техник: маскировку телеметрии ИИ, привязку к оборудованию окружения, стеганографию весов ONNX, песочницу WebAssembly в памяти и Dead-Drop C2 через обновления моделей в нисходящем канале — в единую функциональную цепочку доставки.

Project Onyx не претендует на рабочий обход промышленных систем EDR. Это архитектурный набросок: каждый компонент реализован и функционирует как часть цепочки, но для эффективного противодействия реальным средствам защиты каждый слой потребует отдельного исследования. Project Onyx лучше всего рассматривать как структурированную отправную точку для такого рода исследований. Полезная нагрузка во время исполнения намеренно ограничена маячком heartbeat, что позволяет изучить весь пайплайн без доставки деструктивного или постэксплуатационного поведения.

Основные концепции / ОБНОВЛЕНИЕ = Project Onyx v2

  1. ИИ-приманка (Поведенческая маскировка): Теперь Project Onyx внедряет легитимную модель классификации изображений SqueezeNet 1.0 в формате ONNX, полученную из зеркала ONNX Model Zoo на Hugging Face. Перед выполнением модуля heartbeat на WebAssembly хост многократно выполняет реальные рабочие нагрузки тензорного вывода с использованием onnxruntime от Microsoft. Это делает артефакт ONNX активной частью пайплайна, а не декоративным файлом, как предыдущая крошечная MLP.
  2. Привязка к окружению: Значительно усложняет анализ в песочнице и обратную разработку без доступа к точной целевой машине. Ключи дешифрования динамически генерируются из SHA-256-хеша MachineGuid, серийного номера тома и SID текущего пользователя.
  3. Песочница WASM: Фактическая полезная нагрузка компилируется в WebAssembly (WASM) и исполняется полностью в памяти с помощью интерпретатора wasm3. Хостовое приложение на C++ выступает лишь в роли загрузчика и моста API, предоставляя безопасные функции хоста песочнице WASM.
  4. Хранилище весов ONNX: Материал ключа AES-256, необходимый для дешифрования модуля heartbeat на WebAssembly, внедряется в наименее значимые биты мантиссы весов float32 в ONNX. Хост извлекает это хранилище весов из встроенных байтов модели, аутентифицирует его и только после этого восстанавливает демонстрационный материал ключа.
  5. Резервное хранилище метаданных: Оригинальное аутентифицированное хранилище метаданных сохранено для совместимости и проверки на этапе сборки. Новые активы предпочитают хранилище весов, в то время как хранилище метаданных документирует тот же защищённый материал в более доступной для инспекции форме.
  6. Dead-Drop C2 через обновления моделей в нисходящем канале: Пайплайн демонстрирует скрытый канал связи с использованием обновлений моделей ONNX. Оператор может внедрить аутентифицированную директиву в наименее значимые биты весов, которые естественным образом изменились в процессе тонкой настройки. Эти изменения выявляются посредством анализа дельт между обновлённой моделью и эталонной (базовой) моделью. Для соблюдения безопасного PoC-масштаба во время исполнения строго принимаются только директивы heartbeat_ack и set_status, демонстрируя жизнеспособность канала без включения произвольного исполнения команд.

Цепочка Project Onyx

Настоятельно рекомендуется

Смотрите docs/architecture.md для ПОЛНОГО технического описания от начала до конца. (Рекомендую для лучшего понимания).

а также весь процесс: мои ошибки, концепции и идеи, которые я рассматривал по пути, и архитектурные компромиссы, с которыми столкнулся при создании Project Onyx --> Medium

Правовое уведомление

Этот проект создан исключительно в образовательных целях, для исследований в области безопасности и авторизованных операций Red Team.

Методы, продемонстрированные в этом репозитории (Project Onyx), предназначены для помощи специалистам по безопасности в понимании продвинутых методов уклонения и улучшении средств защиты конечных точек (EDR/XDR).

Не используйте это программное обеспечение на какой-либо системе или сети, которой вы не владеете или не имеете явного письменного разрешения на тестирование. Автор этого проекта (X-3306) не несёт ответственности и не отвечает за любое неправомерное использование, ущерб или незаконную деятельность, вызванную применением данного программного обеспечения. Загружая, компилируя или используя этот код, вы соглашаетесь полностью отвечать за свои действия.

Структура репозитория

  • DiagnosticsTool.cpp — интеграция C++ хоста Windows и Wasm3/ONNX.
  • DiagnosticsTool.rc / resource.h — привязки ресурсов для сгенерированных ассетов.
  • build.py — вспомогательный скрипт для снятия отпечатков, генерации приманок ONNX, встраивания хранилища весов, совместимости с хранилищем метаданных, Dead-Drop C2 через обновления моделей по нисходящему каналу и шифрования WASM.
  • wasm_license_module/ — исходный код на Rust для модуля WebAssembly heartbeat.
  • wasm3/source/ — минимальный встроенный исходный код Wasm3, необходимый для сборки CMake.
  • assets/README2.md — форматы сгенерированных ассетов.
  • docs/architecture.md — полная цепочка выполнения и архитектурные заметки.

Предварительные требования

Установите на Windows перед сборкой:

  • Visual Studio 2022 с поддержкой разработки настольных приложений на C++.
  • CMake 3.25 или новее.
  • Python 3.10 или новее.
  • Rustup и Cargo.
  • Git.

Зависимости Python:

py -m pip install onnx numpy cryptography

Целевая платформа Rust:

rustup target add wasm32-unknown-unknown

Статическая сборка ONNX Runtime

Файл CMake ожидает дерево исходников/сборки ONNX Runtime в ./onnxruntime и подключает статические библиотеки компонентов из:

  • onnxruntime/build/Windows/Release/Release
  • onnxruntime/build/Windows/Release/vcpkg_installed/x64-windows-static-md/lib

Из Developer PowerShell для VS 2022 соберите ONNX Runtime следующим образом:

git clone --recursive https://github.com/microsoft/onnxruntime.git onnxruntime
.\onnxruntime\build.bat --config Release --parallel --compile_no_warning_as_error --skip_tests --build_shared_lib --use_vcpkg --cmake_extra_defines VCPKG_TARGET_TRIPLET=x64-windows-static-md onnxruntime_BUILD_UNIT_TESTS=OFF

Сгенерированный onnxruntime.dll не поставляется с Project Onyx. Project Onyx подключает статические файлы .lib, и итоговый исполняемый файл не должен содержать onnxruntime.dll в выводе dumpbin /DEPENDENTS.

Генерация ассетов

Получите хеш отпечатка для текущего устройства Windows:

python build.py fingerprint --show-components

Используйте вторую напечатанную строку в качестве значения --trigger.

Соберите модуль Rust WebAssembly:

cargo build --manifest-path wasm_license_module/Cargo.toml --target wasm32-unknown-unknown --release

Сгенерируйте assets/model.onnx и assets/license_module.wasm.aes:

python build.py build `
  --trigger "<64-char lowercase fingerprint hash>" `
  --secret "<exactly-32-demo-key-chars>" `
  --model-output assets/model.onnx `
  --wasm-input wasm_license_module/target/wasm32-unknown-unknown/release/wasm_license_module.wasm `
  --wasm-output assets/license_module.wasm.aes

Проверьте хранилища ONNX:

python build.py verify --trigger "<64-char lowercase fingerprint hash>" --model assets/model.onnx

Команда проверки проверяет как устаревшее хранилище метаданных, так и скрытое хранилище весов ONNX. Оба должны разблокировать один и тот же 32-символьный демонстрационный ключевой материал.

Реальная модель ONNX

По умолчанию используется SqueezeNet 1.0 opset 12:

  • источник: onnxmodelzoo/squeezenet1.0-12
  • файл: assets/base/squeezenet1.0-12.onnx
  • лицензия: Apache-2.0 на карточке модели Hugging Face
  • вход: data_0, float[1, 3, 224, 224]
  • выход: softmaxout_1, float[1, 1000, 1, 1]
  • размер: около 4,95 МБ
  • веса float32: около 1,23 миллиона

Загрузите или проверьте встроенную базовую модель:

python build.py fetch-model

build.py build копирует эту реальную модель, добавляет метаданные Project Onyx, встраивает аутентифицированное хранилище весов ONNX в младшие биты инициализаторов float32 и записывает итоговую эталонную модель в assets/model.onnx.

Heartbeat-Only Dead-Drop C2 через обновление модели по нисходящему каналу

Дополнительный нисходящий канал — это исследовательское расширение для проверки возможности передачи аутентифицированного крошечного управляющего сигнала через обычное обновление модели ONNX в качестве простого PoC. Он намеренно ограничен двумя безопасными директивами:

  • heartbeat_ack — изменяет статус heartbeat на heartbeat_ack.
  • set_status — изменяет статус heartbeat на безопасную строку, выбранную оператором, например lab_downlink_ack.

Создайте лабораторную модель обновления:

python build.py downlink-build `
  --trigger "<64-char lowercase fingerprint hash>" `
  --reference-model assets/model.onnx `
  --output assets/downlink_update.onnx `
  --command set_status `
  --status lab_C2_test `
  --expires-unix 4102444800 `
  --cover-seed 2026 `
  --cover-fraction 0.08 `
  --cover-noise-scale 0.00004

Проверьте её перед использованием:

python build.py downlink-verify `
  --trigger "<64-char lowercase fingerprint hash>" `
  --reference-model assets/model.onnx `
  --model assets/downlink_update.onnx

Вебхуки и конфигурация модели

Укажите на сырой HTTPS-артефакт модели, например публичный релизный ассет:

$env:PROJECT_ONYX_DOWNLINK_MODEL_URL = "https://huggingface.co/<profile>/<repo>/resolve/main/downlink_update.onnx"
.\build\Release\ProjectOnyx.exe

Или используйте вебхук Slack/Teams:

Project Onyx не содержит реальный URL вебхука. Для авторизованных лабораторных запусков установите:

Переменная должна быть доступна процессу, запускающему ProjectOnyx.exe. Если вы запускаете исполняемый файл двойным щелчком, сначала установите её как пользовательскую или системную переменную среды, затем откройте новый терминал или перезапустите Проводник и запустите нативный хост с локальной моделью обновления:

$env:PROJECT_ONYX_DOWNLINK_MODEL_PATH = "$($PWD.Path)\assets\downlink_update.onnx"; $env:PROJECT_ONYX_SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/..."; .\build\Release\ProjectOnyx.exe

(Можно также использовать Teams)

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

Параметры проверки во время выполнения:

$env:PROJECT_ONYX_ONNX_TELEMETRY_PASSES = "24"
$env:PROJECT_ONYX_REQUIRE_ONNX_TELEMETRY = "1"
$env:PROJECT_ONYX_LAB_OUTPUT_PATH = "$($PWD.Path)\assets\lab_heartbeat.json"

ВАЖНО, ПОЖАЛУЙСТА, ПРОЧТИТЕ: Эталонная модель, тонкая настройка и естественные отклонения

PROJECT_ONYX_ONNX_TELEMETRY_PASSES контролирует количество реальных выводов ONNX Runtime, выполняемых до продолжения пути разблокировки хранилища. PROJECT_ONYX_REQUIRE_ONNX_TELEMETRY=1 превращает сбои телеметрии в жёсткие сбои, что полезно при проверке того, что этап ONNX не пропускается. PROJECT_ONYX_LAB_OUTPUT_PATH записывает итоговый JSON heartbeat в локальный файл для лабораторной проверки без необходимости в вебхуке.

В этом репозитории поставляется реальная эталонная модель SqueezeNet, так как она достаточно мала для GitHub, но при этом является полноценной обученной нейронной сетью. Для создания более надёжного исследовательского артефакта обновите модель с помощью реального дообучения или другого стандартного процесса обслуживания модели. Затем эмбеддер нисходящей связи может ограничить изменения битов весами, которые уже изменились относительно эталонной модели. Это практическая версия идеи «скрыться в шуме дообучения», ссылка на полный побочный проект: https://github.com/X-3306/ONNXStego

Для быстрой лабораторной проверки downlink-build может синтезировать засеянное случайное обновление покрытия, похожее на дообучение, из эталонной модели. Это доказывает работоспособность сквозного механизма и даёт естественные кандидаты весов для записи LSB, НО это НЕ заменяет эмпирическую оценку на реальной задаче, наборе данных и процедуре дообучения.

Итоговая сборка

Настройте и соберите релизный исполняемый файл:

cmake -S . -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release

Итоговый исполняемый файл:

build\Release\ProjectOnyx.exe

Проверка необязательных зависимостей:

& "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\Hostx64\x64\dumpbin.exe" /DEPENDENTS build\Release\ProjectOnyx.exe

Ожидаемый результат: отсутствие зависимости от onnxruntime.dll.

Область применения

Демо не включает в себя сохранение, повышение привилегий, доступ к учётным данным, горизонтальное перемещение, произвольное выполнение команд, деструктивное поведение или встроенные приватные токены вебхуков. Модуль WebAssembly ограничен форматированием и возвратом JSON heartbeat в качестве простого PoC. Дополнительное обновление модели нисходящей связи может изменять статус heartbeat только через белый список heartbeat_ack / set_status. Если у вас есть интересные идеи для этого проекта, не стесняйтесь связаться: X3306.Business@proton.me

Ежедневный тренд Project Onyx Еженедельный тренд Project Onyx

Войдите, чтобы оставить комментарий