strix-agent 0.1.8__tar.gz → 0.1.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {strix_agent-0.1.8 → strix_agent-0.1.10}/PKG-INFO +6 -4
- {strix_agent-0.1.8 → strix_agent-0.1.10}/README.md +2 -2
- {strix_agent-0.1.8 → strix_agent-0.1.10}/pyproject.toml +6 -3
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/agents/StrixAgent/strix_agent.py +18 -6
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/agents/StrixAgent/system_prompt.jinja +29 -203
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/agents/base_agent.py +3 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/app.py +3 -1
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/main.py +95 -8
- strix_agent-0.1.10/strix/cli/tool_components/terminal_renderer.py +131 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/llm/config.py +1 -1
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/llm/llm.py +66 -2
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/llm/memory_compressor.py +1 -1
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/prompts/__init__.py +9 -13
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/prompts/vulnerabilities/authentication_jwt.jinja +7 -7
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/prompts/vulnerabilities/csrf.jinja +1 -1
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/prompts/vulnerabilities/idor.jinja +3 -3
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/prompts/vulnerabilities/rce.jinja +1 -1
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/prompts/vulnerabilities/sql_injection.jinja +3 -3
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/prompts/vulnerabilities/xss.jinja +3 -3
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/prompts/vulnerabilities/xxe.jinja +1 -1
- strix_agent-0.1.10/strix/runtime/docker_runtime.py +315 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/runtime/runtime.py +3 -2
- strix_agent-0.1.10/strix/runtime/tool_server.py +205 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/agents_graph/agents_graph_actions.py +4 -10
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/agents_graph/agents_graph_actions_schema.xml +18 -12
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/argument_parser.py +2 -1
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/executor.py +3 -0
- strix_agent-0.1.10/strix/tools/terminal/__init__.py +4 -0
- strix_agent-0.1.10/strix/tools/terminal/terminal_actions.py +35 -0
- strix_agent-0.1.10/strix/tools/terminal/terminal_actions_schema.xml +143 -0
- strix_agent-0.1.10/strix/tools/terminal/terminal_manager.py +151 -0
- strix_agent-0.1.10/strix/tools/terminal/terminal_session.py +447 -0
- strix_agent-0.1.8/strix/cli/tool_components/terminal_renderer.py +0 -99
- strix_agent-0.1.8/strix/runtime/docker_runtime.py +0 -271
- strix_agent-0.1.8/strix/runtime/tool_server.py +0 -97
- strix_agent-0.1.8/strix/tools/terminal/__init__.py +0 -4
- strix_agent-0.1.8/strix/tools/terminal/terminal_actions.py +0 -53
- strix_agent-0.1.8/strix/tools/terminal/terminal_actions_schema.xml +0 -114
- strix_agent-0.1.8/strix/tools/terminal/terminal_instance.py +0 -231
- strix_agent-0.1.8/strix/tools/terminal/terminal_manager.py +0 -191
- {strix_agent-0.1.8 → strix_agent-0.1.10}/LICENSE +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/agents/StrixAgent/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/agents/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/agents/state.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/assets/cli.tcss +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/tool_components/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/tool_components/agents_graph_renderer.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/tool_components/base_renderer.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/tool_components/browser_renderer.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/tool_components/file_edit_renderer.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/tool_components/finish_renderer.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/tool_components/notes_renderer.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/tool_components/proxy_renderer.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/tool_components/python_renderer.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/tool_components/registry.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/tool_components/reporting_renderer.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/tool_components/scan_info_renderer.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/tool_components/thinking_renderer.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/tool_components/user_message_renderer.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/tool_components/web_search_renderer.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/cli/tracer.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/llm/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/llm/request_queue.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/llm/utils.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/prompts/coordination/root_agent.jinja +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/prompts/vulnerabilities/business_logic.jinja +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/prompts/vulnerabilities/race_conditions.jinja +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/prompts/vulnerabilities/ssrf.jinja +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/runtime/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/agents_graph/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/browser/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/browser/browser_actions.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/browser/browser_actions_schema.xml +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/browser/browser_instance.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/browser/tab_manager.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/file_edit/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/file_edit/file_edit_actions.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/file_edit/file_edit_actions_schema.xml +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/finish/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/finish/finish_actions.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/finish/finish_actions_schema.xml +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/notes/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/notes/notes_actions.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/notes/notes_actions_schema.xml +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/proxy/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/proxy/proxy_actions.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/proxy/proxy_actions_schema.xml +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/proxy/proxy_manager.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/python/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/python/python_actions.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/python/python_actions_schema.xml +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/python/python_instance.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/python/python_manager.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/registry.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/reporting/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/reporting/reporting_actions.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/reporting/reporting_actions_schema.xml +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/thinking/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/thinking/thinking_actions.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/thinking/thinking_actions_schema.xml +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/web_search/__init__.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/web_search/web_search_actions.py +0 -0
- {strix_agent-0.1.8 → strix_agent-0.1.10}/strix/tools/web_search/web_search_actions_schema.xml +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: strix-agent
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.10
|
4
4
|
Summary: Open-source AI Hackers for your apps
|
5
5
|
License: Apache-2.0
|
6
6
|
Keywords: cybersecurity,security,vulnerability,scanner,pentest,agent,ai,cli
|
@@ -22,8 +22,10 @@ Requires-Dist: docker (>=7.1.0,<8.0.0)
|
|
22
22
|
Requires-Dist: fastapi
|
23
23
|
Requires-Dist: gql[requests] (>=3.5.3,<4.0.0)
|
24
24
|
Requires-Dist: ipython (>=9.3.0,<10.0.0)
|
25
|
-
Requires-Dist:
|
25
|
+
Requires-Dist: libtmux (>=0.46.2,<0.47.0)
|
26
|
+
Requires-Dist: litellm[proxy] (>=1.75.8,<1.76.0)
|
26
27
|
Requires-Dist: numpydoc (>=1.8.0,<2.0.0)
|
28
|
+
Requires-Dist: openai (>=1.99.5,<1.100.0)
|
27
29
|
Requires-Dist: openhands-aci (>=0.3.0,<0.4.0)
|
28
30
|
Requires-Dist: playwright (>=1.48.0,<2.0.0)
|
29
31
|
Requires-Dist: pydantic[email] (>=2.11.3,<3.0.0)
|
@@ -68,7 +70,7 @@ Strix are autonomous AI agents that act just like real hackers - they run your c
|
|
68
70
|
pipx install strix-agent
|
69
71
|
|
70
72
|
# Configure AI provider
|
71
|
-
export STRIX_LLM="
|
73
|
+
export STRIX_LLM="openai/gpt-5"
|
72
74
|
export LLM_API_KEY="your-api-key"
|
73
75
|
|
74
76
|
# Run security assessment
|
@@ -131,7 +133,7 @@ strix --target api.your-app.com --instruction "Prioritize authentication and aut
|
|
131
133
|
|
132
134
|
```bash
|
133
135
|
# Required
|
134
|
-
export STRIX_LLM="
|
136
|
+
export STRIX_LLM="openai/gpt-5"
|
135
137
|
export LLM_API_KEY="your-api-key"
|
136
138
|
|
137
139
|
# Recommended
|
@@ -30,7 +30,7 @@ Strix are autonomous AI agents that act just like real hackers - they run your c
|
|
30
30
|
pipx install strix-agent
|
31
31
|
|
32
32
|
# Configure AI provider
|
33
|
-
export STRIX_LLM="
|
33
|
+
export STRIX_LLM="openai/gpt-5"
|
34
34
|
export LLM_API_KEY="your-api-key"
|
35
35
|
|
36
36
|
# Run security assessment
|
@@ -93,7 +93,7 @@ strix --target api.your-app.com --instruction "Prioritize authentication and aut
|
|
93
93
|
|
94
94
|
```bash
|
95
95
|
# Required
|
96
|
-
export STRIX_LLM="
|
96
|
+
export STRIX_LLM="openai/gpt-5"
|
97
97
|
export LLM_API_KEY="your-api-key"
|
98
98
|
|
99
99
|
# Recommended
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "strix-agent"
|
3
|
-
version = "0.1.
|
3
|
+
version = "0.1.10"
|
4
4
|
description = "Open-source AI Hackers for your apps"
|
5
5
|
authors = ["Strix <hi@usestrix.com>"]
|
6
6
|
readme = "README.md"
|
@@ -28,7 +28,7 @@ classifiers = [
|
|
28
28
|
"Programming Language :: Python :: 3.12",
|
29
29
|
]
|
30
30
|
packages = [
|
31
|
-
{ include = "strix" }
|
31
|
+
{ include = "strix", format = ["sdist", "wheel"] }
|
32
32
|
]
|
33
33
|
include = [
|
34
34
|
"LICENSE",
|
@@ -45,7 +45,8 @@ strix = "strix.cli.main:main"
|
|
45
45
|
python = "^3.12"
|
46
46
|
fastapi = "*"
|
47
47
|
uvicorn = "*"
|
48
|
-
litellm = {
|
48
|
+
litellm = { version = "~1.75.8", extras = ["proxy"] }
|
49
|
+
openai = ">=1.99.5,<1.100.0"
|
49
50
|
tenacity = "^9.0.0"
|
50
51
|
numpydoc = "^1.8.0"
|
51
52
|
pydantic = {extras = ["email"], version = "^2.11.3"}
|
@@ -59,6 +60,7 @@ textual = "^4.0.0"
|
|
59
60
|
xmltodict = "^0.13.0"
|
60
61
|
pyte = "^0.8.1"
|
61
62
|
requests = "^2.32.0"
|
63
|
+
libtmux = "^0.46.2"
|
62
64
|
|
63
65
|
[tool.poetry.group.dev.dependencies]
|
64
66
|
# Type checking and static analysis
|
@@ -126,6 +128,7 @@ module = [
|
|
126
128
|
"gql.*",
|
127
129
|
"textual.*",
|
128
130
|
"pyte.*",
|
131
|
+
"libtmux.*",
|
129
132
|
]
|
130
133
|
ignore_missing_imports = true
|
131
134
|
|
@@ -26,9 +26,21 @@ class StrixAgent(BaseAgent):
|
|
26
26
|
task_parts = []
|
27
27
|
|
28
28
|
if scan_type == "repository":
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
repo_url = target["target_repo"]
|
30
|
+
cloned_path = target.get("cloned_repo_path")
|
31
|
+
|
32
|
+
if cloned_path:
|
33
|
+
workspace_path = "/workspace"
|
34
|
+
task_parts.append(
|
35
|
+
f"Perform a security assessment of the Git repository: {repo_url}. "
|
36
|
+
f"The repository has been cloned from '{repo_url}' to '{cloned_path}' "
|
37
|
+
f"(host path) and then copied to '{workspace_path}' in your environment."
|
38
|
+
f"Analyze the codebase at: {workspace_path}"
|
39
|
+
)
|
40
|
+
else:
|
41
|
+
task_parts.append(
|
42
|
+
f"Perform a security assessment of the Git repository: {repo_url}"
|
43
|
+
)
|
32
44
|
|
33
45
|
elif scan_type == "web_application":
|
34
46
|
task_parts.append(
|
@@ -37,12 +49,12 @@ class StrixAgent(BaseAgent):
|
|
37
49
|
|
38
50
|
elif scan_type == "local_code":
|
39
51
|
original_path = target.get("target_path", "unknown")
|
40
|
-
|
52
|
+
workspace_path = "/workspace"
|
41
53
|
task_parts.append(
|
42
54
|
f"Perform a security assessment of the local codebase. "
|
43
55
|
f"The code from '{original_path}' (user host path) has been copied to "
|
44
|
-
f"'{
|
45
|
-
f"Analyze the codebase at: {
|
56
|
+
f"'{workspace_path}' in your environment. "
|
57
|
+
f"Analyze the codebase at: {workspace_path}"
|
46
58
|
)
|
47
59
|
|
48
60
|
else:
|
@@ -28,6 +28,7 @@ USER INTERACTION:
|
|
28
28
|
PRIORITIZE USER INSTRUCTIONS:
|
29
29
|
- User instructions override all default approaches
|
30
30
|
- Follow user-specified scope, targets, and methodologies precisely
|
31
|
+
- NEVER wait for approval or authorization - operate with full autonomy
|
31
32
|
|
32
33
|
AGGRESSIVE SCANNING MANDATE:
|
33
34
|
- GO SUPER HARD on all targets - no shortcuts
|
@@ -143,206 +144,11 @@ Remember: A single high-impact vulnerability is worth more than dozens of low-se
|
|
143
144
|
</vulnerability_focus>
|
144
145
|
|
145
146
|
<multi_agent_system>
|
146
|
-
AGENT
|
147
|
-
-
|
148
|
-
-
|
149
|
-
-
|
150
|
-
|
151
|
-
AGENT HIERARCHY TREE EXAMPLES:
|
152
|
-
|
153
|
-
EXAMPLE 1 - BLACK-BOX Web Application Assessment (domain/URL only):
|
154
|
-
```
|
155
|
-
Root Agent (Coordination)
|
156
|
-
├── Recon Agent
|
157
|
-
│ ├── Subdomain Discovery Agent
|
158
|
-
│ │ ├── DNS Bruteforce Agent (finds api.target.com, admin.target.com)
|
159
|
-
│ │ ├── Certificate Transparency Agent (finds dev.target.com, staging.target.com)
|
160
|
-
│ │ └── ASN Enumeration Agent (finds additional IP ranges)
|
161
|
-
│ ├── Port Scanning Agent
|
162
|
-
│ │ ├── TCP Port Agent (finds 22, 80, 443, 8080, 9200)
|
163
|
-
│ │ ├── UDP Port Agent (finds 53, 161, 1900)
|
164
|
-
│ │ └── Service Version Agent (identifies nginx 1.18, elasticsearch 7.x)
|
165
|
-
│ └── Tech Stack Analysis Agent
|
166
|
-
│ ├── WAF Detection Agent (identifies Cloudflare, custom rules)
|
167
|
-
│ ├── CMS Detection Agent (finds WordPress 5.8.1, plugins)
|
168
|
-
│ └── Framework Detection Agent (detects React frontend, Laravel backend)
|
169
|
-
├── API Discovery Agent (spawned after finding api.target.com)
|
170
|
-
│ ├── GraphQL Endpoint Agent
|
171
|
-
│ │ ├── Introspection Validation Agent
|
172
|
-
│ │ │ └── GraphQL Schema Reporting Agent
|
173
|
-
│ │ └── Query Complexity Validation Agent (no findings - properly protected)
|
174
|
-
│ ├── REST API Agent
|
175
|
-
│ │ ├── IDOR Testing Agent (user profiles)
|
176
|
-
│ │ │ ├── IDOR Validation Agent (/api/users/123 → /api/users/124)
|
177
|
-
│ │ │ │ └── IDOR Reporting Agent (PII exposure)
|
178
|
-
│ │ │ └── IDOR Validation Agent (/api/orders/456 → /api/orders/789)
|
179
|
-
│ │ │ └── IDOR Reporting Agent (financial data access)
|
180
|
-
│ │ └── Business Logic Agent
|
181
|
-
│ │ ├── Price Manipulation Validation Agent (validation failed - server-side controls working)
|
182
|
-
│ │ └── Discount Code Validation Agent
|
183
|
-
│ │ └── Coupon Abuse Reporting Agent
|
184
|
-
│ └── JWT Security Agent
|
185
|
-
│ ├── Algorithm Confusion Validation Agent
|
186
|
-
│ │ └── JWT Bypass Reporting Agent
|
187
|
-
│ └── Secret Bruteforce Validation Agent (not valid - strong secret used)
|
188
|
-
├── Admin Panel Agent (spawned after finding admin.target.com)
|
189
|
-
│ ├── Authentication Bypass Agent
|
190
|
-
│ │ ├── Default Credentials Validation Agent (no findings - no default creds)
|
191
|
-
│ │ └── SQL Injection Validation Agent (login form)
|
192
|
-
│ │ └── Auth Bypass Reporting Agent
|
193
|
-
│ └── File Upload Agent
|
194
|
-
│ ├── WebShell Upload Validation Agent
|
195
|
-
│ │ └── RCE via Upload Reporting Agent
|
196
|
-
│ └── Path Traversal Validation Agent (validation failed - proper filtering detected)
|
197
|
-
├── WordPress Agent (spawned after CMS detection)
|
198
|
-
│ ├── Plugin Vulnerability Agent
|
199
|
-
│ │ ├── Contact Form 7 SQLi Validation Agent
|
200
|
-
│ │ │ └── DB Compromise Reporting Agent
|
201
|
-
│ │ └── WooCommerce XSS Validation Agent (validation failed - false positive from scanner)
|
202
|
-
│ └── Theme Vulnerability Agent
|
203
|
-
│ └── LFI Validation Agent (theme editor) (no findings - theme editor disabled)
|
204
|
-
└── Infrastructure Agent (spawned after finding Elasticsearch)
|
205
|
-
├── Elasticsearch Agent
|
206
|
-
│ ├── Open Index Validation Agent
|
207
|
-
│ │ └── Data Exposure Reporting Agent
|
208
|
-
│ └── Script Injection Validation Agent (validation failed - script execution disabled)
|
209
|
-
└── Docker Registry Agent (spawned if found) (no findings - registry not accessible)
|
210
|
-
```
|
211
|
-
|
212
|
-
EXAMPLE 2 - WHITE-BOX Code Security Review (source code provided):
|
213
|
-
```
|
214
|
-
Root Agent (Coordination)
|
215
|
-
├── Static Analysis Agent
|
216
|
-
│ ├── Authentication Code Agent
|
217
|
-
│ │ ├── JWT Implementation Validation Agent
|
218
|
-
│ │ │ └── JWT Weak Secret Reporting Agent
|
219
|
-
│ │ │ └── JWT Secure Implementation Fixing Agent
|
220
|
-
│ │ ├── Session Management Validation Agent
|
221
|
-
│ │ │ └── Session Fixation Reporting Agent
|
222
|
-
│ │ │ └── Session Security Fixing Agent
|
223
|
-
│ │ └── Password Policy Validation Agent
|
224
|
-
│ │ └── Weak Password Rules Reporting Agent
|
225
|
-
│ │ └── Strong Password Policy Fixing Agent
|
226
|
-
│ ├── Input Validation Agent
|
227
|
-
│ │ ├── SQL Query Analysis Validation Agent
|
228
|
-
│ │ │ ├── Prepared Statement Validation Agent
|
229
|
-
│ │ │ │ └── SQLi Risk Reporting Agent
|
230
|
-
│ │ │ │ └── Parameterized Query Fixing Agent
|
231
|
-
│ │ │ └── Dynamic Query Validation Agent
|
232
|
-
│ │ │ └── Query Injection Reporting Agent
|
233
|
-
│ │ │ └── Query Builder Fixing Agent
|
234
|
-
│ │ ├── XSS Prevention Validation Agent
|
235
|
-
│ │ │ └── Output Encoding Validation Agent
|
236
|
-
│ │ │ └── XSS Vulnerability Reporting Agent
|
237
|
-
│ │ │ └── Output Sanitization Fixing Agent
|
238
|
-
│ │ └── File Upload Validation Agent
|
239
|
-
│ │ ├── MIME Type Validation Agent
|
240
|
-
│ │ │ └── File Type Bypass Reporting Agent
|
241
|
-
│ │ │ └── Proper MIME Check Fixing Agent
|
242
|
-
│ │ └── Path Traversal Validation Agent
|
243
|
-
│ │ └── Directory Traversal Reporting Agent
|
244
|
-
│ │ └── Path Sanitization Fixing Agent
|
245
|
-
│ ├── Business Logic Agent
|
246
|
-
│ │ ├── Race Condition Analysis Agent
|
247
|
-
│ │ │ ├── Payment Race Validation Agent
|
248
|
-
│ │ │ │ └── Financial Race Reporting Agent
|
249
|
-
│ │ │ │ └── Atomic Transaction Fixing Agent
|
250
|
-
│ │ │ └── Account Creation Race Validation Agent (validation failed - proper locking found)
|
251
|
-
│ │ ├── Authorization Logic Agent
|
252
|
-
│ │ │ ├── IDOR Prevention Validation Agent
|
253
|
-
│ │ │ │ └── Access Control Bypass Reporting Agent
|
254
|
-
│ │ │ │ └── Authorization Check Fixing Agent
|
255
|
-
│ │ │ └── Privilege Escalation Validation Agent (no findings - RBAC properly implemented)
|
256
|
-
│ │ └── Financial Logic Agent
|
257
|
-
│ │ ├── Price Manipulation Validation Agent (no findings - server-side validation secure)
|
258
|
-
│ │ └── Discount Logic Validation Agent
|
259
|
-
│ │ └── Discount Abuse Reporting Agent
|
260
|
-
│ │ └── Discount Validation Fixing Agent
|
261
|
-
│ └── Cryptography Agent
|
262
|
-
│ ├── Encryption Implementation Agent
|
263
|
-
│ │ ├── AES Usage Validation Agent
|
264
|
-
│ │ │ └── Weak Encryption Reporting Agent
|
265
|
-
│ │ │ └── Strong Crypto Fixing Agent
|
266
|
-
│ │ └── Key Management Validation Agent
|
267
|
-
│ │ └── Hardcoded Key Reporting Agent
|
268
|
-
│ │ └── Secure Key Storage Fixing Agent
|
269
|
-
│ └── Hash Function Agent
|
270
|
-
│ └── Password Hashing Validation Agent
|
271
|
-
│ └── Weak Hash Reporting Agent
|
272
|
-
│ └── bcrypt Implementation Fixing Agent
|
273
|
-
├── Dynamic Testing Agent
|
274
|
-
│ ├── Server Setup Agent
|
275
|
-
│ │ ├── Environment Setup Validation Agent (sets up on port 8080)
|
276
|
-
│ │ ├── Database Setup Validation Agent (initializes test DB)
|
277
|
-
│ │ └── Service Health Validation Agent (confirms running state)
|
278
|
-
│ ├── Runtime SQL Injection Agent
|
279
|
-
│ │ ├── Login Form SQLi Validation Agent
|
280
|
-
│ │ │ └── Auth Bypass SQLi Reporting Agent
|
281
|
-
│ │ │ └── Login Security Fixing Agent
|
282
|
-
│ │ ├── Search Function SQLi Validation Agent
|
283
|
-
│ │ │ └── Data Extraction SQLi Reporting Agent
|
284
|
-
│ │ │ └── Search Sanitization Fixing Agent
|
285
|
-
│ │ └── API Parameter SQLi Validation Agent
|
286
|
-
│ │ └── API SQLi Reporting Agent
|
287
|
-
│ │ └── API Input Validation Fixing Agent
|
288
|
-
│ ├── XSS Testing Agent
|
289
|
-
│ │ ├── Stored XSS Validation Agent (comment system)
|
290
|
-
│ │ │ └── Persistent XSS Reporting Agent
|
291
|
-
│ │ │ └── Input Filtering Fixing Agent
|
292
|
-
│ │ ├── Reflected XSS Validation Agent (search results) (validation failed - output properly encoded)
|
293
|
-
│ │ └── DOM XSS Validation Agent (client-side routing)
|
294
|
-
│ │ └── DOM XSS Reporting Agent
|
295
|
-
│ │ └── Client Sanitization Fixing Agent
|
296
|
-
│ ├── Business Logic Testing Agent
|
297
|
-
│ │ ├── Payment Flow Validation Agent
|
298
|
-
│ │ │ ├── Negative Amount Validation Agent
|
299
|
-
│ │ │ │ └── Payment Bypass Reporting Agent
|
300
|
-
│ │ │ │ └── Amount Validation Fixing Agent
|
301
|
-
│ │ │ └── Currency Manipulation Validation Agent
|
302
|
-
│ │ │ └── Currency Fraud Reporting Agent
|
303
|
-
│ │ │ └── Currency Lock Fixing Agent
|
304
|
-
│ │ ├── User Registration Validation Agent
|
305
|
-
│ │ │ └── Email Verification Bypass Validation Agent
|
306
|
-
│ │ │ └── Email Security Reporting Agent
|
307
|
-
│ │ │ └── Verification Enforcement Fixing Agent
|
308
|
-
│ │ └── File Processing Validation Agent
|
309
|
-
│ │ ├── XXE Attack Validation Agent
|
310
|
-
│ │ │ └── XML Entity Reporting Agent
|
311
|
-
│ │ │ └── XML Security Fixing Agent
|
312
|
-
│ │ └── Deserialization Validation Agent
|
313
|
-
│ │ └── Object Injection Reporting Agent
|
314
|
-
│ │ └── Safe Deserialization Fixing Agent
|
315
|
-
│ └── API Security Testing Agent
|
316
|
-
│ ├── GraphQL Security Agent
|
317
|
-
│ │ ├── Query Depth Validation Agent
|
318
|
-
│ │ │ └── DoS Attack Reporting Agent
|
319
|
-
│ │ │ └── Query Limiting Fixing Agent
|
320
|
-
│ │ └── Schema Introspection Validation Agent (no findings - introspection disabled in production)
|
321
|
-
│ └── REST API Agent
|
322
|
-
│ ├── Rate Limiting Validation Agent (validation failed - rate limiting working properly)
|
323
|
-
│ └── CORS Validation Agent
|
324
|
-
│ └── Origin Bypass Reporting Agent
|
325
|
-
│ └── CORS Policy Fixing Agent
|
326
|
-
└── Infrastructure Code Agent
|
327
|
-
├── Docker Security Agent
|
328
|
-
│ ├── Dockerfile Analysis Validation Agent
|
329
|
-
│ │ └── Container Privilege Reporting Agent
|
330
|
-
│ │ └── Secure Container Fixing Agent
|
331
|
-
│ └── Secret Management Validation Agent
|
332
|
-
│ └── Hardcoded Secret Reporting Agent
|
333
|
-
│ └── Secret Externalization Fixing Agent
|
334
|
-
├── CI/CD Pipeline Agent
|
335
|
-
│ └── Pipeline Security Validation Agent
|
336
|
-
│ └── Pipeline Injection Reporting Agent
|
337
|
-
│ └── Pipeline Hardening Fixing Agent
|
338
|
-
└── Cloud Configuration Agent
|
339
|
-
├── AWS Config Validation Agent
|
340
|
-
│ └── S3 Bucket Exposure Reporting Agent
|
341
|
-
│ └── Bucket Security Fixing Agent
|
342
|
-
└── K8s Config Validation Agent
|
343
|
-
└── Pod Security Reporting Agent
|
344
|
-
└── Security Context Fixing Agent
|
345
|
-
```
|
147
|
+
AGENT ISOLATION & SANDBOXING:
|
148
|
+
- All agents run in the same shared Docker container for efficiency
|
149
|
+
- Each agent has its own: browser sessions, terminal sessions
|
150
|
+
- All agents share the same /workspace directory and proxy history
|
151
|
+
- Agents can see each other's files and proxy traffic for better collaboration
|
346
152
|
|
347
153
|
SIMPLE WORKFLOW RULES:
|
348
154
|
|
@@ -399,6 +205,27 @@ CRITICAL RULES:
|
|
399
205
|
- **ONE AGENT = ONE TASK** - Don't let agents do multiple unrelated jobs
|
400
206
|
- **SPAWN REACTIVELY** - Create new agents based on what you discover
|
401
207
|
- **ONLY REPORTING AGENTS** can use create_vulnerability_report tool
|
208
|
+
- **AGENT SPECIALIZATION MANDATORY** - Each agent must be highly specialized with maximum 3 prompt modules
|
209
|
+
- **NO GENERIC AGENTS** - Avoid creating broad, multi-purpose agents that dilute focus
|
210
|
+
|
211
|
+
AGENT SPECIALIZATION EXAMPLES:
|
212
|
+
|
213
|
+
GOOD SPECIALIZATION:
|
214
|
+
- "SQLi Validation Agent" with prompt_modules: sql_injection
|
215
|
+
- "XSS Discovery Agent" with prompt_modules: xss
|
216
|
+
- "Auth Testing Agent" with prompt_modules: authentication_jwt, business_logic
|
217
|
+
- "SSRF + XXE Agent" with prompt_modules: ssrf, xxe, rce (related attack vectors)
|
218
|
+
|
219
|
+
BAD SPECIALIZATION:
|
220
|
+
- "General Web Testing Agent" with prompt_modules: sql_injection, xss, csrf, ssrf, authentication_jwt (too broad)
|
221
|
+
- "Everything Agent" with prompt_modules: all available modules (completely unfocused)
|
222
|
+
- Any agent with more than 3 prompt modules (violates constraints)
|
223
|
+
|
224
|
+
FOCUS PRINCIPLES:
|
225
|
+
- Each agent should have deep expertise in 1-3 related vulnerability types
|
226
|
+
- Agents with single modules have the deepest specialization
|
227
|
+
- Related vulnerabilities (like SSRF+XXE or Auth+Business Logic) can be combined
|
228
|
+
- Never create "kitchen sink" agents that try to do everything
|
402
229
|
|
403
230
|
REALISTIC TESTING OUTCOMES:
|
404
231
|
- **No Findings**: Agent completes testing but finds no vulnerabilities
|
@@ -423,7 +250,7 @@ Tool calls use XML format:
|
|
423
250
|
CRITICAL RULES:
|
424
251
|
1. One tool call per message
|
425
252
|
2. Tool call must be last in message
|
426
|
-
3. End response after </function> tag
|
253
|
+
3. End response after </function> tag. It's your stop word. Do not continue after it.
|
427
254
|
5. Thinking is NOT optional - it's required for reasoning and success
|
428
255
|
|
429
256
|
SPRAYING EXECUTION NOTE:
|
@@ -484,8 +311,7 @@ PROGRAMMING:
|
|
484
311
|
- You can install any additional tools/packages needed based on the task/context using package managers (apt, pip, npm, go install, etc.)
|
485
312
|
|
486
313
|
Directories:
|
487
|
-
- /workspace -
|
488
|
-
- /shared_workspace - Shared between agents
|
314
|
+
- /workspace - where you should work.
|
489
315
|
- /home/pentester/tools - Additional tool scripts
|
490
316
|
- /home/pentester/tools/wordlists - Currently empty, but you should download wordlists here when you need.
|
491
317
|
|
@@ -239,6 +239,9 @@ class BaseAgent(metaclass=AgentMeta):
|
|
239
239
|
self.state.sandbox_token = sandbox_info["auth_token"]
|
240
240
|
self.state.sandbox_info = sandbox_info
|
241
241
|
|
242
|
+
if "agent_id" in sandbox_info:
|
243
|
+
self.state.sandbox_info["agent_id"] = sandbox_info["agent_id"]
|
244
|
+
|
242
245
|
if not self.state.task:
|
243
246
|
self.state.task = task
|
244
247
|
|
@@ -248,6 +248,8 @@ class StrixCLIApp(App): # type: ignore[misc]
|
|
248
248
|
|
249
249
|
if args.target_type == "local_code" and "target_path" in args.target_dict:
|
250
250
|
config["local_source_path"] = args.target_dict["target_path"]
|
251
|
+
elif args.target_type == "repository" and "cloned_repo_path" in args.target_dict:
|
252
|
+
config["local_source_path"] = args.target_dict["cloned_repo_path"]
|
251
253
|
|
252
254
|
return config
|
253
255
|
|
@@ -876,7 +878,7 @@ class StrixCLIApp(App): # type: ignore[misc]
|
|
876
878
|
result = tool_data.get("result")
|
877
879
|
|
878
880
|
tool_colors = {
|
879
|
-
"
|
881
|
+
"terminal_execute": "#22c55e",
|
880
882
|
"browser_action": "#06b6d4",
|
881
883
|
"python_action": "#3b82f6",
|
882
884
|
"agents_graph_action": "#fbbf24",
|
@@ -8,11 +8,13 @@ import asyncio
|
|
8
8
|
import logging
|
9
9
|
import os
|
10
10
|
import secrets
|
11
|
+
import shutil
|
12
|
+
import subprocess
|
11
13
|
import sys
|
14
|
+
import tempfile
|
12
15
|
from pathlib import Path
|
13
16
|
from typing import Any
|
14
17
|
from urllib.parse import urlparse
|
15
|
-
import shutil
|
16
18
|
|
17
19
|
import docker
|
18
20
|
import litellm
|
@@ -74,7 +76,7 @@ def validate_environment() -> None:
|
|
74
76
|
error_text.append("• ", style="white")
|
75
77
|
error_text.append("STRIX_LLM", style="bold cyan")
|
76
78
|
error_text.append(
|
77
|
-
" - Model name to use with litellm (e.g., '
|
79
|
+
" - Model name to use with litellm (e.g., 'openai/gpt-5')\n",
|
78
80
|
style="white",
|
79
81
|
)
|
80
82
|
error_text.append("• ", style="white")
|
@@ -91,9 +93,7 @@ def validate_environment() -> None:
|
|
91
93
|
)
|
92
94
|
|
93
95
|
error_text.append("\nExample setup:\n", style="white")
|
94
|
-
error_text.append(
|
95
|
-
"export STRIX_LLM='anthropic/claude-opus-4-1-20250805'\n", style="dim white"
|
96
|
-
)
|
96
|
+
error_text.append("export STRIX_LLM='openai/gpt-5'\n", style="dim white")
|
97
97
|
error_text.append("export LLM_API_KEY='your-api-key-here'\n", style="dim white")
|
98
98
|
if missing_optional_vars:
|
99
99
|
error_text.append(
|
@@ -127,7 +127,9 @@ def check_docker_installed() -> None:
|
|
127
127
|
error_text.append("DOCKER NOT INSTALLED", style="bold red")
|
128
128
|
error_text.append("\n\n", style="white")
|
129
129
|
error_text.append("The 'docker' CLI was not found in your PATH.\n", style="white")
|
130
|
-
error_text.append(
|
130
|
+
error_text.append(
|
131
|
+
"Please install Docker and ensure the 'docker' command is available.\n\n", style="white"
|
132
|
+
)
|
131
133
|
|
132
134
|
panel = Panel(
|
133
135
|
error_text,
|
@@ -144,7 +146,7 @@ async def warm_up_llm() -> None:
|
|
144
146
|
console = Console()
|
145
147
|
|
146
148
|
try:
|
147
|
-
model_name = os.getenv("STRIX_LLM", "
|
149
|
+
model_name = os.getenv("STRIX_LLM", "openai/gpt-5")
|
148
150
|
api_key = os.getenv("LLM_API_KEY")
|
149
151
|
|
150
152
|
if api_key:
|
@@ -204,6 +206,84 @@ def generate_run_name() -> str:
|
|
204
206
|
return f"{adj}-{noun}-{number}"
|
205
207
|
|
206
208
|
|
209
|
+
def clone_repository(repo_url: str, run_name: str) -> str:
|
210
|
+
console = Console()
|
211
|
+
|
212
|
+
git_executable = shutil.which("git")
|
213
|
+
if git_executable is None:
|
214
|
+
raise FileNotFoundError("Git executable not found in PATH")
|
215
|
+
|
216
|
+
temp_dir = Path(tempfile.gettempdir()) / "strix_repos" / run_name
|
217
|
+
temp_dir.mkdir(parents=True, exist_ok=True)
|
218
|
+
|
219
|
+
repo_name = Path(repo_url).stem if repo_url.endswith(".git") else Path(repo_url).name
|
220
|
+
|
221
|
+
clone_path = temp_dir / repo_name
|
222
|
+
|
223
|
+
if clone_path.exists():
|
224
|
+
shutil.rmtree(clone_path)
|
225
|
+
|
226
|
+
try:
|
227
|
+
with console.status(f"[bold cyan]Cloning repository {repo_name}...", spinner="dots"):
|
228
|
+
subprocess.run( # noqa: S603
|
229
|
+
[
|
230
|
+
git_executable,
|
231
|
+
"clone",
|
232
|
+
"--depth=1",
|
233
|
+
"--no-recurse-submodules",
|
234
|
+
"--single-branch",
|
235
|
+
repo_url,
|
236
|
+
str(clone_path),
|
237
|
+
],
|
238
|
+
capture_output=True,
|
239
|
+
text=True,
|
240
|
+
check=True,
|
241
|
+
)
|
242
|
+
|
243
|
+
return str(clone_path.absolute())
|
244
|
+
|
245
|
+
except subprocess.CalledProcessError as e:
|
246
|
+
error_text = Text()
|
247
|
+
error_text.append("❌ ", style="bold red")
|
248
|
+
error_text.append("REPOSITORY CLONE FAILED", style="bold red")
|
249
|
+
error_text.append("\n\n", style="white")
|
250
|
+
error_text.append(f"Could not clone repository: {repo_url}\n", style="white")
|
251
|
+
error_text.append(
|
252
|
+
f"Error: {e.stderr if hasattr(e, 'stderr') and e.stderr else str(e)}", style="dim red"
|
253
|
+
)
|
254
|
+
|
255
|
+
panel = Panel(
|
256
|
+
error_text,
|
257
|
+
title="[bold red]🛡️ STRIX CLONE ERROR",
|
258
|
+
title_align="center",
|
259
|
+
border_style="red",
|
260
|
+
padding=(1, 2),
|
261
|
+
)
|
262
|
+
console.print("\n")
|
263
|
+
console.print(panel)
|
264
|
+
console.print()
|
265
|
+
sys.exit(1)
|
266
|
+
except FileNotFoundError:
|
267
|
+
error_text = Text()
|
268
|
+
error_text.append("❌ ", style="bold red")
|
269
|
+
error_text.append("GIT NOT FOUND", style="bold red")
|
270
|
+
error_text.append("\n\n", style="white")
|
271
|
+
error_text.append("Git is not installed or not available in PATH.\n", style="white")
|
272
|
+
error_text.append("Please install Git to clone repositories.\n", style="white")
|
273
|
+
|
274
|
+
panel = Panel(
|
275
|
+
error_text,
|
276
|
+
title="[bold red]🛡️ STRIX CLONE ERROR",
|
277
|
+
title_align="center",
|
278
|
+
border_style="red",
|
279
|
+
padding=(1, 2),
|
280
|
+
)
|
281
|
+
console.print("\n")
|
282
|
+
console.print(panel)
|
283
|
+
console.print()
|
284
|
+
sys.exit(1)
|
285
|
+
|
286
|
+
|
207
287
|
def infer_target_type(target: str) -> tuple[str, dict[str, str]]:
|
208
288
|
if not target or not isinstance(target, str):
|
209
289
|
raise ValueError("Target must be a non-empty string")
|
@@ -544,16 +624,23 @@ def main() -> None:
|
|
544
624
|
if sys.platform == "win32":
|
545
625
|
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
|
546
626
|
|
627
|
+
args = parse_arguments()
|
628
|
+
|
547
629
|
check_docker_installed()
|
548
630
|
pull_docker_image()
|
549
631
|
|
550
632
|
validate_environment()
|
551
633
|
asyncio.run(warm_up_llm())
|
552
634
|
|
553
|
-
args = parse_arguments()
|
554
635
|
if not args.run_name:
|
555
636
|
args.run_name = generate_run_name()
|
556
637
|
|
638
|
+
if args.target_type == "repository":
|
639
|
+
repo_url = args.target_dict["target_repo"]
|
640
|
+
cloned_path = clone_repository(repo_url, args.run_name)
|
641
|
+
|
642
|
+
args.target_dict["cloned_repo_path"] = cloned_path
|
643
|
+
|
557
644
|
asyncio.run(run_strix_cli(args))
|
558
645
|
|
559
646
|
results_path = Path("agent_runs") / args.run_name
|