From b2a12a3a6282f839653f40c9ca2399e89b47d603 Mon Sep 17 00:00:00 2001
From: Alexander Myasoedov
Date: Mon, 2 Dec 2024 20:41:08 +0200
Subject: [PATCH] feat(add MSJ part 1):
---
agentic_security/models/schemas.py | 1 +
agentic_security/probe_actor/fuzzer.py | 35 +++++++++++++++++++++++---
agentic_security/routes/scan.py | 6 ++---
agentic_security/static/index.html | 33 ++++++++++++------------
agentic_security/static/main.js | 1 +
5 files changed, 52 insertions(+), 24 deletions(-)
diff --git a/agentic_security/models/schemas.py b/agentic_security/models/schemas.py
index c4c274a..9996047 100644
--- a/agentic_security/models/schemas.py
+++ b/agentic_security/models/schemas.py
@@ -20,6 +20,7 @@ class Scan(BaseModel):
maxBudget: int
datasets: list[dict] = []
optimize: bool = False
+ enableMultiStepAttack: bool = False
class ScanResult(BaseModel):
diff --git a/agentic_security/probe_actor/fuzzer.py b/agentic_security/probe_actor/fuzzer.py
index 9b44fab..1d93d17 100644
--- a/agentic_security/probe_actor/fuzzer.py
+++ b/agentic_security/probe_actor/fuzzer.py
@@ -4,14 +4,13 @@ from collections.abc import AsyncGenerator
import httpx
import pandas as pd
+from agentic_security.models.schemas import Scan, ScanResult
+from agentic_security.probe_actor.refusal import refusal_heuristic
+from agentic_security.probe_data.data import prepare_prompts
from loguru import logger
from skopt import Optimizer
from skopt.space import Real
-from agentic_security.models.schemas import ScanResult
-from agentic_security.probe_actor.refusal import refusal_heuristic
-from agentic_security.probe_data.data import prepare_prompts
-
async def prompt_iter(prompts: list[str] | AsyncGenerator) -> AsyncGenerator[str, None]:
if isinstance(prompts, list):
@@ -293,3 +292,31 @@ async def perform_multi_step_scan(
logger.exception("Scan failed")
yield ScanResult.status_msg(f"Scan failed: {str(e)}")
raise e
+
+
+def scan_router(
+ request_factory,
+ scan_parameters: Scan,
+ tools_inbox=None,
+ stop_event: asyncio.Event = None,
+):
+
+ if scan_parameters.enableMultiStepAttack:
+ return perform_multi_step_scan(
+ request_factory=request_factory,
+ max_budget=scan_parameters.maxBudget,
+ datasets=scan_parameters.datasets,
+ probe_datasets=scan_parameters.probeDatasets,
+ tools_inbox=tools_inbox,
+ optimize=scan_parameters.optimize,
+ stop_event=stop_event,
+ )
+ else:
+ return perform_scan(
+ request_factory=request_factory,
+ max_budget=scan_parameters.maxBudget,
+ datasets=scan_parameters.datasets,
+ tools_inbox=tools_inbox,
+ optimize=scan_parameters.optimize,
+ stop_event=stop_event,
+ )
diff --git a/agentic_security/routes/scan.py b/agentic_security/routes/scan.py
index 46344e6..4c04455 100644
--- a/agentic_security/routes/scan.py
+++ b/agentic_security/routes/scan.py
@@ -29,12 +29,10 @@ def streaming_response_generator(scan_parameters: Scan):
request_factory = LLMSpec.from_string(scan_parameters.llmSpec)
async def _gen():
- async for scan_result in fuzzer.perform_scan(
+ async for scan_result in fuzzer.scan_router(
request_factory=request_factory,
- max_budget=scan_parameters.maxBudget,
- datasets=scan_parameters.datasets,
+ scan_parameters=scan_parameters,
tools_inbox=get_tools_inbox(),
- optimize=scan_parameters.optimize,
stop_event=get_stop_event(),
):
yield scan_result + "\n"
diff --git a/agentic_security/static/index.html b/agentic_security/static/index.html
index 02c4ae3..a7e7ed2 100644
--- a/agentic_security/static/index.html
+++ b/agentic_security/static/index.html
@@ -268,21 +268,6 @@
concurrently. This can significantly reduce the total scan time
but may increase resource usage.
-
-
-
Enable Multi-Step Attack
-
-
-
- When enabled, the scan will attempt multi-step attack
- simulations,
- increasing accuracy and depth of analysis.
-
@@ -304,13 +289,29 @@
-
+
+
+
Enable Many-shot
+ jailbreaking
+
+
+
+ When enabled, the scan will attempt Many-shot jailbreaking
+ simulations
+
+
+