@nahisaho/musubix-security 1.8.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/README.md +105 -0
- package/bin/musubix-security-mcp.js +12 -0
- package/bin/musubix-security.js +12 -0
- package/dist/analysis/dependency-auditor.d.ts +30 -0
- package/dist/analysis/dependency-auditor.d.ts.map +1 -0
- package/dist/analysis/dependency-auditor.js +325 -0
- package/dist/analysis/dependency-auditor.js.map +1 -0
- package/dist/analysis/index.d.ts +9 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +9 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/secret-detector.d.ts +44 -0
- package/dist/analysis/secret-detector.d.ts.map +1 -0
- package/dist/analysis/secret-detector.js +465 -0
- package/dist/analysis/secret-detector.js.map +1 -0
- package/dist/analysis/taint-analyzer.d.ts +62 -0
- package/dist/analysis/taint-analyzer.d.ts.map +1 -0
- package/dist/analysis/taint-analyzer.js +519 -0
- package/dist/analysis/taint-analyzer.js.map +1 -0
- package/dist/analysis/vulnerability-scanner.d.ts +58 -0
- package/dist/analysis/vulnerability-scanner.d.ts.map +1 -0
- package/dist/analysis/vulnerability-scanner.js +417 -0
- package/dist/analysis/vulnerability-scanner.js.map +1 -0
- package/dist/cli/commands.d.ts +15 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +405 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +6 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/ast-parser.d.ts +87 -0
- package/dist/infrastructure/ast-parser.d.ts.map +1 -0
- package/dist/infrastructure/ast-parser.js +273 -0
- package/dist/infrastructure/ast-parser.js.map +1 -0
- package/dist/infrastructure/cache.d.ts +100 -0
- package/dist/infrastructure/cache.d.ts.map +1 -0
- package/dist/infrastructure/cache.js +288 -0
- package/dist/infrastructure/cache.js.map +1 -0
- package/dist/infrastructure/config-loader.d.ts +35 -0
- package/dist/infrastructure/config-loader.d.ts.map +1 -0
- package/dist/infrastructure/config-loader.js +358 -0
- package/dist/infrastructure/config-loader.js.map +1 -0
- package/dist/infrastructure/file-scanner.d.ts +94 -0
- package/dist/infrastructure/file-scanner.d.ts.map +1 -0
- package/dist/infrastructure/file-scanner.js +189 -0
- package/dist/infrastructure/file-scanner.js.map +1 -0
- package/dist/infrastructure/index.d.ts +9 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +9 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/mcp/index.d.ts +7 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +7 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +34 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +88 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +88 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +443 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/services/fix-generator.d.ts +56 -0
- package/dist/services/fix-generator.d.ts.map +1 -0
- package/dist/services/fix-generator.js +346 -0
- package/dist/services/fix-generator.js.map +1 -0
- package/dist/services/fix-verifier.d.ts +62 -0
- package/dist/services/fix-verifier.d.ts.map +1 -0
- package/dist/services/fix-verifier.js +224 -0
- package/dist/services/fix-verifier.js.map +1 -0
- package/dist/services/index.d.ts +9 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +13 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/report-generator.d.ts +87 -0
- package/dist/services/report-generator.d.ts.map +1 -0
- package/dist/services/report-generator.js +463 -0
- package/dist/services/report-generator.js.map +1 -0
- package/dist/services/security-service.d.ts +151 -0
- package/dist/services/security-service.d.ts.map +1 -0
- package/dist/services/security-service.js +279 -0
- package/dist/services/security-service.js.map +1 -0
- package/dist/types/config.d.ts +188 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +89 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/dependency.d.ts +266 -0
- package/dist/types/dependency.d.ts.map +1 -0
- package/dist/types/dependency.js +7 -0
- package/dist/types/dependency.js.map +1 -0
- package/dist/types/fix.d.ts +213 -0
- package/dist/types/fix.d.ts.map +1 -0
- package/dist/types/fix.js +7 -0
- package/dist/types/fix.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/secret.d.ts +151 -0
- package/dist/types/secret.d.ts.map +1 -0
- package/dist/types/secret.js +91 -0
- package/dist/types/secret.js.map +1 -0
- package/dist/types/taint.d.ts +182 -0
- package/dist/types/taint.d.ts.map +1 -0
- package/dist/types/taint.js +24 -0
- package/dist/types/taint.js.map +1 -0
- package/dist/types/vulnerability.d.ts +136 -0
- package/dist/types/vulnerability.d.ts.map +1 -0
- package/dist/types/vulnerability.js +7 -0
- package/dist/types/vulnerability.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview TypeScript AST parser using ts-morph
|
|
3
|
+
* @module @nahisaho/musubix-security/infrastructure/ast-parser
|
|
4
|
+
* @trace REQ-SEC-SCAN-001, REQ-SEC-TAINT-001
|
|
5
|
+
*/
|
|
6
|
+
import { Project, SourceFile, Node, CallExpression, Identifier } from 'ts-morph';
|
|
7
|
+
import type { SourceLocation } from '../types/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* AST Parser service for TypeScript/JavaScript analysis
|
|
10
|
+
*/
|
|
11
|
+
export declare class ASTParser {
|
|
12
|
+
private project;
|
|
13
|
+
private cache;
|
|
14
|
+
constructor(tsConfigPath?: string);
|
|
15
|
+
/**
|
|
16
|
+
* Parse a file and return its AST
|
|
17
|
+
*/
|
|
18
|
+
parseFile(filePath: string): SourceFile;
|
|
19
|
+
/**
|
|
20
|
+
* Parse source code string
|
|
21
|
+
*/
|
|
22
|
+
parseCode(code: string, fileName?: string): SourceFile;
|
|
23
|
+
/**
|
|
24
|
+
* Get source location from a node
|
|
25
|
+
*/
|
|
26
|
+
getLocation(node: Node): SourceLocation;
|
|
27
|
+
/**
|
|
28
|
+
* Find all function calls in a file
|
|
29
|
+
*/
|
|
30
|
+
findCallExpressions(sourceFile: SourceFile): CallExpression[];
|
|
31
|
+
/**
|
|
32
|
+
* Find all string literals in a file
|
|
33
|
+
*/
|
|
34
|
+
findStringLiterals(sourceFile: SourceFile): Node[];
|
|
35
|
+
/**
|
|
36
|
+
* Find all identifiers in a file
|
|
37
|
+
*/
|
|
38
|
+
findIdentifiers(sourceFile: SourceFile): Identifier[];
|
|
39
|
+
/**
|
|
40
|
+
* Get function/method name from a call expression
|
|
41
|
+
*/
|
|
42
|
+
getFunctionName(callExpr: CallExpression): string | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* Get the receiver object name for a method call
|
|
45
|
+
*/
|
|
46
|
+
getReceiverName(callExpr: CallExpression): string | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* Check if a node is inside a specific function/method
|
|
49
|
+
*/
|
|
50
|
+
getEnclosingFunction(node: Node): Node | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Extract code snippet around a node
|
|
53
|
+
*/
|
|
54
|
+
extractSnippet(node: Node, contextLines?: number): string;
|
|
55
|
+
/**
|
|
56
|
+
* Check if node represents user input source
|
|
57
|
+
*/
|
|
58
|
+
isUserInputSource(callExpr: CallExpression): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Check if node is a dangerous sink
|
|
61
|
+
*/
|
|
62
|
+
isDangerousSink(callExpr: CallExpression): {
|
|
63
|
+
isDangerous: boolean;
|
|
64
|
+
category?: string;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Clear cache for a file
|
|
68
|
+
*/
|
|
69
|
+
invalidateCache(filePath: string): void;
|
|
70
|
+
/**
|
|
71
|
+
* Clear all caches
|
|
72
|
+
*/
|
|
73
|
+
clearCache(): void;
|
|
74
|
+
/**
|
|
75
|
+
* Get project instance for advanced usage
|
|
76
|
+
*/
|
|
77
|
+
getProject(): Project;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get or create AST parser instance
|
|
81
|
+
*/
|
|
82
|
+
export declare function getASTParser(tsConfigPath?: string): ASTParser;
|
|
83
|
+
/**
|
|
84
|
+
* Reset parser instance (for testing)
|
|
85
|
+
*/
|
|
86
|
+
export declare function resetASTParser(): void;
|
|
87
|
+
//# sourceMappingURL=ast-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-parser.d.ts","sourceRoot":"","sources":["../../src/infrastructure/ast-parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAc,cAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC7F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,KAAK,CAAsC;gBAEvC,YAAY,CAAC,EAAE,MAAM;IAajC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU;IAWvC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAY,GAAG,UAAU;IAIzD;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,cAAc;IAgBvC;;OAEG;IACH,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,cAAc,EAAE;IAI7D;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,EAAE;IAQlD;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,EAAE;IAIrD;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS;IAwB7D;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS;IAa7D;;OAEG;IACH,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS;IASlD;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,SAAI,GAAG,MAAM;IAYpD;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO;IAsCpD;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAyDtF;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQvC;;OAEG;IACH,UAAU,IAAI,IAAI;IAOlB;;OAEG;IACH,UAAU,IAAI,OAAO;CAGtB;AAOD;;GAEG;AACH,wBAAgB,YAAY,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAK7D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAKrC"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview TypeScript AST parser using ts-morph
|
|
3
|
+
* @module @nahisaho/musubix-security/infrastructure/ast-parser
|
|
4
|
+
* @trace REQ-SEC-SCAN-001, REQ-SEC-TAINT-001
|
|
5
|
+
*/
|
|
6
|
+
import { Project, Node, SyntaxKind } from 'ts-morph';
|
|
7
|
+
/**
|
|
8
|
+
* AST Parser service for TypeScript/JavaScript analysis
|
|
9
|
+
*/
|
|
10
|
+
export class ASTParser {
|
|
11
|
+
project;
|
|
12
|
+
cache = new Map();
|
|
13
|
+
constructor(tsConfigPath) {
|
|
14
|
+
this.project = new Project({
|
|
15
|
+
tsConfigFilePath: tsConfigPath,
|
|
16
|
+
skipAddingFilesFromTsConfig: true,
|
|
17
|
+
compilerOptions: {
|
|
18
|
+
allowJs: true,
|
|
19
|
+
checkJs: false,
|
|
20
|
+
noEmit: true,
|
|
21
|
+
skipLibCheck: true,
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Parse a file and return its AST
|
|
27
|
+
*/
|
|
28
|
+
parseFile(filePath) {
|
|
29
|
+
const cached = this.cache.get(filePath);
|
|
30
|
+
if (cached) {
|
|
31
|
+
return cached;
|
|
32
|
+
}
|
|
33
|
+
const sourceFile = this.project.addSourceFileAtPath(filePath);
|
|
34
|
+
this.cache.set(filePath, sourceFile);
|
|
35
|
+
return sourceFile;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Parse source code string
|
|
39
|
+
*/
|
|
40
|
+
parseCode(code, fileName = 'temp.ts') {
|
|
41
|
+
return this.project.createSourceFile(fileName, code, { overwrite: true });
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get source location from a node
|
|
45
|
+
*/
|
|
46
|
+
getLocation(node) {
|
|
47
|
+
const sourceFile = node.getSourceFile();
|
|
48
|
+
const start = node.getStart();
|
|
49
|
+
const end = node.getEnd();
|
|
50
|
+
const startPos = sourceFile.getLineAndColumnAtPos(start);
|
|
51
|
+
const endPos = sourceFile.getLineAndColumnAtPos(end);
|
|
52
|
+
return {
|
|
53
|
+
file: sourceFile.getFilePath(),
|
|
54
|
+
startLine: startPos.line,
|
|
55
|
+
endLine: endPos.line,
|
|
56
|
+
startColumn: startPos.column - 1, // Convert to 0-based
|
|
57
|
+
endColumn: endPos.column - 1,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Find all function calls in a file
|
|
62
|
+
*/
|
|
63
|
+
findCallExpressions(sourceFile) {
|
|
64
|
+
return sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Find all string literals in a file
|
|
68
|
+
*/
|
|
69
|
+
findStringLiterals(sourceFile) {
|
|
70
|
+
return [
|
|
71
|
+
...sourceFile.getDescendantsOfKind(SyntaxKind.StringLiteral),
|
|
72
|
+
...sourceFile.getDescendantsOfKind(SyntaxKind.NoSubstitutionTemplateLiteral),
|
|
73
|
+
...sourceFile.getDescendantsOfKind(SyntaxKind.TemplateExpression),
|
|
74
|
+
];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Find all identifiers in a file
|
|
78
|
+
*/
|
|
79
|
+
findIdentifiers(sourceFile) {
|
|
80
|
+
return sourceFile.getDescendantsOfKind(SyntaxKind.Identifier);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get function/method name from a call expression
|
|
84
|
+
*/
|
|
85
|
+
getFunctionName(callExpr) {
|
|
86
|
+
const expr = callExpr.getExpression();
|
|
87
|
+
// Direct function call: functionName()
|
|
88
|
+
if (Node.isIdentifier(expr)) {
|
|
89
|
+
return expr.getText();
|
|
90
|
+
}
|
|
91
|
+
// Method call: obj.methodName()
|
|
92
|
+
if (Node.isPropertyAccessExpression(expr)) {
|
|
93
|
+
return expr.getName();
|
|
94
|
+
}
|
|
95
|
+
// Element access: obj['methodName']()
|
|
96
|
+
if (Node.isElementAccessExpression(expr)) {
|
|
97
|
+
const arg = expr.getArgumentExpression();
|
|
98
|
+
if (arg && Node.isStringLiteral(arg)) {
|
|
99
|
+
return arg.getLiteralValue();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get the receiver object name for a method call
|
|
106
|
+
*/
|
|
107
|
+
getReceiverName(callExpr) {
|
|
108
|
+
const expr = callExpr.getExpression();
|
|
109
|
+
if (Node.isPropertyAccessExpression(expr)) {
|
|
110
|
+
const receiver = expr.getExpression();
|
|
111
|
+
if (Node.isIdentifier(receiver)) {
|
|
112
|
+
return receiver.getText();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Check if a node is inside a specific function/method
|
|
119
|
+
*/
|
|
120
|
+
getEnclosingFunction(node) {
|
|
121
|
+
return node.getFirstAncestor((ancestor) => Node.isFunctionDeclaration(ancestor) ||
|
|
122
|
+
Node.isFunctionExpression(ancestor) ||
|
|
123
|
+
Node.isArrowFunction(ancestor) ||
|
|
124
|
+
Node.isMethodDeclaration(ancestor));
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Extract code snippet around a node
|
|
128
|
+
*/
|
|
129
|
+
extractSnippet(node, contextLines = 2) {
|
|
130
|
+
const sourceFile = node.getSourceFile();
|
|
131
|
+
const fullText = sourceFile.getFullText();
|
|
132
|
+
const lines = fullText.split('\n');
|
|
133
|
+
const location = this.getLocation(node);
|
|
134
|
+
const startLine = Math.max(0, location.startLine - 1 - contextLines);
|
|
135
|
+
const endLine = Math.min(lines.length, location.endLine + contextLines);
|
|
136
|
+
return lines.slice(startLine, endLine).join('\n');
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Check if node represents user input source
|
|
140
|
+
*/
|
|
141
|
+
isUserInputSource(callExpr) {
|
|
142
|
+
const funcName = this.getFunctionName(callExpr);
|
|
143
|
+
const receiverName = this.getReceiverName(callExpr);
|
|
144
|
+
// Common user input patterns
|
|
145
|
+
const userInputPatterns = [
|
|
146
|
+
// Express.js
|
|
147
|
+
{ receiver: 'req', methods: ['body', 'query', 'params', 'headers', 'cookies'] },
|
|
148
|
+
// Koa
|
|
149
|
+
{ receiver: 'ctx', methods: ['request', 'query', 'params'] },
|
|
150
|
+
// DOM
|
|
151
|
+
{ receiver: 'document', methods: ['getElementById', 'querySelector', 'querySelectorAll'] },
|
|
152
|
+
// Forms
|
|
153
|
+
{ receiver: undefined, methods: ['prompt', 'confirm'] },
|
|
154
|
+
];
|
|
155
|
+
for (const pattern of userInputPatterns) {
|
|
156
|
+
if (pattern.receiver && receiverName !== pattern.receiver)
|
|
157
|
+
continue;
|
|
158
|
+
if (funcName && pattern.methods.includes(funcName)) {
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Property access on request objects
|
|
163
|
+
const expr = callExpr.getExpression();
|
|
164
|
+
if (Node.isPropertyAccessExpression(expr)) {
|
|
165
|
+
const receiver = expr.getExpression();
|
|
166
|
+
if (Node.isPropertyAccessExpression(receiver)) {
|
|
167
|
+
const text = receiver.getText();
|
|
168
|
+
if (text.includes('req.') || text.includes('request.') || text.includes('ctx.')) {
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Check if node is a dangerous sink
|
|
177
|
+
*/
|
|
178
|
+
isDangerousSink(callExpr) {
|
|
179
|
+
const funcName = this.getFunctionName(callExpr);
|
|
180
|
+
const receiverName = this.getReceiverName(callExpr);
|
|
181
|
+
const dangerousSinks = {
|
|
182
|
+
// SQL
|
|
183
|
+
query: [
|
|
184
|
+
{ receiver: 'db', category: 'sql-query' },
|
|
185
|
+
{ receiver: 'connection', category: 'sql-query' },
|
|
186
|
+
{ receiver: 'pool', category: 'sql-query' },
|
|
187
|
+
],
|
|
188
|
+
execute: [{ receiver: 'db', category: 'sql-query' }],
|
|
189
|
+
raw: [{ receiver: 'knex', category: 'sql-query' }],
|
|
190
|
+
// Command execution
|
|
191
|
+
exec: [
|
|
192
|
+
{ receiver: 'child_process', category: 'command-exec' },
|
|
193
|
+
{ receiver: undefined, category: 'command-exec' },
|
|
194
|
+
],
|
|
195
|
+
execSync: [{ receiver: 'child_process', category: 'command-exec' }],
|
|
196
|
+
spawn: [{ receiver: 'child_process', category: 'command-exec' }],
|
|
197
|
+
// File system
|
|
198
|
+
readFile: [{ receiver: 'fs', category: 'file-read' }],
|
|
199
|
+
readFileSync: [{ receiver: 'fs', category: 'file-read' }],
|
|
200
|
+
writeFile: [{ receiver: 'fs', category: 'file-write' }],
|
|
201
|
+
writeFileSync: [{ receiver: 'fs', category: 'file-write' }],
|
|
202
|
+
// Eval/code execution
|
|
203
|
+
eval: [{ receiver: undefined, category: 'eval' }],
|
|
204
|
+
Function: [{ receiver: undefined, category: 'eval' }],
|
|
205
|
+
// HTML output
|
|
206
|
+
innerHTML: [{ receiver: undefined, category: 'html-output' }],
|
|
207
|
+
html: [{ receiver: undefined, category: 'html-output' }],
|
|
208
|
+
render: [{ receiver: 'res', category: 'html-output' }],
|
|
209
|
+
send: [{ receiver: 'res', category: 'html-output' }],
|
|
210
|
+
// Redirects
|
|
211
|
+
redirect: [{ receiver: 'res', category: 'redirect' }],
|
|
212
|
+
// Deserialization
|
|
213
|
+
parse: [{ receiver: 'JSON', category: 'deserialization' }],
|
|
214
|
+
deserialize: [{ receiver: undefined, category: 'deserialization' }],
|
|
215
|
+
};
|
|
216
|
+
if (funcName && dangerousSinks[funcName]) {
|
|
217
|
+
for (const sink of dangerousSinks[funcName]) {
|
|
218
|
+
if (!sink.receiver || sink.receiver === receiverName) {
|
|
219
|
+
return { isDangerous: true, category: sink.category };
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return { isDangerous: false };
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Clear cache for a file
|
|
227
|
+
*/
|
|
228
|
+
invalidateCache(filePath) {
|
|
229
|
+
this.cache.delete(filePath);
|
|
230
|
+
const sourceFile = this.project.getSourceFile(filePath);
|
|
231
|
+
if (sourceFile) {
|
|
232
|
+
this.project.removeSourceFile(sourceFile);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Clear all caches
|
|
237
|
+
*/
|
|
238
|
+
clearCache() {
|
|
239
|
+
this.cache.clear();
|
|
240
|
+
for (const sourceFile of this.project.getSourceFiles()) {
|
|
241
|
+
this.project.removeSourceFile(sourceFile);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Get project instance for advanced usage
|
|
246
|
+
*/
|
|
247
|
+
getProject() {
|
|
248
|
+
return this.project;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Singleton instance
|
|
253
|
+
*/
|
|
254
|
+
let parserInstance = null;
|
|
255
|
+
/**
|
|
256
|
+
* Get or create AST parser instance
|
|
257
|
+
*/
|
|
258
|
+
export function getASTParser(tsConfigPath) {
|
|
259
|
+
if (!parserInstance) {
|
|
260
|
+
parserInstance = new ASTParser(tsConfigPath);
|
|
261
|
+
}
|
|
262
|
+
return parserInstance;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Reset parser instance (for testing)
|
|
266
|
+
*/
|
|
267
|
+
export function resetASTParser() {
|
|
268
|
+
if (parserInstance) {
|
|
269
|
+
parserInstance.clearCache();
|
|
270
|
+
parserInstance = null;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=ast-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-parser.js","sourceRoot":"","sources":["../../src/infrastructure/ast-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Caching infrastructure
|
|
3
|
+
* @module @nahisaho/musubix-security/infrastructure/cache
|
|
4
|
+
* @trace REQ-SEC-CACHE-001
|
|
5
|
+
*/
|
|
6
|
+
import type { CacheStrategy } from '../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Cache statistics
|
|
9
|
+
*/
|
|
10
|
+
export interface CacheStats {
|
|
11
|
+
hits: number;
|
|
12
|
+
misses: number;
|
|
13
|
+
size: number;
|
|
14
|
+
entryCount: number;
|
|
15
|
+
hitRate: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Cache options
|
|
19
|
+
*/
|
|
20
|
+
export interface CacheOptions {
|
|
21
|
+
/** Cache strategy */
|
|
22
|
+
strategy: CacheStrategy;
|
|
23
|
+
/** Cache directory for file strategy */
|
|
24
|
+
cacheDir?: string;
|
|
25
|
+
/** TTL in seconds */
|
|
26
|
+
ttlSeconds?: number;
|
|
27
|
+
/** Maximum cache size in bytes */
|
|
28
|
+
maxSizeBytes?: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Abstract cache interface
|
|
32
|
+
*/
|
|
33
|
+
export interface ICache<T = unknown> {
|
|
34
|
+
get(key: string): Promise<T | undefined>;
|
|
35
|
+
set(key: string, value: T, ttlSeconds?: number): Promise<void>;
|
|
36
|
+
has(key: string): Promise<boolean>;
|
|
37
|
+
delete(key: string): Promise<boolean>;
|
|
38
|
+
clear(): Promise<void>;
|
|
39
|
+
getStats(): CacheStats | Promise<CacheStats>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Memory cache implementation
|
|
43
|
+
*/
|
|
44
|
+
export declare class MemoryCache<T = unknown> implements ICache<T> {
|
|
45
|
+
private cache;
|
|
46
|
+
private stats;
|
|
47
|
+
private maxSizeBytes;
|
|
48
|
+
private defaultTtlSeconds;
|
|
49
|
+
private currentSize;
|
|
50
|
+
constructor(options?: CacheOptions);
|
|
51
|
+
get(key: string): Promise<T | undefined>;
|
|
52
|
+
set(key: string, value: T, ttlSeconds?: number): Promise<void>;
|
|
53
|
+
has(key: string): Promise<boolean>;
|
|
54
|
+
delete(key: string): Promise<boolean>;
|
|
55
|
+
clear(): Promise<void>;
|
|
56
|
+
getStats(): CacheStats;
|
|
57
|
+
private evictOldest;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* File-based cache implementation
|
|
61
|
+
*/
|
|
62
|
+
export declare class FileCache<T = unknown> implements ICache<T> {
|
|
63
|
+
private stats;
|
|
64
|
+
private cacheDir;
|
|
65
|
+
private defaultTtlSeconds;
|
|
66
|
+
private initialized;
|
|
67
|
+
constructor(options: CacheOptions);
|
|
68
|
+
private ensureDir;
|
|
69
|
+
private getCachePath;
|
|
70
|
+
get(key: string): Promise<T | undefined>;
|
|
71
|
+
set(key: string, value: T, ttlSeconds?: number): Promise<void>;
|
|
72
|
+
has(key: string): Promise<boolean>;
|
|
73
|
+
delete(key: string): Promise<boolean>;
|
|
74
|
+
clear(): Promise<void>;
|
|
75
|
+
getStats(): Promise<CacheStats>;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* No-op cache implementation
|
|
79
|
+
*/
|
|
80
|
+
export declare class NoopCache<T = unknown> implements ICache<T> {
|
|
81
|
+
get(_key: string): Promise<T | undefined>;
|
|
82
|
+
set(_key: string, _value: T): Promise<void>;
|
|
83
|
+
has(_key: string): Promise<boolean>;
|
|
84
|
+
delete(_key: string): Promise<boolean>;
|
|
85
|
+
clear(): Promise<void>;
|
|
86
|
+
getStats(): CacheStats;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Create a cache instance based on options
|
|
90
|
+
*/
|
|
91
|
+
export declare function createCache<T = unknown>(options: CacheOptions): ICache<T>;
|
|
92
|
+
/**
|
|
93
|
+
* Generate a cache key from multiple parts
|
|
94
|
+
*/
|
|
95
|
+
export declare function cacheKey(...parts: (string | number | boolean | undefined | null)[]): string;
|
|
96
|
+
/**
|
|
97
|
+
* Generate a hash for a file's content
|
|
98
|
+
*/
|
|
99
|
+
export declare function contentHash(content: string): string;
|
|
100
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/infrastructure/cache.ts"],"names":[],"mappings":"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"}
|