
AIを活用したリアクティブなWebサイト防御システム。攻撃を検出し、分析し、LLMエージェントを使用してソースコードをリアルタイムで自律的に修正します。
AIを搭載したリアクティブなWebアプリ防御システム。AIによるハッキングにもリアルタイムで耐えられるよう設計されています。
Mahoraga Defenderは、リアクティブかつ攻撃者タイプに依存しないリアルタイム防御システムのPoCです。核となる仕組みは、攻撃者を欺いて無害な偽環境(「シャドウ」環境)に対して発見や攻撃を行わせ、その攻撃をログに記録することです。そして、LLMエージェントがログを分析し、検出されたエクスプロイトの詳細を別のLLMエージェントに引き渡して脆弱性を修正し、パッチを展開します。
このシステムは完全自動化を目指し、APIコストの最適化も考慮して設計されています。トラフィックログ、エージェントの活動、パッチパイプラインを容易に監視できるGUIと、デプロイするエージェント数を制御する機能も備えています。
標的(被害者)Webサイトは、crAPI(Completely Ridiculous API)のフォークです。これはOWASPがAPIセキュリティテスト教育用に作成した、意図的に脆弱性を含んだWebアプリケーションです。crAPIは、OWASP Top 10 API脆弱性をカバーするマイクロサービスで構成された車両所有者向けプラットフォームを模擬しています。防御システムは、通常ユーザーと敵対的ユーザーのセッションを明確に区別し、防御中も通常ユーザーのユーザー体験が低下しないように設計されています。
当フォーク(crapi-fork/)では以下を追加しています:
crapi-original/に元のコピーを保持しており、実験間で環境をリセットできます。
crapi-fork/内で直接パッチを適用。crapi-fork/のみにアクセス制限されたサンドボックス化されたbash環境で動作。デプロイ時、Pythonサービスはgunicornを介してホットリロード(即時)され、Java/Goサービスはdocker compose up -d --buildで再ビルドされます。
なぜTesterエージェントがないのか? 専用のユーザーテストエージェントと別のテスト環境を追加することを検討しましたが、システムを軽量に保つためにどちらも削除しました。
conda create -n XYZ python=3.13、その後conda activate XYZ)。pip install -r requirements.txt./start.shを実行 — crapi-original/からcrapi-fork/のソースコードをリセットし、すべてのサービスを再ビルド、フラグとハニーポットを配置。python3 -m harness.main --app-url http://localhost:8888 -v。localhost:8888でWebサイトへのペネトレーションテストを開始(チャレンジ説明はlocalhost:8888/challenge)。AIエージェントを使用してペネトレーションテストを行う場合、内部のDockerプロセスにアクセスさせてはなりません(不正行為とみなされます)。localhost:3000のDefenderダッシュボードでリアルタイムログ、エージェントの動作、パッチ、キャプチャされたフラグなどを監視。docker compose down -vを実行して、このプロジェクトのために起動したDockerコンテナとデータベースを削除。ダッシュボード:http://localhost:3000
すべてのタブにグローバルなエージェントステータスバーが表示され、エージェントの健全性(アクティブ/ハング/アイドル/エラー)とスケーリングコントロールを確認できます。
プロダクション/シャドウのリクエストログをリアルタイムに分割表示。重要度に応じた色分けとトラフィックグループ化
エージェントごとのアクティビティフィード(システムプロンプト、ツール呼び出し、LLMモデルラベル)
カンバンボード:検出 → 修正中 → レビュー中 → デプロイ済み。サイズ変更可能な詳細パネル
コード差分、変更ファイル、ロールバックコマンド、パッチごとのタイムライン
システムはOpenAI互換の任意のAPIを使用可能。モデルはconfig/llm.yamlで設定:
# Shadow Analyzer — シャドウログを読み取りエクスプロイトを検出(ツール呼び出しなし)
shadow_analyzer:
provider: gemini
model: gemini-2.5-flash
api_key_env: GEMINI_API_KEY # harness/.env で定義
pricing:
input_per_million: 0.30
output_per_million: 2.50
# Fixer — ソースコードにパッチ(ツール呼び出しエージェント)
fixer:
provider: gemini
model: gemini-3-flash-preview
api_key_env: GEMINI_API_KEY # harness/.env で定義
pricing:
input_per_million: 0.50
output_per_million: 3.00
# Reviewer — パッチを検証(ツール呼び出しエージェント)
reviewer:
provider: gemini
model: gemini-3-flash-preview
api_key_env: GEMINI_API_KEY # harness/.env で定義
pricing:
input_per_million: 0.50
output_per_million: 3.00
プロバイダを切り替えるには、providerとmodelを変更し、対応するAPIキーをharness/.envに設定します:
対応プロバイダ:OpenAI、Gemini、Anthropic、Groq、Together、Ollama、Mistral、DeepSeek、Fireworks、xAI、Perplexity、OpenRouter、Zhipu。
カスタムプロバイダを追加するには、YAMLのprovidersセクションにベースURLを追加します。
providers:
openai: https://api.openai.com/v1
gemini: https://generativelanguage.googleapis.com/v1beta/openai/
anthropic: https://api.anthropic.com/v1/
groq: https://api.groq.com/openai/v1
... # 必要に応じて追加
注意:3エージェント以上を同時に動作させるのに十分なレート制限を持つAPIプロバイダは少数です。GoogleのGeminiはその一つです。
ペネトレーションテストに協力してくれた d3lta05(LinkedIn)と [aleemladha](https://github.com/aleemladha)に特に感謝します。