circle-ir 4.9.21 → 4.9.23

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.
Files changed (33) hide show
  1. package/dist/analysis/interprocedural.d.ts +0 -6
  2. package/dist/analysis/interprocedural.d.ts.map +1 -1
  3. package/dist/analysis/interprocedural.js +64 -0
  4. package/dist/analysis/interprocedural.js.map +1 -1
  5. package/dist/analysis/modelled-cwes.d.ts +35 -0
  6. package/dist/analysis/modelled-cwes.d.ts.map +1 -0
  7. package/dist/analysis/modelled-cwes.js +63 -0
  8. package/dist/analysis/modelled-cwes.js.map +1 -0
  9. package/dist/analysis/passes/language-sources-pass.d.ts.map +1 -1
  10. package/dist/analysis/passes/language-sources-pass.js +184 -0
  11. package/dist/analysis/passes/language-sources-pass.js.map +1 -1
  12. package/dist/analysis/passes/xml-entity-expansion-pass.d.ts +46 -3
  13. package/dist/analysis/passes/xml-entity-expansion-pass.d.ts.map +1 -1
  14. package/dist/analysis/passes/xml-entity-expansion-pass.js +139 -13
  15. package/dist/analysis/passes/xml-entity-expansion-pass.js.map +1 -1
  16. package/dist/analysis/taint-matcher.d.ts.map +1 -1
  17. package/dist/analysis/taint-matcher.js +56 -0
  18. package/dist/analysis/taint-matcher.js.map +1 -1
  19. package/dist/browser/circle-ir.js +371 -17
  20. package/dist/core/circle-ir-core.cjs +24 -0
  21. package/dist/core/circle-ir-core.js +24 -0
  22. package/dist/index.d.ts +1 -0
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +3 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/languages/plugins/go.d.ts.map +1 -1
  27. package/dist/languages/plugins/go.js +21 -2
  28. package/dist/languages/plugins/go.js.map +1 -1
  29. package/dist/languages/plugins/index.d.ts +8 -0
  30. package/dist/languages/plugins/index.d.ts.map +1 -1
  31. package/dist/languages/plugins/index.js +21 -9
  32. package/dist/languages/plugins/index.js.map +1 -1
  33. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Pass: xml-entity-expansion (CWE-776 / CWE-611, category: security)
2
+ * Pass: xml-entity-expansion (CWE-611 / CWE-776, category: security)
3
3
  *
4
4
  * Pattern pass — flags XML parser instantiation that does *not* disable
5
5
  * DTD / external-entity processing in the same file. This covers:
@@ -14,8 +14,11 @@
14
14
  * - `XMLInputFactory.newInstance()` (StAX)
15
15
  * - `SchemaFactory.newInstance(...)`
16
16
  * - `TransformerFactory.newInstance()`
17
- * Safe-feature setters (any of these in the same file silences the
18
- * finding for that factory class):
17
+ * Safe-feature setters. Any of these in the file silences a factory
18
+ * UNLESS that factory is a local variable which provably never receives
19
+ * one (no hardening-capable setter on it in its method, never passed to
20
+ * another call, never returned) — so one hardened factory no longer masks
21
+ * an unhardened one beside it:
19
22
  * - `setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)`
20
23
  * - `setFeature("http://xml.org/sax/features/external-general-entities", false)`
21
24
  * - `setFeature("http://xml.org/sax/features/external-parameter-entities", false)`
@@ -35,6 +38,19 @@
35
38
  * because billion-laughs is exploitable via any attacker-supplied entity
36
39
  * file even when the parse() argument itself is trusted.
37
40
  *
