circle-ir 3.1.0

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 (194) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +200 -0
  3. package/configs/sinks/code_injection.yaml +672 -0
  4. package/configs/sinks/command.yaml +917 -0
  5. package/configs/sinks/deserialization.yaml +105 -0
  6. package/configs/sinks/ldap.yaml +136 -0
  7. package/configs/sinks/nodejs.json +629 -0
  8. package/configs/sinks/path.yaml +715 -0
  9. package/configs/sinks/python.json +501 -0
  10. package/configs/sinks/rust.json +339 -0
  11. package/configs/sinks/sql.yaml +233 -0
  12. package/configs/sinks/ssrf.yaml +160 -0
  13. package/configs/sinks/xpath.yaml +121 -0
  14. package/configs/sinks/xss.yaml +727 -0
  15. package/configs/sources/db_sources.yaml +90 -0
  16. package/configs/sources/env_sources.yaml +94 -0
  17. package/configs/sources/express.json +197 -0
  18. package/configs/sources/file_sources.yaml +164 -0
  19. package/configs/sources/http_sources.yaml +379 -0
  20. package/configs/sources/io_sources.yaml +519 -0
  21. package/configs/sources/network_sources.yaml +99 -0
  22. package/configs/sources/python.json +230 -0
  23. package/configs/sources/rust.json +286 -0
  24. package/configs/sources/spring.yaml +70 -0
  25. package/dist/analysis/advisory-db.d.ts +86 -0
  26. package/dist/analysis/advisory-db.js +104 -0
  27. package/dist/analysis/advisory-db.js.map +1 -0
  28. package/dist/analysis/cargo-parser.d.ts +42 -0
  29. package/dist/analysis/cargo-parser.js +102 -0
  30. package/dist/analysis/cargo-parser.js.map +1 -0
  31. package/dist/analysis/config-loader.d.ts +37 -0
  32. package/dist/analysis/config-loader.js +1561 -0
  33. package/dist/analysis/config-loader.js.map +1 -0
  34. package/dist/analysis/constant-propagation/ast-utils.d.ts +25 -0
  35. package/dist/analysis/constant-propagation/ast-utils.js +34 -0
  36. package/dist/analysis/constant-propagation/ast-utils.js.map +1 -0
  37. package/dist/analysis/constant-propagation/evaluator.d.ts +32 -0
  38. package/dist/analysis/constant-propagation/evaluator.js +296 -0
  39. package/dist/analysis/constant-propagation/evaluator.js.map +1 -0
  40. package/dist/analysis/constant-propagation/index.d.ts +62 -0
  41. package/dist/analysis/constant-propagation/index.js +152 -0
  42. package/dist/analysis/constant-propagation/index.js.map +1 -0
  43. package/dist/analysis/constant-propagation/patterns.d.ts +8 -0
  44. package/dist/analysis/constant-propagation/patterns.js +126 -0
  45. package/dist/analysis/constant-propagation/patterns.js.map +1 -0
  46. package/dist/analysis/constant-propagation/propagator.d.ts +180 -0
  47. package/dist/analysis/constant-propagation/propagator.js +1985 -0
  48. package/dist/analysis/constant-propagation/propagator.js.map +1 -0
  49. package/dist/analysis/constant-propagation/types.d.ts +63 -0
  50. package/dist/analysis/constant-propagation/types.js +5 -0
  51. package/dist/analysis/constant-propagation/types.js.map +1 -0
  52. package/dist/analysis/constant-propagation.d.ts +9 -0
  53. package/dist/analysis/constant-propagation.js +18 -0
  54. package/dist/analysis/constant-propagation.js.map +1 -0
  55. package/dist/analysis/dependency-scanner.d.ts +79 -0
  56. package/dist/analysis/dependency-scanner.js +122 -0
  57. package/dist/analysis/dependency-scanner.js.map +1 -0
  58. package/dist/analysis/dfg-verifier.d.ts +116 -0
  59. package/dist/analysis/dfg-verifier.js +399 -0
  60. package/dist/analysis/dfg-verifier.js.map +1 -0
  61. package/dist/analysis/findings.d.ts +11 -0
  62. package/dist/analysis/findings.js +228 -0
  63. package/dist/analysis/findings.js.map +1 -0
  64. package/dist/analysis/index.d.ts +16 -0
  65. package/dist/analysis/index.js +18 -0
  66. package/dist/analysis/index.js.map +1 -0
  67. package/dist/analysis/interprocedural.d.ts +99 -0
  68. package/dist/analysis/interprocedural.js +526 -0
  69. package/dist/analysis/interprocedural.js.map +1 -0
  70. package/dist/analysis/path-finder.d.ts +133 -0
  71. package/dist/analysis/path-finder.js +354 -0
  72. package/dist/analysis/path-finder.js.map +1 -0
  73. package/dist/analysis/rules.d.ts +75 -0
  74. package/dist/analysis/rules.js +332 -0
  75. package/dist/analysis/rules.js.map +1 -0
  76. package/dist/analysis/semver.d.ts +27 -0
  77. package/dist/analysis/semver.js +127 -0
  78. package/dist/analysis/semver.js.map +1 -0
  79. package/dist/analysis/taint-matcher.d.ts +15 -0
  80. package/dist/analysis/taint-matcher.js +634 -0
  81. package/dist/analysis/taint-matcher.js.map +1 -0
  82. package/dist/analysis/taint-propagation.d.ts +67 -0
  83. package/dist/analysis/taint-propagation.js +298 -0
  84. package/dist/analysis/taint-propagation.js.map +1 -0
  85. package/dist/analysis/unresolved.d.ts +14 -0
  86. package/dist/analysis/unresolved.js +202 -0
  87. package/dist/analysis/unresolved.js.map +1 -0
  88. package/dist/analyzer.d.ts +43 -0
  89. package/dist/analyzer.js +1010 -0
  90. package/dist/analyzer.js.map +1 -0
  91. package/dist/browser/circle-ir.js +16576 -0
  92. package/dist/browser.d.ts +38 -0
  93. package/dist/browser.js +38 -0
  94. package/dist/browser.js.map +1 -0
  95. package/dist/core/circle-ir-core.cjs +13626 -0
  96. package/dist/core/circle-ir-core.d.ts +59 -0
  97. package/dist/core/circle-ir-core.js +13591 -0
  98. package/dist/core/extractors/calls.d.ts +13 -0
  99. package/dist/core/extractors/calls.js +1429 -0
  100. package/dist/core/extractors/calls.js.map +1 -0
  101. package/dist/core/extractors/cfg.d.ts +9 -0
  102. package/dist/core/extractors/cfg.js +519 -0
  103. package/dist/core/extractors/cfg.js.map +1 -0
  104. package/dist/core/extractors/dfg.d.ts +12 -0
  105. package/dist/core/extractors/dfg.js +1081 -0
  106. package/dist/core/extractors/dfg.js.map +1 -0
  107. package/dist/core/extractors/exports.d.ts +14 -0
  108. package/dist/core/extractors/exports.js +80 -0
  109. package/dist/core/extractors/exports.js.map +1 -0
  110. package/dist/core/extractors/imports.d.ts +9 -0
  111. package/dist/core/extractors/imports.js +739 -0
  112. package/dist/core/extractors/imports.js.map +1 -0
  113. package/dist/core/extractors/index.d.ts +10 -0
  114. package/dist/core/extractors/index.js +11 -0
  115. package/dist/core/extractors/index.js.map +1 -0
  116. package/dist/core/extractors/meta.d.ts +10 -0
  117. package/dist/core/extractors/meta.js +109 -0
  118. package/dist/core/extractors/meta.js.map +1 -0
  119. package/dist/core/extractors/types.d.ts +10 -0
  120. package/dist/core/extractors/types.js +1479 -0
  121. package/dist/core/extractors/types.js.map +1 -0
  122. package/dist/core/index.d.ts +5 -0
  123. package/dist/core/index.js +8 -0
  124. package/dist/core/index.js.map +1 -0
  125. package/dist/core/parser.d.ts +84 -0
  126. package/dist/core/parser.js +250 -0
  127. package/dist/core/parser.js.map +1 -0
  128. package/dist/core-lib.d.ts +59 -0
  129. package/dist/core-lib.js +62 -0
  130. package/dist/core-lib.js.map +1 -0
  131. package/dist/index.d.ts +15 -0
  132. package/dist/index.js +20 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/languages/index.d.ts +11 -0
  135. package/dist/languages/index.js +14 -0
  136. package/dist/languages/index.js.map +1 -0
  137. package/dist/languages/plugins/base.d.ts +44 -0
  138. package/dist/languages/plugins/base.js +82 -0
  139. package/dist/languages/plugins/base.js.map +1 -0
  140. package/dist/languages/plugins/index.d.ts +14 -0
  141. package/dist/languages/plugins/index.js +25 -0
  142. package/dist/languages/plugins/index.js.map +1 -0
  143. package/dist/languages/plugins/java.d.ts +49 -0
  144. package/dist/languages/plugins/java.js +402 -0
  145. package/dist/languages/plugins/java.js.map +1 -0
  146. package/dist/languages/plugins/javascript.d.ts +48 -0
  147. package/dist/languages/plugins/javascript.js +445 -0
  148. package/dist/languages/plugins/javascript.js.map +1 -0
  149. package/dist/languages/plugins/python.d.ts +47 -0
  150. package/dist/languages/plugins/python.js +480 -0
  151. package/dist/languages/plugins/python.js.map +1 -0
  152. package/dist/languages/plugins/rust.d.ts +47 -0
  153. package/dist/languages/plugins/rust.js +405 -0
  154. package/dist/languages/plugins/rust.js.map +1 -0
  155. package/dist/languages/registry.d.ts +30 -0
  156. package/dist/languages/registry.js +80 -0
  157. package/dist/languages/registry.js.map +1 -0
  158. package/dist/languages/types.d.ts +184 -0
  159. package/dist/languages/types.js +8 -0
  160. package/dist/languages/types.js.map +1 -0
  161. package/dist/resolution/cross-file.d.ts +146 -0
  162. package/dist/resolution/cross-file.js +439 -0
  163. package/dist/resolution/cross-file.js.map +1 -0
  164. package/dist/resolution/index.d.ts +12 -0
  165. package/dist/resolution/index.js +10 -0
  166. package/dist/resolution/index.js.map +1 -0
  167. package/dist/resolution/symbol-table.d.ts +136 -0
  168. package/dist/resolution/symbol-table.js +336 -0
  169. package/dist/resolution/symbol-table.js.map +1 -0
  170. package/dist/resolution/type-hierarchy.d.ts +124 -0
  171. package/dist/resolution/type-hierarchy.js +515 -0
  172. package/dist/resolution/type-hierarchy.js.map +1 -0
  173. package/dist/types/config.d.ts +45 -0
  174. package/dist/types/config.js +5 -0
  175. package/dist/types/config.js.map +1 -0
  176. package/dist/types/index.d.ts +392 -0
  177. package/dist/types/index.js +7 -0
  178. package/dist/types/index.js.map +1 -0
  179. package/dist/utils/logger.d.ts +85 -0
  180. package/dist/utils/logger.js +198 -0
  181. package/dist/utils/logger.js.map +1 -0
  182. package/dist/wasm/tree-sitter-java.wasm +0 -0
  183. package/dist/wasm/tree-sitter-javascript.wasm +0 -0
  184. package/dist/wasm/tree-sitter-python.wasm +0 -0
  185. package/dist/wasm/tree-sitter-rust.wasm +0 -0
  186. package/dist/wasm/web-tree-sitter.wasm +0 -0
  187. package/docs/SPEC.md +1021 -0
  188. package/examples/browser-example.html +610 -0
  189. package/examples/node-example.ts +215 -0
  190. package/package.json +107 -0
  191. package/wasm/tree-sitter-java.wasm +0 -0
  192. package/wasm/tree-sitter-javascript.wasm +0 -0
  193. package/wasm/tree-sitter-python.wasm +0 -0
  194. package/wasm/tree-sitter-rust.wasm +0 -0
