
Advanced EDR Evasion via AI Telemetry Spoofing & WASM Sandboxing. Project Onyx is a PoC Red Team pipeline designed to demonstrate advanced evasion techniques against modern EDR systems. It shifts away from traditional signature-based obfuscation towards behavioral camouflage and strict environmental keying.

通过AI遥测欺骗与WASM沙箱实现的先进EDR绕过。Project Onyx 是一个概念验证红队流程,旨在展示针对现代EDR系统的高级规避技术。它从传统的基于签名的混淆转向行为伪装和严格的环境绑定。
本项目是概念验证红队研究,探索一种非常规的多层执行流程。该架构串联了五种不同的技术:AI遥测伪装、硬件绑定环境密钥、ONNX权重隐写、内存WebAssembly沙箱以及通过下行模型更新的死信C2——形成一条完整的功能性投递链。
Project Onyx 并不声称能够绕过生产环境中的EDR系统。它是一个架构草图:每个组件都已实现并在链中功能完整,但每一层都需要专门的研究才能在现实防御中产生意义。Project Onyx 最好被理解为一个结构化的探索起点。 运行时载荷被有意限制为心跳信标,以便在不引入破坏性或后利用行为的情况下检查整个流程。
onnxruntime 重复执行真实的张量推理工作负载。这使得 ONNX 工件成为管道中的活跃部分,而像以前的微型 MLP 那样仅作为装饰性文件。MachineGuid、Volume Serial Number 和当前用户的 SID 的 SHA-256 哈希值。wasm3 解释器完全在内存中执行。宿主 C++ 应用程序仅充当加载器和 API 桥梁,向 WASM 沙箱暴露安全的主机函数。float32 ONNX 权重的最低有效尾数位中。宿主从嵌入的模型字节中提取该权重保险库,进行认证,然后才恢复演示密钥材料。heartbeat_ack 和 set_status 指令,以证明通道的可行性,而不启用任意命令执行。
查看 docs/architecture.md 获取完整端到端技术草图(为了更好地理解,我推荐)。
以及整个过程:我的错误、一路上考虑的构思和想法,以及在构建 Project Onyx 时面临的架构权衡 --> Medium
本项目仅用于教育目的、安全研究和授权的红队行动。
本仓库(Project Onyx)中演示的技术旨在帮助安全专业人士了解高级规避方法并改进端点防御(EDR/XDR)。
请勿在你未拥有或未获得明确书面测试许可的任何系统或网络上使用此软件。
本项目作者(X-3306)不承担任何责任,并且对因使用本软件而引起的任何滥用、损害或非法活动不负责。通过下载、编译或使用此代码,您同意对自己的行为承担全部责任。
DiagnosticsTool.cpp - C++ Windows 主机及 Wasm3/ONNX 集成。DiagnosticsTool.rc / resource.h - 生成资产的资源绑定。build.py - 用于指纹收集、ONNX 诱饵生成、权重保险库嵌入、元数据保险库兼容性、通过下行模型更新的死信 C2 以及 WASM 加密的辅助脚本。wasm_license_module/ - WebAssembly 心跳模块的 Rust 源代码。wasm3/source/ - CMake 构建所需的最小化 vendored Wasm3 源代码。assets/README2.md - 生成的资产格式。docs/architecture.md - 完整运行时链和架构说明。在构建之前,在 Windows 上安装以下内容:
Python 依赖项:
py -m pip install onnx numpy cryptography
Rust 目标:
rustup target add wasm32-unknown-unknown
CMake 文件期望在 ./onnxruntime 处有一个 ONNX Runtime 源代码/构建树,并从以下位置链接静态组件库:
onnxruntime/build/Windows/Release/Releaseonnxruntime/build/Windows/Release/vcpkg_installed/x64-windows-static-md/lib在 VS 2022 的开发者 PowerShell 中,像这样构建 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 文件,最终可执行文件不应在 dumpbin /DEPENDENTS 中列出 onnxruntime.dll。
获取当前 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个字符的小写指纹哈希>" `
--secret "<恰好32个演示密钥字符>" `
--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个字符的小写指纹哈希>" --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 权重保险库嵌入其 float32 初始化器的 LSB 中,并将最终参考模型写入 assets/model.onnx。
附加下行链路是一个研究扩展,用于测试正常的 ONNX 模型更新是否可以作为简单的 PoC 携带经过认证的、微小的控制信号。它被故意限制为两个安全指令:
heartbeat_ack - 将运行时心跳状态更改为 heartbeat_ack。set_status - 将运行时心跳状态更改为操作员选择的安全字符串,例如 lab_downlink_ack。创建实验室更新模型:
python build.py downlink-build `
--trigger "<64个字符的小写指纹哈希>" `
--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个字符的小写指纹哈希>" `
--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
或使用 webhook Slack/Teams:
Project Onyx 不嵌入真实的 webhook 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 写入本地文件,用于实验室验证而无需 webhook。
此仓库附带了一个真实的 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 依赖。
此演示不包括持久化、提权、凭据访问、横向移动、任意命令执行、破坏性行为或捆绑的私有 webhook 令牌。WebAssembly 模块被限制为格式化和返回心跳 JSON 作为简单 PoC。额外的模型更新下行只能通过白名单指令 heartbeat_ack / set_status 更改该心跳状态。如果你对这个项目有一些有趣的想法,欢迎联系:[email protected]