41
+ * CWE is assigned PER API, by which weakness the unhardened default actually
42
+ * leaves open (#426) — the same per-API reasoning `language-sources-pass`
43
+ * applies to Python's `xml.sax`:
44
+ * - Java JAXP factories -> CWE-611. External entity resolution is ON by
45
+ * default, while JAXP has shipped a default entity-expansion limit for
46
+ * years, so the live risk on a current JDK is external entities. Every
47
+ * hardening token this pass looks for is an external-entity control.
48
+ * - `lxml.etree` -> CWE-611. `resolve_entities` defaults on.
49
+ * - `xml.etree.ElementTree` -> CWE-776. It never resolves external entities;
50
+ * what remains is entity expansion.
51
+ * The JS variant of this rule (`libxmljs` `noent: true`) already reported
52
+ * CWE-611, so before this the rule disagreed with itself across languages.
53
+ *
38
54
  * Issue: #86, Sprint 6.
39
55
  */
40
56
  import type { AnalysisPass, PassContext } from '../../graph/analysis-pass.js';
@@ -50,6 +66,33 @@ export declare class XmlEntityExpansionPass implements AnalysisPass<XmlEntityExp
50
66
  readonly name = "xml-entity-expansion";
51
67
  readonly category: 'security';
52
68
  run(ctx: PassContext): XmlEntityExpansionResult;
69
+ private methodRanges;
70
+ /**
71
+ * In a file that DOES contain hardening evidence, is the factory created on
72
+ * `line` one that provably never receives it?
73
+ *
74
+ * Deliberately one-sided. It answers true for exactly two shapes:
75
+ *
76
+ * 1. CHAINED — `Factory.newInstance().newDocumentBuilder()`, where the
77
+ * product is not handed on or returned either.
78
+ * 2. LOCAL — `Factory f = Factory.newInstance();` where the enclosing method
79
+ * builds a parser from `f`, never hands `f` to another call, and never
80
+ * returns it.
81
+ *
82
+ * and in both only when the enclosing method contains NO hardening-capable
83
+ * setter on ANY receiver, since hardening may land on the factory's product
84
+ * (`parser.getXMLReader().setFeature(…)`) rather than the factory.
85
+ *
86
+ * Every other shape — a field, a helper that takes the factory, a caller that
87
+ * receives it — may be hardened somewhere this check cannot see, so it keeps
88
+ * the previous file-level silence.
89
+ *
90
+ * A TransformerFactory additionally needs a `StreamSource` in its method: that
91
+ * is the input the transformer parses with its OWN parser. Fed a `DOMSource`
92
+ * it parses nothing, and fed a `SAXSource` it uses the reader it was given —
93
+ * whose hardening is that reader's business, not this factory's.
94
+ */
95
+ private isProvablyUnhardened;
53
96
  private detectJavaCall;
54
97
  private detectPythonCall;
55
98
  private fixForJava;
@@ -1 +1 @@
1
- {"version":3,"file":"xml-entity-expansion-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/xml-entity-expansion-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AA6C9E,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC,CAAC;CACJ;AAED,qBAAa,sBACX,YAAW,YAAY,CAAC,wBAAwB,CAAC;IAEjD,QAAQ,CAAC,IAAI,0BAA0B;IACvC,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;IAExC,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,wBAAwB,CAsF9C;IAED,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,UAAU;IA6BlB,OAAO,CAAC,YAAY;CAarB"}
1
+ {"version":3,"file":"xml-entity-expansion-pass.d.ts","sourceRoot":"","sources":["../../../src/analysis/passes/xml-entity-expansion-pass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAwD9E,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC,CAAC;CACJ;AAED,qBAAa,sBACX,YAAW,YAAY,CAAC,wBAAwB,CAAC;IAEjD,QAAQ,CAAC,IAAI,0BAA0B;IACvC,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;IAExC,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,wBAAwB,CAmG9C;IAED,OAAO,CAAC,YAAY;IAWpB;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,OAAO,CAAC,oBAAoB;IA0D5B,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,UAAU;IA6BlB,OAAO,CAAC,YAAY;CAarB"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Pass: xml-entity-expansion (CWE-776 / CWE-611, category: security)
2
+ * Pass: xml-entity-expansion (CWE-611 / CWE-776, category: security)
3
3
  *
4
4
  * Pattern pass — flags XML parser instantiation that does *not* disable
5
5
  * DTD / external-entity processing in the same file. This covers:
@@ -14,8 +14,11 @@
14
14
  * - `XMLInputFactory.newInstance()` (StAX)
15
15
  * - `SchemaFactory.newInstance(...)`
16
16
  * - `TransformerFactory.newInstance()`
17
- * Safe-feature setters (any of these in the same file silences the
18
- * finding for that factory class):
17
+ * Safe-feature setters. Any of these in the file silences a factory
18
+ * UNLESS that factory is a local variable which provably never receives
19
+ * one (no hardening-capable setter on it in its method, never passed to
20
+ * another call, never returned) — so one hardened factory no longer masks
21
+ * an unhardened one beside it:
19
22
  * - `setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)`
20
23
  * - `setFeature("http://xml.org/sax/features/external-general-entities", false)`
21
24
  * - `setFeature("http://xml.org/sax/features/external-parameter-entities", false)`
@@ -35,6 +38,19 @@
35
38
  * because billion-laughs is exploitable via any attacker-supplied entity
36
39
  * file even when the parse() argument itself is trusted.
37
40
  *
41
+ * CWE is assigned PER API, by which weakness the unhardened default actually
42
+ * leaves open (#426) — the same per-API reasoning `language-sources-pass`
43
+ * applies to Python's `xml.sax`:
44
+ * - Java JAXP factories -> CWE-611. External entity resolution is ON by
45
+ * default, while JAXP has shipped a default entity-expansion limit for
46
+ * years, so the live risk on a current JDK is external entities. Every
47
+ * hardening token this pass looks for is an external-entity control.
48
+ * - `lxml.etree` -> CWE-611. `resolve_entities` defaults on.
49
+ * - `xml.etree.ElementTree` -> CWE-776. It never resolves external entities;
50
+ * what remains is entity expansion.
51
+ * The JS variant of this rule (`libxmljs` `noent: true`) already reported
52
+ * CWE-611, so before this the rule disagreed with itself across languages.
53
+ *
38
54
  * Issue: #86, Sprint 6.
39
55
  */
40
56
  const JAVA_FACTORIES = new Set([
@@ -63,6 +79,13 @@ const JAVA_XML_PARSE_INPUT_RE = /\bnew\s+(?:StreamSource|SAXSource|InputSource)\
63
79
  // - file calls NO builder.parse(...) (never reads bytes)
64
80
  const JAVA_DOC_BUILDER_NEW_DOCUMENT_RE = /\.\s*newDocument\s*\(\s*\)/;
65
81
  const JAVA_DOC_BUILDER_PARSE_RE = /(?:DocumentBuilder|builder)\s*\.\s*parse\s*\(/;
82
+ // Any call that CAN carry XML hardening, on any receiver — factory, parser,
83
+ // reader, validator or transformer. Matched by name, not argument, because the
84
+ // feature string is routinely a constant declared elsewhere.
85
+ const JAVA_HARDENING_SETTER_RE = /\.\s*(?:setFeature|setAttribute|setProperty|setXIncludeAware|setExpandEntityReferences)\s*\(/;
86
+ // A factory consumed in the same expression that creates it — never bound to a
87
+ // name, so it can never be configured.
88
+ const JAVA_FACTORY_CHAINED_RE = /\bnewInstance\s*\([^()]*\)\s*\.\s*(?:newDocumentBuilder|newSAXParser|newTransformer|newTemplates|newSchema|createXMLStreamReader|createXMLEventReader)\s*\(/;
66
89
  const PY_LXML_PARSER_INSECURE_DEFAULT_RE = /\bresolve_entities\s*=\s*False\b/;
67
90
  export class XmlEntityExpansionPass {
68
91
  name = 'xml-entity-expansion';
@@ -74,8 +97,15 @@ export class XmlEntityExpansionPass {
74
97
  const code = ctx.code ?? '';
75
98
  if (language === 'java') {
76
99
  const safeInFile = JAVA_SAFE_EVIDENCE_RE.test(code);
77
- if (safeInFile)
78
- return { findings };
100
+ // Hardening evidence used to silence the WHOLE file, so one hardened
101
+ // factory masked every other factory beside it. When evidence exists,
102
+ // keep only the factories that provably never receive it (see
103
+ // `isProvablyUnhardened`); anything ambiguous stays silent, as before.
104
+ // `jdk.xml.*` limits are set process-wide (System.setProperty), so they
105
+ // reach every factory regardless of which variable the file touches.
106
+ const processWide = safeInFile && /jdk\.xml\./.test(code);
107
+ const lines = safeInFile ? code.split('\n') : [];
108
+ const methodRanges = safeInFile ? this.methodRanges(graph.ir.types) : [];
79
109
  // #173 — output-only TransformerFactory + empty DocumentBuilder.
80
110
  // File-level heuristics; conservative-bias (only suppress when the
81
111
  // file shows ONLY the safe shape and NO unsafe shape).
@@ -93,6 +123,8 @@ export class XmlEntityExpansionPass {
93
123
  if (det.api === 'DocumentBuilderFactory' && isDocumentBuilderEmptyOnly)
94
124
  continue;
95
125
  const line = call.location.line;
126
+ if (safeInFile && (processWide || !this.isProvablyUnhardened(lines, line, methodRanges, det.api)))
127
+ continue;
96
128
  findings.push({ line, language, ...det });
97
129
  ctx.addFinding({
98
130
  id: `${this.name}-${file}-${line}-${det.api}`,
@@ -103,15 +135,15 @@ export class XmlEntityExpansionPass {
103
135
  severity: 'high',
104
136
  level: 'error',
105
137
  message: `${det.api} created without disabling DTD / external-entity ` +
106
- 'processing. Vulnerable to billion-laughs / quadratic ' +
107
- 'blow-up DoS (CWE-776) and external-entity disclosure ' +
108
- '(CWE-611). Add `setFeature("http://apache.org/xml/features/' +
138
+ 'processing. Vulnerable to external-entity disclosure ' +
139
+ '(CWE-611) and billion-laughs / quadratic blow-up DoS ' +
140
+ '(CWE-776). Add `setFeature("http://apache.org/xml/features/' +
109
141
  'disallow-doctype-decl", true)` (or the equivalent) before ' +
110
142
  'parsing.',
111
143
  file,
112
144
  line,
113
145
  fix: this.fixForJava(det.api),
114
- evidence: { ...det, language, safeFeatureInFile: false },
146
+ evidence: { ...det, language, safeFeatureInFile: safeInFile },
115
147
  });
116
148
  }
117
149
  return { findings };
@@ -136,8 +168,11 @@ export class XmlEntityExpansionPass {
136
168
  severity: 'high',
137
169
  level: 'error',
138
170
  message: `${det.api} called without an entity-safe parser. Vulnerable ` +
139
- 'to billion-laughs / quadratic blow-up DoS (CWE-776) and ' +
140
- 'external-entity disclosure (CWE-611). Use `defusedxml` or pass ' +
171
+ (det.cwe === 'CWE-611'
172
+ ? 'to external-entity disclosure (CWE-611) and billion-laughs / ' +
173
+ 'quadratic blow-up DoS (CWE-776). '
174
+ : 'to billion-laughs / quadratic blow-up DoS (CWE-776). ') +
175
+ 'Use `defusedxml` or pass ' +
141
176
  'an `XMLParser(resolve_entities=False)` to lxml.',
142
177
  file,
143
178
  line,
@@ -149,6 +184,97 @@ export class XmlEntityExpansionPass {
149
184
  }
150
185
  return { findings };
151
186
  }
187
+ methodRanges(types) {
188
+ const out = [];
189
+ for (const t of types ?? []) {
190
+ for (const m of t.methods ?? []) {
191
+ if (typeof m.start_line === 'number' && typeof m.end_line === 'number')
192
+ out.push([m.start_line, m.end_line]);
193
+ }
194
+ }
195
+ return out;
196
+ }
197
+ /**
198
+ * In a file that DOES contain hardening evidence, is the factory created on
199
+ * `line` one that provably never receives it?
200
+ *
201
+ * Deliberately one-sided. It answers true for exactly two shapes:
202
+ *
203
+ * 1. CHAINED — `Factory.newInstance().newDocumentBuilder()`, where the
204
+ * product is not handed on or returned either.
205
+ * 2. LOCAL — `Factory f = Factory.newInstance();` where the enclosing method
206
+ * builds a parser from `f`, never hands `f` to another call, and never
207
+ * returns it.
208
+ *
209
+ * and in both only when the enclosing method contains NO hardening-capable
210
+ * setter on ANY receiver, since hardening may land on the factory's product
211
+ * (`parser.getXMLReader().setFeature(…)`) rather than the factory.
212
+ *
213
+ * Every other shape — a field, a helper that takes the factory, a caller that
214
+ * receives it — may be hardened somewhere this check cannot see, so it keeps
215
+ * the previous file-level silence.
216
+ *
217
+ * A TransformerFactory additionally needs a `StreamSource` in its method: that
218
+ * is the input the transformer parses with its OWN parser. Fed a `DOMSource`
219
+ * it parses nothing, and fed a `SAXSource` it uses the reader it was given —
220
+ * whose hardening is that reader's business, not this factory's.
221
+ */
222
+ isProvablyUnhardened(lines, line, methodRanges, api) {
223
+ // Innermost enclosing method; without one the factory's reach is unknown.
224
+ let range = null;
225
+ for (const r of methodRanges) {
226
+ if (line < r[0] || line > r[1])
227
+ continue;
228
+ if (!range || r[1] - r[0] < range[1] - range[0])
229
+ range = r;
230
+ }
231
+ if (!range)
232
+ return false;
233
+ // The creating statement, joined to its `;` — `newInstance(` is often broken
234
+ // across lines after the opening parenthesis.
235
+ let decl = '';
236
+ let declEnd = line;
237
+ for (; declEnd <= Math.min(line + 3, range[1]); declEnd++) {
238
+ decl += ' ' + (lines[declEnd - 1] ?? '').trim();
239
+ if (decl.includes(';'))
240
+ break;
241
+ }
242
+ const body = lines.slice(line - 1, range[1]).join('\n');
243
+ if (api === 'TransformerFactory' && !/\bnew\s+StreamSource\s*\(/.test(body))
244
+ return false;
245
+ // Hardening need not land on the factory: `parser.getXMLReader().setFeature(…)`
246
+ // and `parser.setProperty(…)` harden its PRODUCT. So a method containing any
247
+ // hardening-capable setter, on any receiver, is not provable either way.
248
+ if (JAVA_HARDENING_SETTER_RE.test(body))
249
+ return false;
250
+ const chained = JAVA_FACTORY_CHAINED_RE.exec(decl);
251
+ if (chained) {
252
+ // The product may still be handed to a helper that hardens it.
253
+ const prod = /[\w>\]]\s+([A-Za-z_$][\w$]*)\s*=/.exec(decl);
254
+ if (!prod)
255
+ return true;
256
+ const pn = prod[1].replace(/\$/g, '\\$');
257
+ const after = lines.slice(declEnd, range[1]).join('\n');
258
+ return !new RegExp(`[(,]\\s*${pn}\\s*[,)]|\\breturn\\s+${pn}\\s*;`).test(after);
259
+ }
260
+ // `Type name = …newInstance(…);` — a declaration ending the statement, so
261
+ // `name` is a local bound to the factory itself and not to a chained result.
262
+ const m = /[\w>\]]\s+([A-Za-z_$][\w$]*)\s*=\s*[\w.]*\bnewInstance\s*\([^()]*\)\s*;/.exec(decl);
263
+ if (!m)
264
+ return false;
265
+ const name = m[1].replace(/\$/g, '\\$');
266
+ const rest = lines.slice(declEnd, range[1]).join('\n');
267
+ // Only a factory that goes on to build a parser matters; one created to
268
+ // inspect (`factory.getClass()`) and dropped parses nothing.
269
+ const builds = new RegExp(`\\b${name}\\s*\\.\\s*(?:newDocumentBuilder|newSAXParser|newTransformer|newTemplates|newSchema|createXMLStreamReader|createXMLEventReader)\\s*\\(`);
270
+ if (!builds.test(rest))
271
+ return false;
272
+ // Passed to another call (`harden(dbf)`, `x.configure(a, dbf)`) or returned.
273
+ const escapes = new RegExp(`[(,]\\s*${name}\\s*[,)]|\\breturn\\s+${name}\\s*;`);
274
+ if (escapes.test(rest))
275
+ return false;
276
+ return true;
277
+ }
152
278
  detectJavaCall(call) {
153
279
  if (call.method_name !== 'newInstance')
154
280
  return null;
@@ -160,7 +286,7 @@ export class XmlEntityExpansionPass {
160
286
  return {
161
287
  pattern: `${factory}.newInstance()`,
162
288
  api: factory,
163
- cwe: 'CWE-776',
289
+ cwe: 'CWE-611',
164
290
  };
165
291
  }
166
292
  }
@@ -175,7 +301,7 @@ export class XmlEntityExpansionPass {
175
301
  return {
176
302
  pattern: `etree.${method}`,
177
303
  api: `lxml.etree.${method}`,
178
- cwe: 'CWE-776',
304
+ cwe: 'CWE-611',
179
305
  };
180
306
  }
181
307
  // xml.etree.ElementTree.parse / fromstring
@@ -1 +1 @@
1
- {"version":3,"file":"xml-entity-expansion-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/xml-entity-expansion-pass.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"xml-entity-expansion-pass.js","sourceRoot":"","sources":["../../../src/analysis/passes/xml-entity-expansion-pass.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"taint-matcher.d.ts","sourceRoot":"","sources":["../../src/analysis/taint-matcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAgB,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAkB,KAAK,EAAwB,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAElK,OAAO,KAAK,EAAE,WAAW,EAAiB,WAAW,EAAoB,MAAM,oBAAoB,CAAC;AACpG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAwF7E,wBAAgB,YAAY,CAC1B,KAAK,EAAE,QAAQ,EAAE,EACjB,KAAK,EAAE,QAAQ,EAAE,EACjB,MAAM,GAAE,WAAgC,EACxC,aAAa,CAAC,EAAE,qBAAqB,EACrC,QAAQ,CAAC,EAAE,iBAAiB,EAC5B,IAAI,CAAC,EAAE,MAAM,GACZ,KAAK,CAWP;AA0JD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,WAAW,EAAE,EACtB,KAAK,EAAE,SAAS,EAAE,EAClB,IAAI,EAAE,MAAM,GACX,IAAI,CAYN;AAi5FD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,GACnB,OAAO,CAET"}
1
+ {"version":3,"file":"taint-matcher.d.ts","sourceRoot":"","sources":["../../src/analysis/taint-matcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAgB,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAkB,KAAK,EAAwB,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAElK,OAAO,KAAK,EAAE,WAAW,EAAiB,WAAW,EAAoB,MAAM,oBAAoB,CAAC;AACpG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAwF7E,wBAAgB,YAAY,CAC1B,KAAK,EAAE,QAAQ,EAAE,EACjB,KAAK,EAAE,QAAQ,EAAE,EACjB,MAAM,GAAE,WAAgC,EACxC,aAAa,CAAC,EAAE,qBAAqB,EACrC,QAAQ,CAAC,EAAE,iBAAiB,EAC5B,IAAI,CAAC,EAAE,MAAM,GACZ,KAAK,CAWP;AA0JD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,WAAW,EAAE,EACtB,KAAK,EAAE,SAAS,EAAE,EAClB,IAAI,EAAE,MAAM,GACX,IAAI,CAYN;AAw8FD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,GACnB,OAAO,CAET"}
@@ -1793,6 +1793,53 @@ function classifyGoDestinationType(decl) {
1793
1793
  // include the untyped tokens above, treat it as safe.
1794
1794
  return 'safe';
1795
1795
  }
1796
+ /**
1797
+ * #456 — true when a Go `fmt.Fprint` / `Fprintf` / `Fprintln` xss sink's
1798
+ * writer (arg[0]) does NOT resolve to an `http.ResponseWriter` parameter of
1799
+ * the enclosing function. Only the plain identifier form is recognised (`w`,
1800
+ * `rw`, `resp`); the signature may wrap, so up to four lines from the nearest
1801
+ * preceding `func` are joined before matching. Anything else — a field, a
1802
+ * call result, a shadowed name — is treated as not a response writer.
1803
+ */
1804
+ function isGoFprintToNonResponseWriter(call, pattern, language, sourceLines) {
1805
+ if (language !== 'go')
1806
+ return false;
1807
+ if (pattern.type !== 'xss' || pattern.class !== 'fmt')
1808
+ return false;
1809
+ if (!/^Fprint(?:f|ln)?$/.test(call.method_name))
1810
+ return false;
1811
+ if (!sourceLines)
1812
+ return true;
1813
+ const writer = call.arguments.find(a => a.position === 0);
1814
+ const name = (writer?.expression ?? '').trim();
1815
+ if (!/^[A-Za-z_]\w*$/.test(name))
1816
+ return true;
1817
+ // Walk up to the nearest enclosing `func` header — a top-level declaration OR
1818
+ // an inline closure (`router.GET("/", func(w http.ResponseWriter, …) {`), which
1819
+ // is the common handler shape and does not start the line. The first `func`
1820
+ // above the call whose parameter list names the writer as an http.ResponseWriter
1821
+ // keeps the sink; the first one that does not drops it.
1822
+ const rwRe = new RegExp(`\\b${name}\\s+(?:net/)?http\\.ResponseWriter\\b`);
1823
+ for (let i = call.location.line - 1; i >= 0; i--) {
1824
+ const line = sourceLines[i] ?? '';
1825
+ const funcIdx = line.search(/\bfunc\b/);
1826
+ if (funcIdx < 0)
1827
+ continue;
1828
+ // Parameter list is between this `func` and the opening brace of its body,
1829
+ // which may be a few lines down when the signature wraps.
1830
+ const header = sourceLines.slice(i, i + 4).join(' ');
1831
+ const brace = header.indexOf('{');
1832
+ const params = header.slice(funcIdx, brace >= 0 ? brace : header.length);
1833
+ if (rwRe.test(params))
1834
+ return false; // writer is this scope's ResponseWriter
1835
+ // A named function that does not take the writer: the name is not a
1836
+ // response writer here. An inline closure that does not either — keep
1837
+ // climbing, an outer scope may still bind it.
1838
+ if (/^\s*func\b/.test(line))
1839
+ return true;
1840
+ }
1841
+ return true;
1842
+ }
1796
1843
  /**
1797
1844
  * Gate for Go `json.Unmarshal(data, &dst)` / `json.NewDecoder(r).Decode(&dst)`
1798
1845
  * deserialization (CWE-502) sinks. Returns `true` when the destination is a
@@ -2131,6 +2178,15 @@ function findSinks(calls, patterns, typeHierarchy, language, sourceLines, types)
2131
2178
  if (isSafeGoJsonUnmarshalCall(call, pattern, language, sourceLines)) {
2132
2179
  continue;
2133
2180
  }
2181
+ // #456 — Go fmt.Fprint*(writer, …) is xss only when the writer is the
2182
+ // enclosing handler's http.ResponseWriter. Any other writer (stderr,
2183
+ // a file, a buffer) keeps the CWE-134 format_string sink and nothing
2184
+ // else. Unresolvable writers are dropped: an xss finding that names
2185
+ // the wrong sphere is worse than the low-confidence escape it
2186
+ // replaces.
2187
+ if (isGoFprintToNonResponseWriter(call, pattern, language, sourceLines)) {
2188
+ continue;
2189
+ }
2134
2190
  // #147 — Jinja2 safe render-context. Template("literal").render(**ctx)
2135
2191
  // and render_template_string("literal", **ctx) and Template("literal")
2136
2192
  // alone are safe: the template SOURCE is a constant string and Jinja2