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

Продвинутый обход EDR с помощью подмены AI-телеметрии и WASM-песочницы. Project Onyx — это PoC-конвейер для Red Team, предназначенный для демонстрации продвинутых техник обхода современных EDR-систем. Он отходит от традиционной сигнатурной обфускации в сторону поведенческой маскировки и строгой привязки к окружению.
Этот проект — исследование уровня proof-of-concept в области red team, изучающее нетрадиционный многоуровневый конвейер исполнения. Архитектура объединяет пять различных техник: маскировку AI-телеметрии, привязку к аппаратному окружению, стенографию в весах ONNX, WebAssembly-песочницу в памяти и Dead-Drop C2 через нисходящие обновления модели --> в единую функциональную цепочку доставки.
Project Onyx не претендует на рабочий обход промышленных EDR-систем. Это архитектурный набросок: каждый компонент реализован и функционален в рамках цепочки, но каждый слой потребует отдельного исследования, чтобы стать значимым против реальных защит. Project Onyx лучше всего воспринимать как структурированную отправную точку для такого рода исследований. Исполняемая нагрузка намеренно ограничена маяком-heartbeat, что позволяет изучить весь конвейер без поставки деструктивного или постэксплуатационного поведения.
onnxruntime от Microsoft. Это делает ONNX-артефакт активной частью конвейера, а не декоративным файлом, как прежняя крошечная MLP.MachineGuid целевой системы, Volume Serial Number и SID текущего пользователя.wasm3. C++-приложение-хост выступает лишь в роли загрузчика и моста API, предоставляя безопасные хост-функции WASM-песочнице.float32. Хост извлекает это хранилище из внедрённых байтов модели, проверяет его подлинность и только затем восстанавливает демонстрационный ключевой материал.heartbeat_ack и set_status, демонстрируя жизнеспособность канала без включения произвольного выполнения команд.
Смотрите 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 — вспомогательный инструмент для снятия отпечатка системы (fingerprinting), генерации ONNX-приманки, внедрения хранилища в веса, совместимости с хранилищем метаданных, Dead-Drop C2 через нисходящие обновления модели и шифрования WASM.wasm_license_module/ — исходный код на Rust для WebAssembly-модуля heartbeat.wasm3/source/ — минимальный включённый в проект (vendored) исходный код Wasm3, необходимый для сборки через CMake.assets/README2.md — форматы генерируемых артефактов.docs/architecture.md — полная цепочка выполнения и заметки по архитектуре.Установите следующее в Windows перед сборкой:
Зависимости Python:
py -m pip install onnx numpy cryptography
Целевая платформа Rust:
rustup target add wasm32-unknown-unknown
CMake-файл ожидает дерево исходного кода/сборки ONNX Runtime в ./onnxruntime и связывает статические компонентные библиотеки из:
onnxruntime/build/Windows/Release/Releaseonnxruntime/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-символьный демонстрационный ключевой материал.
Основной носитель по умолчанию — SqueezeNet 1.0 opset 12:
onnxmodelzoo/squeezenet1.0-12assets/base/squeezenet1.0-12.onnxdata_0, float[1, 3, 224, 224]softmaxout_1, float[1, 1000, 1, 1]Загрузите или проверьте включённую базовую модель:
python build.py fetch-model
build.py build копирует эту реальную модель, добавляет метаданные Project Onyx, внедряет аутентифицированное хранилище в веса ONNX в наименее значимые биты (LSB) его инициализаторов float32 и записывает итоговую эталонную модель в assets/model.onnx.
Дополнительный нисходящий канал — это исследовательское расширение для проверки того, может ли обычное обновление 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. Если вы запускаете исполняемый файл двойным щелчком, сначала задайте её как пользовательскую или системную переменную окружения, затем откройте новый терминал или перезапустите Explorer и запустите нативный хост с локальной моделью обновления:
$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 управляет количеством реальных вычислений (inference) ONNX Runtime, выполняемых перед продолжением пути разблокировки хранилища. PROJECT_ONYX_REQUIRE_ONNX_TELEMETRY=1 превращает сбои телеметрии в жёсткие сбои, что полезно при проверке того, что этап ONNX не пропускается. PROJECT_ONYX_LAB_OUTPUT_PATH записывает итоговый heartbeat-JSON в локальный файл для лабораторной проверки без необходимости вебхука.
Этот репозиторий поставляется с реальной эталонной моделью SqueezeNet, потому что она достаточно мала для GitHub и при этом является легитимно обученной нейронной сетью. Для более сильного исследовательского артефакта создайте обновлённую модель с помощью реальной тонкой настройки или другого обычного процесса обслуживания модели. Тогда встраиватель нисходящего канала сможет ограничить изменения битов только теми весами, которые уже изменились относительно эталонной модели. Это практическая версия идеи «спрятаться в шуме тонкой настройки»; ссылка на полноценный сайд-проект: https://github.com/X-3306/ONNXStego
Для быстрой лабораторной проверки downlink-build может синтезировать из эталонной модели детерминированное (с зерном) случайное обновление-обёртку, имитирующее тонкую настройку. Это подтверждает сквозную работу механики и даёт естественные веса-кандидаты для LSB-записи, НО не заменяет эмпирическую оценку на реальной задаче, наборе данных и процедуре тонкой настройки.
Настройте и соберите release-исполняемый файл:
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-модуль ограничен форматированием и возвратом heartbeat-JSON в качестве простого PoC. Дополнительный нисходящий канал обновлений модели может изменять только этот статус heartbeat через белый список heartbeat_ack / set_status. Если у вас есть интересные идеи для этого проекта, не стесняйтесь обращаться: [email protected]