acidtest 0.7.0 → 1.0.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.
- package/.github/workflows/acidtest-pr-comment.yml +219 -0
- package/README.md +155 -30
- package/dist/analysis/dataflow-graph.d.ts +19 -0
- package/dist/analysis/dataflow-graph.d.ts.map +1 -0
- package/dist/analysis/dataflow-graph.js +365 -0
- package/dist/analysis/dataflow-graph.js.map +1 -0
- package/dist/analysis/dataflow-types.d.ts +86 -0
- package/dist/analysis/dataflow-types.d.ts.map +1 -0
- package/dist/analysis/dataflow-types.js +8 -0
- package/dist/analysis/dataflow-types.js.map +1 -0
- package/dist/analysis/dataflow.test.d.ts +7 -0
- package/dist/analysis/dataflow.test.d.ts.map +1 -0
- package/dist/analysis/dataflow.test.js +257 -0
- package/dist/analysis/dataflow.test.js.map +1 -0
- package/dist/analysis/taint-propagation.d.ts +30 -0
- package/dist/analysis/taint-propagation.d.ts.map +1 -0
- package/dist/analysis/taint-propagation.js +207 -0
- package/dist/analysis/taint-propagation.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/layers/code.d.ts +1 -1
- package/dist/layers/code.d.ts.map +1 -1
- package/dist/layers/code.js +282 -3
- package/dist/layers/code.js.map +1 -1
- package/dist/layers/code.test.js +196 -0
- package/dist/layers/code.test.js.map +1 -1
- package/dist/layers/crossref.d.ts.map +1 -1
- package/dist/layers/crossref.js +6 -3
- package/dist/layers/crossref.js.map +1 -1
- package/dist/layers/dataflow.d.ts +29 -0
- package/dist/layers/dataflow.d.ts.map +1 -0
- package/dist/layers/dataflow.js +217 -0
- package/dist/layers/dataflow.js.map +1 -0
- package/dist/layers/permissions.d.ts.map +1 -1
- package/dist/layers/permissions.js +2 -1
- package/dist/layers/permissions.js.map +1 -1
- package/dist/mcp-server.js +1 -1
- package/dist/parsers/parser-interface.d.ts +31 -0
- package/dist/parsers/parser-interface.d.ts.map +1 -0
- package/dist/parsers/parser-interface.js +6 -0
- package/dist/parsers/parser-interface.js.map +1 -0
- package/dist/parsers/parsers.test.d.ts +5 -0
- package/dist/parsers/parsers.test.d.ts.map +1 -0
- package/dist/parsers/parsers.test.js +111 -0
- package/dist/parsers/parsers.test.js.map +1 -0
- package/dist/parsers/python-parser.d.ts +18 -0
- package/dist/parsers/python-parser.d.ts.map +1 -0
- package/dist/parsers/python-parser.js +120 -0
- package/dist/parsers/python-parser.js.map +1 -0
- package/dist/parsers/typescript-parser.d.ts +16 -0
- package/dist/parsers/typescript-parser.d.ts.map +1 -0
- package/dist/parsers/typescript-parser.js +112 -0
- package/dist/parsers/typescript-parser.js.map +1 -0
- package/dist/patterns/dangerous-calls-python.json +220 -0
- package/dist/patterns/dangerous-imports-python.json +256 -0
- package/dist/patterns/insecure-crypto.json +163 -0
- package/dist/patterns/prototype-pollution.json +72 -0
- package/dist/patterns/python-deserialization.json +94 -0
- package/dist/patterns/regex-dos.json +50 -0
- package/dist/patterns/sql-injection.json +91 -0
- package/dist/patterns/xss-injection.json +115 -0
- package/dist/scanner.d.ts +1 -1
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +51 -4
- package/dist/scanner.js.map +1 -1
- package/dist/schemas/pattern.schema.json +139 -0
- package/dist/test-corpus/validate-corpus.d.ts +7 -0
- package/dist/test-corpus/validate-corpus.d.ts.map +1 -0
- package/dist/test-corpus/validate-corpus.js +341 -0
- package/dist/test-corpus/validate-corpus.js.map +1 -0
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/validation/pattern-validator.d.ts +34 -0
- package/dist/validation/pattern-validator.d.ts.map +1 -0
- package/dist/validation/pattern-validator.js +168 -0
- package/dist/validation/pattern-validator.js.map +1 -0
- package/dist/validation/pattern-validator.test.d.ts +5 -0
- package/dist/validation/pattern-validator.test.d.ts.map +1 -0
- package/dist/validation/pattern-validator.test.js +222 -0
- package/dist/validation/pattern-validator.test.js.map +1 -0
- package/dist/validation/validate-patterns.d.ts +6 -0
- package/dist/validation/validate-patterns.d.ts.map +1 -0
- package/dist/validation/validate-patterns.js +55 -0
- package/dist/validation/validate-patterns.js.map +1 -0
- package/package.json +11 -4
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dataflow Graph Construction
|
|
3
|
+
*
|
|
4
|
+
* Builds a dataflow graph from TypeScript AST by tracking:
|
|
5
|
+
* - Variable declarations and assignments
|
|
6
|
+
* - Property access (read/write)
|
|
7
|
+
* - Function calls and arguments
|
|
8
|
+
* - Template literals
|
|
9
|
+
* - Object construction
|
|
10
|
+
*
|
|
11
|
+
* Phase 3.1: Dataflow Implementation
|
|
12
|
+
*/
|
|
13
|
+
import * as ts from 'typescript';
|
|
14
|
+
/**
|
|
15
|
+
* Build dataflow graph from TypeScript source code
|
|
16
|
+
*/
|
|
17
|
+
export function buildDataFlowGraph(sourceFile) {
|
|
18
|
+
const builder = new DataFlowGraphBuilder();
|
|
19
|
+
builder.visitNode(sourceFile);
|
|
20
|
+
return builder.getGraph();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Internal graph builder with visitor pattern
|
|
24
|
+
*/
|
|
25
|
+
class DataFlowGraphBuilder {
|
|
26
|
+
nodes = [];
|
|
27
|
+
edges = [];
|
|
28
|
+
nodeIdCounter = 0;
|
|
29
|
+
variableMap = new Map(); // variable name → node ID
|
|
30
|
+
sourceNodeIds = [];
|
|
31
|
+
sinkNodeIds = [];
|
|
32
|
+
/**
|
|
33
|
+
* Get the constructed graph
|
|
34
|
+
*/
|
|
35
|
+
getGraph() {
|
|
36
|
+
return {
|
|
37
|
+
nodes: this.nodes,
|
|
38
|
+
edges: this.edges,
|
|
39
|
+
sourceNodeIds: this.sourceNodeIds,
|
|
40
|
+
sinkNodeIds: this.sinkNodeIds,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create a unique node ID
|
|
45
|
+
*/
|
|
46
|
+
createNodeId(prefix, line, column) {
|
|
47
|
+
return `${prefix}_${line}_${column}_${this.nodeIdCounter++}`;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Add a node to the graph
|
|
51
|
+
*/
|
|
52
|
+
addNode(type, identifier, line, column, metadata) {
|
|
53
|
+
const id = this.createNodeId(type, line, column);
|
|
54
|
+
this.nodes.push({
|
|
55
|
+
id,
|
|
56
|
+
type,
|
|
57
|
+
identifier,
|
|
58
|
+
line,
|
|
59
|
+
column,
|
|
60
|
+
metadata,
|
|
61
|
+
});
|
|
62
|
+
return id;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Add an edge to the graph
|
|
66
|
+
*/
|
|
67
|
+
addEdge(from, to, type, label) {
|
|
68
|
+
this.edges.push({ from, to, type, label });
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Visit AST node and build graph
|
|
72
|
+
*/
|
|
73
|
+
visitNode(node) {
|
|
74
|
+
// Variable declarations: const a = b
|
|
75
|
+
if (ts.isVariableDeclaration(node)) {
|
|
76
|
+
this.visitVariableDeclaration(node);
|
|
77
|
+
}
|
|
78
|
+
// Binary expressions: a = b
|
|
79
|
+
if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken) {
|
|
80
|
+
this.visitAssignment(node);
|
|
81
|
+
}
|
|
82
|
+
// Property access: obj.prop
|
|
83
|
+
if (ts.isPropertyAccessExpression(node)) {
|
|
84
|
+
this.visitPropertyAccess(node);
|
|
85
|
+
}
|
|
86
|
+
// Call expressions: func(arg)
|
|
87
|
+
if (ts.isCallExpression(node)) {
|
|
88
|
+
this.visitCallExpression(node);
|
|
89
|
+
}
|
|
90
|
+
// Template literals: `${expr}`
|
|
91
|
+
if (ts.isTemplateExpression(node)) {
|
|
92
|
+
this.visitTemplateExpression(node);
|
|
93
|
+
}
|
|
94
|
+
// Object literals: { key: value }
|
|
95
|
+
if (ts.isObjectLiteralExpression(node)) {
|
|
96
|
+
this.visitObjectLiteral(node);
|
|
97
|
+
}
|
|
98
|
+
// Recurse into children
|
|
99
|
+
ts.forEachChild(node, (child) => this.visitNode(child));
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Handle variable declaration: const a = b
|
|
103
|
+
*/
|
|
104
|
+
visitVariableDeclaration(node) {
|
|
105
|
+
const varName = node.name.getText();
|
|
106
|
+
const line = this.getLine(node);
|
|
107
|
+
const column = this.getColumn(node);
|
|
108
|
+
// Create node for the variable
|
|
109
|
+
const varNodeId = this.addNode('variable', varName, line, column);
|
|
110
|
+
this.variableMap.set(varName, varNodeId);
|
|
111
|
+
// If initializer exists, create dataflow edge
|
|
112
|
+
if (node.initializer) {
|
|
113
|
+
this.handleInitializer(varNodeId, node.initializer);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Handle assignment: a = b
|
|
118
|
+
*/
|
|
119
|
+
visitAssignment(node) {
|
|
120
|
+
const left = node.left;
|
|
121
|
+
const right = node.right;
|
|
122
|
+
// Get or create node for left side
|
|
123
|
+
let leftNodeId;
|
|
124
|
+
if (ts.isIdentifier(left)) {
|
|
125
|
+
const varName = left.getText();
|
|
126
|
+
leftNodeId = this.variableMap.get(varName);
|
|
127
|
+
if (!leftNodeId) {
|
|
128
|
+
leftNodeId = this.addNode('variable', varName, this.getLine(left), this.getColumn(left));
|
|
129
|
+
this.variableMap.set(varName, leftNodeId);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else if (ts.isPropertyAccessExpression(left)) {
|
|
133
|
+
// Handle property assignment: obj.prop = value
|
|
134
|
+
leftNodeId = this.addNode('property', left.getText(), this.getLine(left), this.getColumn(left));
|
|
135
|
+
}
|
|
136
|
+
if (leftNodeId) {
|
|
137
|
+
this.handleInitializer(leftNodeId, right);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Handle property access: obj.prop
|
|
142
|
+
*/
|
|
143
|
+
visitPropertyAccess(node) {
|
|
144
|
+
const propName = node.getText();
|
|
145
|
+
const line = this.getLine(node);
|
|
146
|
+
const column = this.getColumn(node);
|
|
147
|
+
// Check for process.env (taint source)
|
|
148
|
+
if (propName.startsWith('process.env.') || propName.includes('process.env[')) {
|
|
149
|
+
const sourceNodeId = this.addNode('source', propName, line, column, {
|
|
150
|
+
sourceType: 'env-var',
|
|
151
|
+
envVarName: propName.replace(/^process\.env\./, '').replace(/process\.env\[['"](.+)['"]\]/, '$1'),
|
|
152
|
+
});
|
|
153
|
+
this.sourceNodeIds.push(sourceNodeId);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Handle call expression: func(arg1, arg2)
|
|
158
|
+
*/
|
|
159
|
+
visitCallExpression(node) {
|
|
160
|
+
const funcName = this.getFunctionName(node);
|
|
161
|
+
const line = this.getLine(node);
|
|
162
|
+
const column = this.getColumn(node);
|
|
163
|
+
// Check if this is a taint sink
|
|
164
|
+
if (this.isSinkFunction(funcName)) {
|
|
165
|
+
const sinkNodeId = this.addNode('sink', funcName, line, column, {
|
|
166
|
+
sinkType: this.getSinkType(funcName),
|
|
167
|
+
functionName: funcName,
|
|
168
|
+
});
|
|
169
|
+
this.sinkNodeIds.push(sinkNodeId);
|
|
170
|
+
// Create edges from arguments to sink
|
|
171
|
+
node.arguments.forEach((arg, index) => {
|
|
172
|
+
const argNodeId = this.getOrCreateNodeForExpression(arg);
|
|
173
|
+
if (argNodeId) {
|
|
174
|
+
this.addEdge(argNodeId, sinkNodeId, 'function-call', `arg${index}`);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Handle template expression: `${expr}`
|
|
181
|
+
*/
|
|
182
|
+
visitTemplateExpression(node) {
|
|
183
|
+
const line = this.getLine(node);
|
|
184
|
+
const column = this.getColumn(node);
|
|
185
|
+
const templateNodeId = this.addNode('operation', 'template-literal', line, column);
|
|
186
|
+
// Create edges from each template span expression
|
|
187
|
+
node.templateSpans.forEach((span) => {
|
|
188
|
+
const exprNodeId = this.getOrCreateNodeForExpression(span.expression);
|
|
189
|
+
if (exprNodeId) {
|
|
190
|
+
this.addEdge(exprNodeId, templateNodeId, 'template-literal');
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Handle object literal: { key: value }
|
|
196
|
+
* Note: We don't create the object node here, as it's created in getOrCreateNodeForExpression
|
|
197
|
+
* This method just ensures we visit the properties
|
|
198
|
+
*/
|
|
199
|
+
visitObjectLiteral(node) {
|
|
200
|
+
// Properties will be visited through recursive forEachChild
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Handle initializer expression (right side of assignment)
|
|
204
|
+
*/
|
|
205
|
+
handleInitializer(targetNodeId, initializer) {
|
|
206
|
+
const sourceNodeId = this.getOrCreateNodeForExpression(initializer);
|
|
207
|
+
if (sourceNodeId) {
|
|
208
|
+
this.addEdge(sourceNodeId, targetNodeId, 'assignment');
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Get or create node for an expression
|
|
213
|
+
*/
|
|
214
|
+
getOrCreateNodeForExpression(expr) {
|
|
215
|
+
// Identifier: variable reference
|
|
216
|
+
if (ts.isIdentifier(expr)) {
|
|
217
|
+
const varName = expr.getText();
|
|
218
|
+
let nodeId = this.variableMap.get(varName);
|
|
219
|
+
if (!nodeId) {
|
|
220
|
+
nodeId = this.addNode('variable', varName, this.getLine(expr), this.getColumn(expr));
|
|
221
|
+
this.variableMap.set(varName, nodeId);
|
|
222
|
+
}
|
|
223
|
+
return nodeId;
|
|
224
|
+
}
|
|
225
|
+
// Property access: process.env.X, obj.prop
|
|
226
|
+
if (ts.isPropertyAccessExpression(expr)) {
|
|
227
|
+
const propName = expr.getText();
|
|
228
|
+
const line = this.getLine(expr);
|
|
229
|
+
const column = this.getColumn(expr);
|
|
230
|
+
// Check for process.env (taint source)
|
|
231
|
+
if (propName.startsWith('process.env.') || propName.includes('process.env[')) {
|
|
232
|
+
const sourceNodeId = this.addNode('source', propName, line, column, {
|
|
233
|
+
sourceType: 'env-var',
|
|
234
|
+
envVarName: propName.replace(/^process\.env\./, '').replace(/process\.env\[['"](.+)['"]\]/, '$1'),
|
|
235
|
+
});
|
|
236
|
+
this.sourceNodeIds.push(sourceNodeId);
|
|
237
|
+
return sourceNodeId;
|
|
238
|
+
}
|
|
239
|
+
// Property read: obj.prop (create edge from obj to prop)
|
|
240
|
+
const propNodeId = this.addNode('property', propName, line, column);
|
|
241
|
+
// Get the object being accessed
|
|
242
|
+
const objExpr = expr.expression;
|
|
243
|
+
if (ts.isIdentifier(objExpr)) {
|
|
244
|
+
const objName = objExpr.getText();
|
|
245
|
+
const objNodeId = this.variableMap.get(objName);
|
|
246
|
+
if (objNodeId) {
|
|
247
|
+
this.addEdge(objNodeId, propNodeId, 'property-read', expr.name.getText());
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return propNodeId;
|
|
251
|
+
}
|
|
252
|
+
// Template literal
|
|
253
|
+
if (ts.isTemplateExpression(expr) || ts.isNoSubstitutionTemplateLiteral(expr)) {
|
|
254
|
+
const line = this.getLine(expr);
|
|
255
|
+
const column = this.getColumn(expr);
|
|
256
|
+
return this.addNode('operation', 'template-literal', line, column);
|
|
257
|
+
}
|
|
258
|
+
// Object literal
|
|
259
|
+
if (ts.isObjectLiteralExpression(expr)) {
|
|
260
|
+
const line = this.getLine(expr);
|
|
261
|
+
const column = this.getColumn(expr);
|
|
262
|
+
const objNodeId = this.addNode('operation', 'object-literal', line, column);
|
|
263
|
+
// Create edges from property values to object
|
|
264
|
+
expr.properties.forEach((prop) => {
|
|
265
|
+
if (ts.isPropertyAssignment(prop)) {
|
|
266
|
+
const valueNodeId = this.getOrCreateNodeForExpression(prop.initializer);
|
|
267
|
+
if (valueNodeId) {
|
|
268
|
+
const propName = prop.name.getText();
|
|
269
|
+
this.addEdge(valueNodeId, objNodeId, 'object-construction', propName);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
return objNodeId;
|
|
274
|
+
}
|
|
275
|
+
// Call expression
|
|
276
|
+
if (ts.isCallExpression(expr)) {
|
|
277
|
+
const funcName = this.getFunctionName(expr);
|
|
278
|
+
const line = this.getLine(expr);
|
|
279
|
+
const column = this.getColumn(expr);
|
|
280
|
+
// If it's a source (e.g., fetch response), create source node
|
|
281
|
+
if (funcName === 'fetch' || funcName.includes('.json') || funcName.includes('.text')) {
|
|
282
|
+
const sourceNodeId = this.addNode('source', funcName, line, column, {
|
|
283
|
+
sourceType: 'network-response',
|
|
284
|
+
});
|
|
285
|
+
this.sourceNodeIds.push(sourceNodeId);
|
|
286
|
+
return sourceNodeId;
|
|
287
|
+
}
|
|
288
|
+
return this.addNode('operation', funcName, line, column);
|
|
289
|
+
}
|
|
290
|
+
return undefined;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Check if function is a taint sink
|
|
294
|
+
*/
|
|
295
|
+
isSinkFunction(funcName) {
|
|
296
|
+
const sinks = [
|
|
297
|
+
// Command execution
|
|
298
|
+
'exec', 'execSync', 'spawn', 'spawnSync', 'execFile', 'execFileSync',
|
|
299
|
+
// Code evaluation
|
|
300
|
+
'eval', 'Function',
|
|
301
|
+
// Network (only fetch for body/URL, not all network calls)
|
|
302
|
+
'fetch',
|
|
303
|
+
// File system
|
|
304
|
+
'writeFile', 'writeFileSync', 'appendFile', 'appendFileSync',
|
|
305
|
+
// Dynamic imports
|
|
306
|
+
'require', 'import',
|
|
307
|
+
];
|
|
308
|
+
return sinks.some((sink) => funcName === sink || funcName.endsWith(`.${sink}`));
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Get sink type based on function name
|
|
312
|
+
*/
|
|
313
|
+
getSinkType(funcName) {
|
|
314
|
+
if (funcName.includes('exec') || funcName.includes('spawn')) {
|
|
315
|
+
return 'command-execution';
|
|
316
|
+
}
|
|
317
|
+
if (funcName === 'eval' || funcName === 'Function') {
|
|
318
|
+
return 'code-evaluation';
|
|
319
|
+
}
|
|
320
|
+
if (funcName === 'fetch' || funcName.includes('axios') || funcName.includes('http')) {
|
|
321
|
+
return 'network-request';
|
|
322
|
+
}
|
|
323
|
+
if (funcName.includes('write') || funcName.includes('append')) {
|
|
324
|
+
return 'file-write';
|
|
325
|
+
}
|
|
326
|
+
if (funcName === 'require' || funcName === 'import') {
|
|
327
|
+
return 'dynamic-import';
|
|
328
|
+
}
|
|
329
|
+
return 'unknown';
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Get function name from call expression
|
|
333
|
+
*/
|
|
334
|
+
getFunctionName(node) {
|
|
335
|
+
const expr = node.expression;
|
|
336
|
+
if (ts.isIdentifier(expr)) {
|
|
337
|
+
return expr.getText();
|
|
338
|
+
}
|
|
339
|
+
if (ts.isPropertyAccessExpression(expr)) {
|
|
340
|
+
return expr.name.getText();
|
|
341
|
+
}
|
|
342
|
+
return expr.getText();
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Get line number for node
|
|
346
|
+
*/
|
|
347
|
+
getLine(node) {
|
|
348
|
+
const sourceFile = node.getSourceFile();
|
|
349
|
+
if (!sourceFile)
|
|
350
|
+
return 0;
|
|
351
|
+
const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
|
|
352
|
+
return line + 1; // Convert to 1-indexed
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Get column number for node
|
|
356
|
+
*/
|
|
357
|
+
getColumn(node) {
|
|
358
|
+
const sourceFile = node.getSourceFile();
|
|
359
|
+
if (!sourceFile)
|
|
360
|
+
return 0;
|
|
361
|
+
const { character } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
|
|
362
|
+
return character;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=dataflow-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataflow-graph.js","sourceRoot":"","sources":["../../src/analysis/dataflow-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for dataflow/taint analysis
|
|
3
|
+
*
|
|
4
|
+
* Phase 3.1: Dataflow Implementation
|
|
5
|
+
* v1.0.0 Scope: Single-file, intraprocedural analysis
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Dataflow graph representing data dependencies in code
|
|
9
|
+
*/
|
|
10
|
+
export interface DataFlowGraph {
|
|
11
|
+
nodes: DataFlowNode[];
|
|
12
|
+
edges: DataFlowEdge[];
|
|
13
|
+
sourceNodeIds: string[];
|
|
14
|
+
sinkNodeIds: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Node in the dataflow graph
|
|
18
|
+
*/
|
|
19
|
+
export interface DataFlowNode {
|
|
20
|
+
id: string;
|
|
21
|
+
type: NodeType;
|
|
22
|
+
identifier?: string;
|
|
23
|
+
line: number;
|
|
24
|
+
column: number;
|
|
25
|
+
scope?: string;
|
|
26
|
+
isTainted?: boolean;
|
|
27
|
+
metadata?: {
|
|
28
|
+
astNodeKind?: string;
|
|
29
|
+
[key: string]: any;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export type NodeType = 'source' | 'sink' | 'variable' | 'operation' | 'parameter' | 'property';
|
|
33
|
+
/**
|
|
34
|
+
* Edge in the dataflow graph (data dependency)
|
|
35
|
+
*/
|
|
36
|
+
export interface DataFlowEdge {
|
|
37
|
+
from: string;
|
|
38
|
+
to: string;
|
|
39
|
+
type: EdgeType;
|
|
40
|
+
label?: string;
|
|
41
|
+
}
|
|
42
|
+
export type EdgeType = 'assignment' | 'property-read' | 'property-write' | 'function-call' | 'function-return' | 'template-literal' | 'object-construction';
|
|
43
|
+
/**
|
|
44
|
+
* Taint source (where untrusted/sensitive data originates)
|
|
45
|
+
*/
|
|
46
|
+
export interface TaintSource {
|
|
47
|
+
nodeId: string;
|
|
48
|
+
type: TaintSourceType;
|
|
49
|
+
identifier: string;
|
|
50
|
+
line: number;
|
|
51
|
+
column: number;
|
|
52
|
+
metadata?: {
|
|
53
|
+
envVarName?: string;
|
|
54
|
+
paramName?: string;
|
|
55
|
+
apiUrl?: string;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export type TaintSourceType = 'env-var' | 'user-input' | 'network-response' | 'file-input';
|
|
59
|
+
/**
|
|
60
|
+
* Taint sink (where tainted data causes security issues)
|
|
61
|
+
*/
|
|
62
|
+
export interface TaintSink {
|
|
63
|
+
nodeId: string;
|
|
64
|
+
type: TaintSinkType;
|
|
65
|
+
function: string;
|
|
66
|
+
line: number;
|
|
67
|
+
column: number;
|
|
68
|
+
argumentIndex?: number;
|
|
69
|
+
metadata?: {
|
|
70
|
+
url?: string;
|
|
71
|
+
filePath?: string;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export type TaintSinkType = 'command-execution' | 'code-evaluation' | 'network-request' | 'file-write' | 'dynamic-import';
|
|
75
|
+
/**
|
|
76
|
+
* Dataflow path from source to sink
|
|
77
|
+
*/
|
|
78
|
+
export interface DataFlowPath {
|
|
79
|
+
source: TaintSource;
|
|
80
|
+
sink: TaintSink;
|
|
81
|
+
path: DataFlowNode[];
|
|
82
|
+
confidence: ConfidenceLevel;
|
|
83
|
+
severity: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW' | 'INFO';
|
|
84
|
+
}
|
|
85
|
+
export type ConfidenceLevel = 'high' | 'medium' | 'low';
|
|
86
|
+
//# sourceMappingURL=dataflow-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataflow-types.d.ts","sourceRoot":"","sources":["../../src/analysis/dataflow-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE;QACT,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;CACH;AAED,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,MAAM,GACN,UAAU,GACV,WAAW,GACX,WAAW,GACX,UAAU,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,QAAQ,GAChB,YAAY,GACZ,eAAe,GACf,gBAAgB,GAChB,eAAe,GACf,iBAAiB,GACjB,kBAAkB,GAClB,qBAAqB,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,eAAe,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE;QACT,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,YAAY,GACZ,kBAAkB,GAClB,YAAY,CAAC;AAEjB;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,MAAM,aAAa,GACrB,mBAAmB,GACnB,iBAAiB,GACjB,iBAAiB,GACjB,YAAY,GACZ,gBAAgB,CAAC;AAErB;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,UAAU,EAAE,eAAe,CAAC;IAC5B,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;CAC3D;AAED,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,QAAQ,GACR,KAAK,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataflow-types.js","sourceRoot":"","sources":["../../src/analysis/dataflow-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataflow.test.d.ts","sourceRoot":"","sources":["../../src/analysis/dataflow.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|