推しアイデア
VR上のDockerコンテナを殴ってコンテナにDDos攻撃をしよう!
―
VR上のDockerコンテナを殴ってコンテナにDDos攻撃をしよう!
チームのメンバーがgoとDockerを触ったことが無かったので勉強用として作成。 公開してしまうと法に触れる可能性があるためローカルでやるしかない
go, godot, Kubernetes, Prometheus, OpenXR
本プロダクトは、GodotとMeta Quest 2を用いたVR空間上からDockerで構築したgoサーバーにリクエストを大量に送りサーバーを破壊するDDos攻撃を体験できるプロダクトです。
ユーザーはVR空間内のオブジェクトに触れることで、バックエンドAPIを通してコンテナへの操作や状態変化を発生させることができます。
VR空間でGopherを1匹(?)拾うと攻撃用コンテナが1個になり,2匹だと2個...の様に増えます。
その状態でMody Dockが叩かれると全ての攻撃用コンテナから被害者コンテナ(target-server)にリクエストが送られ、targetは並列で疑似音声の生成とLLMによる悲鳴文の生成を始めます。
これによりメモリ不足になると,OOM Killerによって落とされます。
本プロダクトでは、Godotで作成したVR空間をMeta Quest 2単体で動作させるため、Androidビルド環境とADB接続環境を構築しました。
adb devices による端末認識、adb tcpip 5555 による無線ADB化、adb connect <QuestのIP>:5555 による接続を行い、GodotからQuest 2へ直接ビルド・実行できるようにしました。
Docker Compose で 被害者用コンテナにメモリ制限をかけたり、攻撃用コンテナを複数起動したりして、攻撃用コンテナによる並列リクエストで疑似的に DDoS 状態を再現しています。
VR コントローラーの動きに 3D オブジェクトを追従させるため、Godot の XRController3D と Area3D を組み合わせて実装しました。
VR コントローラーの動きに 3D オブジェクトを追従させるため、Godot の XRController3D と Area3D を組み合わせて実装しました。
Area3D ノードを XRController3D の子に配置し、@onreadyで親ノードをコントローラーとして取得します。これによりコントローラーが動くと当たり判定も自動的に追従します。
@onready var controller := get_parent() as XRController3D## バックエンド処理
var trigger_value := controller.get_float("trigger") var is_trigger_pressed := trigger_value > trigger_threshold if is_trigger_pressed and not _was_trigger_pressed: try_grab_object() # トリガーを引いた瞬間 if not is_trigger_pressed and _was_trigger_pressed: release_object() # トリガーを離した瞬間
把持時は reparent() でオブジェクトをコントローラーの子ノードに付け替えることで、物理演算を介さずにコントローラーと完全同期させています。解放時は元の親に戻し、グローバル座標を維持します。
# 把持:コントローラーの子に付け替え → 追従開始 target.reparent(controller, true) # 解放:元の親に戻してグローバル座標を維持 _grabbed_object.reparent(_grabbed_original_parent, true) _grabbed_object.global_transform = current_global_transform
VRコントローラーと特定のオブジェクトへの接触をシグナルとしてバックエンドのREST APIへのリクエストを送信します
Meta Quest 2 の実機ビルドでは、端末内の localhost から開発用バックエンドへ到達させるために adb reverse でポート転送し、PC のローカル API をそのまま叩けるようにしています
Area3Dのbody enterdeシグナルで接触したオブジェクト名を判定し、何を殴るかによってサーバーへのリクエストを変更します。
func _on_body_entered(body: Node): match body.name: "Docker_kun": call_api("/attack", {"target": "all", "count": attack_count}) "ScaleTarget": call_api("/scale", {"count": attack_count})
kubernetesを用いて, クライアントがリクエストを送ることでターゲットコンテナを自動復旧する仕組みを作ろうと思いましたが, 実装まで間に合わなかったです. ツールはkindを用いたので, dockerで作りきったものをもとにmanifestを作成し, ターゲットコンテナのダウンまでの一連の流れは再現できましたが, VRを用いたテストで自動復旧できるかの確認までは間に合いませんでした. 初めてkubernetesを使ってみて用語が多くて理解に苦労しましたが, dockerを学びなおしてから見るとやってることはdockerの自動化だと気づいて色々勉強になりました. また機会があればオートヒーリングやローリングアップデートを試してみたいです.
VR空間内のオブジェクトとバックエンド処理を対応させることで、単なる画面操作ではなく、実際にDockerの3dモデルを殴ることでエンドポイントにリクエストを送るようにしています
手に持っているオブジェクトによってリクエストの内容が変わるようなロジックを作成しました。
Dockerコンテナを落とす処理に苦労しました。 リクエストが送られる度、LLMで悲鳴を生成すればメモリ使用率が上がりOOM Killerにより落とされる...と思っていましたがLLMの1トークン生成で使うワークメモリはモデルサイズに比べ小さいため、最初に大量のメモリ確保、その後のメモリ使用率の変化は少ないという状態になり中々落ちませんでした。 そこで疑似音声の生成を取り入れました。 これにより最初は普通に応答していたLLMも大量リクエストが来て応答不能になると即時フォールバック('ギャアアァァ!!')を返し、そのたびにサーバ内で高速に疑似音声を合成・、大量リクエストでメモリを一気に消費してコンテナがOOMで落ちるようになりました。
最初、叩くたびに生成されていた文が段々おぼつかなくなり、急に大量のギャアアァァ!!を吐き出して死ぬ、という流れがお気に入りです。
WSL環境内にあるGodotプロジェクトをWindows版Godotで開いていた。
その状態でAndroidビルドを行うと、GradleがUNCパスを扱えず、ビルドに失敗した。
人の業務に使用する電子計算機若しくはその用に供する電磁的記録を損壊し、若しくは人の業務に使用する電子計算機に虚偽の情報若しくは不正な指令を与え、又はその他の方法により、電子計算機に使用目的に沿うべき動作をさせず、又は使用目的に反する動作をさせて、人の業務を妨害した者は、5年以下の拘禁刑又は100万円以下の罰金に処する。 前項の罪の未遂は、罰する。 このプロダクトは他者を攻撃する意図では作成されておらず、DDoSに対してのテストおよび学習を目的として作成しています。
本プロダクトで行う負荷発生処理は、開発者が管理するローカル環境または許可を得た検証環境のみを対象としています。第三者が管理するサーバー、ネットワーク、サービスに対して使用することは想定していません。
また、本プロダクトはDDoS攻撃の実行を目的とするものではなく、攻撃を受けた際の挙動確認、負荷発生時の可視化、システムの耐性や復旧処理の検証を目的としています。
利用する場合は、必ず対象システムの管理者から明確な許可を得た上で、法律・利用規約・所属組織のルールを遵守してください。許可のない環境に対して使用した場合、電子計算機損壊等業務妨害罪などの法令に抵触する可能性があります。
本プロダクトの不正利用、または利用者の操作によって発生した損害やトラブルについて、開発者は一切の責任を負いません。