@@ -0,0 +1,90 @@
1
+ {
2
+ "sources": [
3
+ {
4
+ "method": "getString",
5
+ "class": "ResultSet",
6
+ "type": "database",
7
+ "severity": "medium",
8
+ "return_tainted": true,
9
+ "note": "String column value - could be attacker-controlled if stored from user input"
10
+ },
11
+ {
12
+ "method": "getObject",
13
+ "class": "ResultSet",
14
+ "type": "database",
15
+ "severity": "medium",
16
+ "return_tainted": true,
17
+ "note": "Object column value"
18
+ },
19
+ {
20
+ "method": "getBytes",
21
+ "class": "ResultSet",
22
+ "type": "database",
23
+ "severity": "medium",
24
+ "return_tainted": true,
25
+ "note": "Byte array column value"
26
+ },
27
+ {
28
+ "method": "getClob",
29
+ "class": "ResultSet",
30
+ "type": "database",
31
+ "severity": "medium",
32
+ "return_tainted": true,
33
+ "note": "CLOB column value"
34
+ },
35
+ {
36
+ "method": "getBlob",
37
+ "class": "ResultSet",
38
+ "type": "database",
39
+ "severity": "medium",
40
+ "return_tainted": true,
41
+ "note": "BLOB column value"
42
+ },
43
+ {
44
+ "annotation": "@Column",
45
+ "type": "database",
46
+ "severity": "medium",
47
+ "field_tainted": true,
48
+ "note": "JPA entity field - may contain attacker data"
49
+ },
50
+ {
51
+ "annotation": "@Entity",
52
+ "type": "database",
53
+ "severity": "low",
54
+ "class_fields_tainted": true,
55
+ "note": "JPA entity - all fields are potentially tainted"
56
+ },
57
+ {
58
+ "method": "findBy.*",
59
+ "class": ".*Repository",
60
+ "type": "database",
61
+ "severity": "medium",
62
+ "return_tainted": true,
63
+ "note": "Spring Data finder method - returns entities from DB"
64
+ },
65
+ {
66
+ "method": "findAll",
67
+ "class": ".*Repository",
68
+ "type": "database",
69
+ "severity": "medium",
70
+ "return_tainted": true,
71
+ "note": "Returns all entities - could contain attacker data"
72
+ },
73
+ {
74
+ "method": "getString",
75
+ "class": "Document",
76
+ "type": "database",
77
+ "severity": "medium",
78
+ "return_tainted": true,
79
+ "note": "MongoDB document field"
80
+ },
81
+ {
82
+ "method": "get",
83
+ "class": "Document",
84
+ "type": "database",
85
+ "severity": "medium",
86
+ "return_tainted": true,
87
+ "note": "MongoDB document field (generic)"
88
+ }
89
+ ]
90
+ }
@@ -0,0 +1,94 @@
1
+ {
2
+ "sources": [
3
+ {
4
+ "method": "getProperty",
5
+ "class": "System",
6
+ "type": "system_property",
7
+ "severity": "medium",
8
+ "return_tainted": true,
9
+ "note": "System property - could be set by attacker in some contexts"
10
+ },
11
+ {
12
+ "method": "getProperties",
13
+ "class": "System",
14
+ "type": "system_property",
15
+ "severity": "medium",
16
+ "return_tainted": true,
17
+ "note": "All system properties"
18
+ },
19
+ {
20
+ "method": "getenv",
21
+ "class": "System",
22
+ "type": "env_variable",
23
+ "severity": "medium",
24
+ "return_tainted": true,
25
+ "note": "Environment variable - could be attacker-controlled"
26
+ },
27
+ {
28
+ "method": "lookup",
29
+ "class": "InitialContext",
30
+ "type": "jndi",
31
+ "severity": "critical",
32
+ "arg_positions": [
33
+ 0
34
+ ],
35
+ "note": "JNDI lookup - argument is taint source if from user input"
36
+ },
37
+ {
38
+ "method": "lookup",
39
+ "class": "Context",
40
+ "type": "jndi",
41
+ "severity": "critical",
42
+ "arg_positions": [
43
+ 0
44
+ ],
45
+ "note": "JNDI context lookup"
46
+ },
47
+ {
48
+ "method": "getProperty",
49
+ "class": "Environment",
50
+ "type": "spring_property",
51
+ "severity": "low",
52
+ "return_tainted": true,
53
+ "note": "Spring environment property - usually safe but can be external"
54
+ },
55
+ {
56
+ "method": "getRequiredProperty",
57
+ "class": "Environment",
58
+ "type": "spring_property",
59
+ "severity": "low",
60
+ "return_tainted": true,
61
+ "note": "Spring required property"
62
+ },
63
+ {
64
+ "annotation": "@Value",
65
+ "type": "spring_property",
66
+ "severity": "low",
67
+ "param_tainted": true,
68
+ "note": "Spring @Value injection - from properties file"
69
+ },
70
+ {
71
+ "annotation": "@ConfigurationProperties",
72
+ "type": "spring_property",
73
+ "severity": "low",
74
+ "class_fields_tainted": true,
75
+ "note": "Spring configuration properties binding"
76
+ },
77
+ {
78
+ "method": "getProperty",
79
+ "class": "PropertyDescriptor",
80
+ "type": "reflection",
81
+ "severity": "low",
82
+ "return_tainted": true,
83
+ "note": "Bean property value via reflection"
84
+ },
85
+ {
86
+ "method": "invoke",
87
+ "class": "Method",
88
+ "type": "reflection",
89
+ "severity": "medium",
90
+ "return_tainted": true,
91
+ "note": "Method invocation result via reflection"
92
+ }
93
+ ]
94
+ }
@@ -0,0 +1,197 @@
1
+ {
2
+ "sources": [
3
+ {
4
+ "method": "params",
5
+ "class": "Request",
6
+ "type": "http_param",
7
+ "severity": "high",
8
+ "return_tainted": true,
9
+ "note": "Express route parameters (req.params)"
10
+ },
11
+ {
12
+ "method": "query",
13
+ "class": "Request",
14
+ "type": "http_param",
15
+ "severity": "high",
16
+ "return_tainted": true,
17
+ "note": "Express query string parameters (req.query)"
18
+ },
19
+ {
20
+ "method": "body",
21
+ "class": "Request",
22
+ "type": "http_body",
23
+ "severity": "high",
24
+ "return_tainted": true,
25
+ "note": "Express request body (req.body)"
26
+ },
27
+ {
28
+ "method": "headers",
29
+ "class": "Request",
30
+ "type": "http_header",
31
+ "severity": "high",
32
+ "return_tainted": true,
33
+ "note": "Express request headers (req.headers)"
34
+ },
35
+ {
36
+ "method": "cookies",
37
+ "class": "Request",
38
+ "type": "http_cookie",
39
+ "severity": "high",
40
+ "return_tainted": true,
41
+ "note": "Express cookies (req.cookies)"
42
+ },
43
+ {
44
+ "method": "url",
45
+ "class": "Request",
46
+ "type": "http_path",
47
+ "severity": "high",
48
+ "return_tainted": true,
49
+ "note": "Express request URL (req.url)"
50
+ },
51
+ {
52
+ "method": "path",
53
+ "class": "Request",
54
+ "type": "http_path",
55
+ "severity": "high",
56
+ "return_tainted": true,
57
+ "note": "Express request path (req.path)"
58
+ },
59
+ {
60
+ "method": "originalUrl",
61
+ "class": "Request",
62
+ "type": "http_path",
63
+ "severity": "high",
64
+ "return_tainted": true,
65
+ "note": "Express original URL (req.originalUrl)"
66
+ },
67
+ {
68
+ "method": "get",
69
+ "class": "Request",
70
+ "type": "http_header",
71
+ "severity": "high",
72
+ "return_tainted": true,
73
+ "note": "Express header getter (req.get('header'))"
74
+ },
75
+ {
76
+ "method": "header",
77
+ "class": "Request",
78
+ "type": "http_header",
79
+ "severity": "high",
80
+ "return_tainted": true,
81
+ "note": "Express header getter (req.header('name'))"
82
+ },
83
+ {
84
+ "method": "param",
85
+ "class": "Request",
86
+ "type": "http_param",
87
+ "severity": "high",
88
+ "return_tainted": true,
89
+ "note": "Express param getter (req.param('name'))"
90
+ },
91
+ {
92
+ "method": "file",
93
+ "class": "Request",
94
+ "type": "file_input",
95
+ "severity": "high",
96
+ "return_tainted": true,
97
+ "note": "Express file upload (req.file with multer)"
98
+ },
99
+ {
100
+ "method": "files",
101
+ "class": "Request",
102
+ "type": "file_input",
103
+ "severity": "high",
104
+ "return_tainted": true,
105
+ "note": "Express multiple file uploads (req.files)"
106
+ },
107
+ {
108
+ "method": "ip",
109
+ "class": "Request",
110
+ "type": "http_header",
111
+ "severity": "medium",
112
+ "return_tainted": true,
113
+ "note": "Express client IP (can be spoofed via X-Forwarded-For)"
114
+ },
115
+ {
116
+ "method": "hostname",
117
+ "class": "Request",
118
+ "type": "http_header",
119
+ "severity": "medium",
120
+ "return_tainted": true,
121
+ "note": "Express hostname from Host header"
122
+ },
123
+ {
124
+ "method": "subdomains",
125
+ "class": "Request",
126
+ "type": "http_header",
127
+ "severity": "medium",
128
+ "return_tainted": true,
129
+ "note": "Express subdomains from Host header"
130
+ },
131
+ {
132
+ "method": "protocol",
133
+ "class": "Request",
134
+ "type": "http_header",
135
+ "severity": "low",
136
+ "return_tainted": true,
137
+ "note": "Express protocol (can be influenced by X-Forwarded-Proto)"
138
+ },
139
+ {
140
+ "method": "env",
141
+ "class": "process",
142
+ "type": "env_input",
143
+ "severity": "medium",
144
+ "return_tainted": true,
145
+ "note": "Environment variables (process.env) - may contain sensitive data"
146
+ },
147
+ {
148
+ "method": "argv",
149
+ "class": "process",
150
+ "type": "io_input",
151
+ "severity": "medium",
152
+ "return_tainted": true,
153
+ "note": "Command line arguments (process.argv)"
154
+ },
155
+ {
156
+ "method": "stdin",
157
+ "class": "process",
158
+ "type": "io_input",
159
+ "severity": "high",
160
+ "return_tainted": true,
161
+ "note": "Standard input stream"
162
+ },
163
+ {
164
+ "method": "on",
165
+ "class": "WebSocket",
166
+ "type": "network_input",
167
+ "severity": "high",
168
+ "return_tainted": true,
169
+ "arg_positions": [1],
170
+ "note": "WebSocket message handler - data from client"
171
+ },
172
+ {
173
+ "method": "message",
174
+ "class": "WebSocket",
175
+ "type": "network_input",
176
+ "severity": "high",
177
+ "return_tainted": true,
178
+ "note": "WebSocket message event"
179
+ },
180
+ {
181
+ "method": "data",
182
+ "class": "Socket",
183
+ "type": "network_input",
184
+ "severity": "high",
185
+ "return_tainted": true,
186
+ "note": "Socket data event"
187
+ },
188
+ {
189
+ "method": "signedCookies",
190
+ "class": "Request",
191
+ "type": "http_cookie",
192
+ "severity": "medium",
193
+ "return_tainted": true,
194
+ "note": "Express signed cookies (req.signedCookies)"
195
+ }
196
+ ]
197
+ }
@@ -0,0 +1,164 @@
1
+ {
2
+ "sources": [
3
+ {
4
+ "method": "readLine",
5
+ "class": "BufferedReader",
6
+ "type": "file_input",
7
+ "severity": "medium",
8
+ "return_tainted": true,
9
+ "note": "Single line from file - could be attacker-controlled"
10
+ },
11
+ {
12
+ "method": "readAllLines",
13
+ "class": "Files",
14
+ "type": "file_input",
15
+ "severity": "medium",
16
+ "return_tainted": true,
17
+ "note": "All lines from file as List<String>"
18
+ },
19
+ {
20
+ "method": "readAllBytes",
21
+ "class": "Files",
22
+ "type": "file_input",
23
+ "severity": "medium",
24
+ "return_tainted": true,
25
+ "note": "All bytes from file"
26
+ },
27
+ {
28
+ "method": "readString",
29
+ "class": "Files",
30
+ "type": "file_input",
31
+ "severity": "medium",
32
+ "return_tainted": true,
33
+ "note": "File content as String (Java 11+)"
34
+ },
35
+ {
36
+ "method": "lines",
37
+ "class": "Files",
38
+ "type": "file_input",
39
+ "severity": "medium",
40
+ "return_tainted": true,
41
+ "note": "Stream of lines from file"
42
+ },
43
+ {
44
+ "method": "getOriginalFilename",
45
+ "class": "MultipartFile",
46
+ "type": "file_upload",
47
+ "severity": "high",
48
+ "return_tainted": true,
49
+ "note": "User-provided filename - path traversal risk"
50
+ },
51
+ {
52
+ "method": "getName",
53
+ "class": "MultipartFile",
54
+ "type": "file_upload",
55
+ "severity": "high",
56
+ "return_tainted": true,
57
+ "note": "Form field name for uploaded file"
58
+ },
59
+ {
60
+ "method": "getBytes",
61
+ "class": "MultipartFile",
62
+ "type": "file_upload",
63
+ "severity": "high",
64
+ "return_tainted": true,
65
+ "note": "File content as byte array"
66
+ },
67
+ {
68
+ "method": "getInputStream",
69
+ "class": "MultipartFile",
70
+ "type": "file_upload",
71
+ "severity": "high",
72
+ "return_tainted": true,
73
+ "note": "File content as InputStream"
74
+ },
75
+ {
76
+ "method": "getSubmittedFileName",
77
+ "class": "Part",
78
+ "type": "file_upload",
79
+ "severity": "high",
80
+ "return_tainted": true,
81
+ "note": "User-provided filename from multipart upload (Servlet API)"
82
+ },
83
+ {
84
+ "method": "getFileName",
85
+ "class": "Part",
86
+ "type": "file_upload",
87
+ "severity": "high",
88
+ "return_tainted": true,
89
+ "note": "User-provided filename from MIME part (JavaMail API)"
90
+ },
91
+ {
92
+ "method": "getFileName",
93
+ "class": "MimePart",
94
+ "type": "file_upload",
95
+ "severity": "high",
96
+ "return_tainted": true,
97
+ "note": "User-provided filename from MIME part (JavaMail API)"
98
+ },
99
+ {
100
+ "method": "getFileName",
101
+ "class": "BodyPart",
102
+ "type": "file_upload",
103
+ "severity": "high",
104
+ "return_tainted": true,
105
+ "note": "User-provided filename from email attachment (JavaMail API)"
106
+ },
107
+ {
108
+ "method": "getFileName",
109
+ "class": "MimeBodyPart",
110
+ "type": "file_upload",
111
+ "severity": "high",
112
+ "return_tainted": true,
113
+ "note": "User-provided filename from email attachment (JavaMail API)"
114
+ },
115
+ {
116
+ "method": "getInputStream",
117
+ "class": "Part",
118
+ "type": "file_upload",
119
+ "severity": "high",
120
+ "return_tainted": true,
121
+ "note": "Uploaded file content"
122
+ },
123
+ {
124
+ "method": "getName",
125
+ "class": "FileItem",
126
+ "type": "file_upload",
127
+ "severity": "high",
128
+ "return_tainted": true,
129
+ "note": "User-provided filename"
130
+ },
131
+ {
132
+ "method": "getString",
133
+ "class": "FileItem",
134
+ "type": "file_upload",
135
+ "severity": "high",
136
+ "return_tainted": true,
137
+ "note": "File content as String"
138
+ },
139
+ {
140
+ "method": "getInputStream",
141
+ "class": "FileItem",
142
+ "type": "file_upload",
143
+ "severity": "high",
144
+ "return_tainted": true,
145
+ "note": "File content as InputStream"
146
+ },
147
+ {
148
+ "method": "getProperty",
149
+ "class": "Properties",
150
+ "type": "config_file",
151
+ "severity": "low",
152
+ "return_tainted": true,
153
+ "note": "Property value - if loaded from external file, could be tainted"
154
+ },
155
+ {
156
+ "method": "load",
157
+ "class": "Properties",
158
+ "type": "config_file",
159
+ "severity": "low",
160
+ "return_tainted": true,
161
+ "note": "Loads properties from InputStream"
162
+ }
163
+ ]
164
+ }