@indicated/vibeguard 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.
Files changed (109) hide show
  1. package/.claude/settings.local.json +5 -0
  2. package/.github/workflows/ci.yml +65 -0
  3. package/.github/workflows/release.yml +85 -0
  4. package/PROGRESS.md +192 -0
  5. package/README.md +183 -0
  6. package/dist/api/license.d.ts +13 -0
  7. package/dist/api/license.d.ts.map +1 -0
  8. package/dist/api/license.js +138 -0
  9. package/dist/api/license.js.map +1 -0
  10. package/dist/api/rules.d.ts +13 -0
  11. package/dist/api/rules.d.ts.map +1 -0
  12. package/dist/api/rules.js +57 -0
  13. package/dist/api/rules.js.map +1 -0
  14. package/dist/cli/commands/init.d.ts +3 -0
  15. package/dist/cli/commands/init.d.ts.map +1 -0
  16. package/dist/cli/commands/init.js +145 -0
  17. package/dist/cli/commands/init.js.map +1 -0
  18. package/dist/cli/commands/login.d.ts +4 -0
  19. package/dist/cli/commands/login.d.ts.map +1 -0
  20. package/dist/cli/commands/login.js +121 -0
  21. package/dist/cli/commands/login.js.map +1 -0
  22. package/dist/cli/commands/mcp.d.ts +3 -0
  23. package/dist/cli/commands/mcp.d.ts.map +1 -0
  24. package/dist/cli/commands/mcp.js +14 -0
  25. package/dist/cli/commands/mcp.js.map +1 -0
  26. package/dist/cli/commands/rules.d.ts +3 -0
  27. package/dist/cli/commands/rules.d.ts.map +1 -0
  28. package/dist/cli/commands/rules.js +52 -0
  29. package/dist/cli/commands/rules.js.map +1 -0
  30. package/dist/cli/commands/scan.d.ts +3 -0
  31. package/dist/cli/commands/scan.d.ts.map +1 -0
  32. package/dist/cli/commands/scan.js +114 -0
  33. package/dist/cli/commands/scan.js.map +1 -0
  34. package/dist/cli/config.d.ts +4 -0
  35. package/dist/cli/config.d.ts.map +1 -0
  36. package/dist/cli/config.js +88 -0
  37. package/dist/cli/config.js.map +1 -0
  38. package/dist/cli/index.d.ts +3 -0
  39. package/dist/cli/index.d.ts.map +1 -0
  40. package/dist/cli/index.js +25 -0
  41. package/dist/cli/index.js.map +1 -0
  42. package/dist/cli/output.d.ts +15 -0
  43. package/dist/cli/output.d.ts.map +1 -0
  44. package/dist/cli/output.js +152 -0
  45. package/dist/cli/output.js.map +1 -0
  46. package/dist/mcp/server.d.ts +2 -0
  47. package/dist/mcp/server.d.ts.map +1 -0
  48. package/dist/mcp/server.js +188 -0
  49. package/dist/mcp/server.js.map +1 -0
  50. package/dist/scanner/index.d.ts +15 -0
  51. package/dist/scanner/index.d.ts.map +1 -0
  52. package/dist/scanner/index.js +207 -0
  53. package/dist/scanner/index.js.map +1 -0
  54. package/dist/scanner/parsers/javascript.d.ts +12 -0
  55. package/dist/scanner/parsers/javascript.d.ts.map +1 -0
  56. package/dist/scanner/parsers/javascript.js +266 -0
  57. package/dist/scanner/parsers/javascript.js.map +1 -0
  58. package/dist/scanner/parsers/python.d.ts +3 -0
  59. package/dist/scanner/parsers/python.d.ts.map +1 -0
  60. package/dist/scanner/parsers/python.js +108 -0
  61. package/dist/scanner/parsers/python.js.map +1 -0
  62. package/dist/scanner/rules/definitions.d.ts +5 -0
  63. package/dist/scanner/rules/definitions.d.ts.map +1 -0
  64. package/dist/scanner/rules/definitions.js +584 -0
  65. package/dist/scanner/rules/definitions.js.map +1 -0
  66. package/dist/scanner/rules/loader.d.ts +8 -0
  67. package/dist/scanner/rules/loader.d.ts.map +1 -0
  68. package/dist/scanner/rules/loader.js +45 -0
  69. package/dist/scanner/rules/loader.js.map +1 -0
  70. package/dist/scanner/rules/matcher.d.ts +11 -0
  71. package/dist/scanner/rules/matcher.d.ts.map +1 -0
  72. package/dist/scanner/rules/matcher.js +53 -0
  73. package/dist/scanner/rules/matcher.js.map +1 -0
  74. package/dist/types.d.ts +33 -0
  75. package/dist/types.d.ts.map +1 -0
  76. package/dist/types.js +3 -0
  77. package/dist/types.js.map +1 -0
  78. package/package.json +48 -0
  79. package/src/api/license.ts +120 -0
  80. package/src/api/rules.ts +70 -0
  81. package/src/cli/commands/init.ts +123 -0
  82. package/src/cli/commands/login.ts +92 -0
  83. package/src/cli/commands/mcp.ts +12 -0
  84. package/src/cli/commands/rules.ts +58 -0
  85. package/src/cli/commands/scan.ts +94 -0
  86. package/src/cli/config.ts +54 -0
  87. package/src/cli/index.ts +28 -0
  88. package/src/cli/output.ts +159 -0
  89. package/src/mcp/server.ts +195 -0
  90. package/src/scanner/index.ts +195 -0
  91. package/src/scanner/parsers/javascript.ts +285 -0
  92. package/src/scanner/parsers/python.ts +126 -0
  93. package/src/scanner/rules/definitions.ts +592 -0
  94. package/src/scanner/rules/loader.ts +59 -0
  95. package/src/scanner/rules/matcher.ts +68 -0
  96. package/src/types.ts +36 -0
  97. package/test-samples/secure.js +52 -0
  98. package/test-samples/vulnerable.js +56 -0
  99. package/test-samples/vulnerable.py +39 -0
  100. package/tests/helpers.ts +43 -0
  101. package/tests/rules/critical.test.ts +186 -0
  102. package/tests/rules/definitions.test.ts +167 -0
  103. package/tests/rules/high.test.ts +377 -0
  104. package/tests/rules/low.test.ts +172 -0
  105. package/tests/rules/medium.test.ts +224 -0
  106. package/tests/scanner/scanner.test.ts +161 -0
  107. package/tsconfig.json +19 -0
  108. package/vibe-coding-security-checklist.md +245 -0
  109. package/vitest.config.ts +15 -0
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Scanner = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const glob_1 = require("glob");
40
+ const loader_1 = require("./rules/loader");
41
+ const javascript_1 = require("./parsers/javascript");
42
+ const python_1 = require("./parsers/python");
43
+ const SUPPORTED_EXTENSIONS = {
44
+ '.js': 'javascript',
45
+ '.jsx': 'javascript',
46
+ '.ts': 'typescript',
47
+ '.tsx': 'typescript',
48
+ '.mjs': 'javascript',
49
+ '.cjs': 'javascript',
50
+ '.py': 'python',
51
+ };
52
+ const DEFAULT_EXCLUDE = [
53
+ '**/node_modules/**',
54
+ '**/dist/**',
55
+ '**/build/**',
56
+ '**/.git/**',
57
+ '**/coverage/**',
58
+ '**/__pycache__/**',
59
+ '**/venv/**',
60
+ '**/.venv/**',
61
+ '**/env/**',
62
+ '**/*.min.js',
63
+ '**/*.bundle.js',
64
+ ];
65
+ class Scanner {
66
+ constructor(config = {}) {
67
+ this.rules = [];
68
+ this.config = config;
69
+ }
70
+ async initialize(licenseKey) {
71
+ const allRules = await (0, loader_1.loadRules)(licenseKey);
72
+ this.rules = (0, loader_1.filterRules)(allRules, {
73
+ enabled: this.config.rules?.enabled,
74
+ disabled: this.config.rules?.disabled,
75
+ });
76
+ }
77
+ async scan(targets) {
78
+ const startTime = Date.now();
79
+ const findings = [];
80
+ const files = [];
81
+ for (const target of targets) {
82
+ const targetPath = path.resolve(target);
83
+ const stat = fs.statSync(targetPath);
84
+ if (stat.isDirectory()) {
85
+ const globPattern = path.join(targetPath, '**/*');
86
+ const exclude = [...DEFAULT_EXCLUDE, ...(this.config.exclude || [])];
87
+ const matchedFiles = await (0, glob_1.glob)(globPattern, {
88
+ ignore: exclude,
89
+ nodir: true,
90
+ });
91
+ files.push(...matchedFiles.filter(f => this.isSupportedFile(f)));
92
+ }
93
+ else if (stat.isFile() && this.isSupportedFile(targetPath)) {
94
+ files.push(targetPath);
95
+ }
96
+ }
97
+ for (const file of files) {
98
+ const fileFindings = await this.scanFile(file);
99
+ findings.push(...fileFindings);
100
+ }
101
+ return {
102
+ files: files.length,
103
+ findings: this.sortFindings(findings),
104
+ duration: Date.now() - startTime,
105
+ };
106
+ }
107
+ async scanStaged() {
108
+ const startTime = Date.now();
109
+ const findings = [];
110
+ // Get staged files from git
111
+ const { execSync } = await Promise.resolve().then(() => __importStar(require('child_process')));
112
+ let stagedFiles = [];
113
+ try {
114
+ const output = execSync('git diff --cached --name-only --diff-filter=ACM', {
115
+ encoding: 'utf-8',
116
+ });
117
+ stagedFiles = output
118
+ .split('\n')
119
+ .filter(f => f.trim() && this.isSupportedFile(f))
120
+ .map(f => path.resolve(f));
121
+ }
122
+ catch {
123
+ // Not in a git repo or git not available
124
+ return {
125
+ files: 0,
126
+ findings: [],
127
+ duration: Date.now() - startTime,
128
+ };
129
+ }
130
+ for (const file of stagedFiles) {
131
+ if (fs.existsSync(file)) {
132
+ const fileFindings = await this.scanFile(file);
133
+ findings.push(...fileFindings);
134
+ }
135
+ }
136
+ return {
137
+ files: stagedFiles.length,
138
+ findings: this.sortFindings(findings),
139
+ duration: Date.now() - startTime,
140
+ };
141
+ }
142
+ async scanFile(filePath) {
143
+ const findings = [];
144
+ const ext = path.extname(filePath);
145
+ const language = SUPPORTED_EXTENSIONS[ext];
146
+ if (!language)
147
+ return findings;
148
+ let code;
149
+ try {
150
+ code = fs.readFileSync(filePath, 'utf-8');
151
+ }
152
+ catch {
153
+ return findings;
154
+ }
155
+ // Filter rules by language
156
+ const languageRules = this.rules.filter(rule => rule.languages.includes(language));
157
+ if (language === 'javascript' || language === 'typescript') {
158
+ // Try AST-based scanning
159
+ const ast = (0, javascript_1.parseJavaScript)(code, filePath);
160
+ if (ast) {
161
+ const astFindings = (0, javascript_1.scanWithAST)(ast, languageRules, {
162
+ code,
163
+ lines: code.split('\n'),
164
+ filePath,
165
+ });
166
+ findings.push(...astFindings);
167
+ }
168
+ // Also run pattern-based scanning
169
+ const patternFindings = (0, javascript_1.scanWithPatterns)(code, languageRules, filePath);
170
+ findings.push(...patternFindings);
171
+ }
172
+ else if (language === 'python') {
173
+ const patternFindings = (0, python_1.scanPythonWithPatterns)(code, languageRules, filePath);
174
+ findings.push(...patternFindings);
175
+ }
176
+ // Deduplicate findings
177
+ return this.deduplicateFindings(findings);
178
+ }
179
+ isSupportedFile(filePath) {
180
+ const ext = path.extname(filePath);
181
+ return ext in SUPPORTED_EXTENSIONS;
182
+ }
183
+ sortFindings(findings) {
184
+ const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
185
+ return findings.sort((a, b) => {
186
+ const severityDiff = severityOrder[a.rule.severity] - severityOrder[b.rule.severity];
187
+ if (severityDiff !== 0)
188
+ return severityDiff;
189
+ return a.file.localeCompare(b.file) || a.line - b.line;
190
+ });
191
+ }
192
+ deduplicateFindings(findings) {
193
+ const seen = new Set();
194
+ return findings.filter(f => {
195
+ const key = `${f.rule.id}:${f.file}:${f.line}`;
196
+ if (seen.has(key))
197
+ return false;
198
+ seen.add(key);
199
+ return true;
200
+ });
201
+ }
202
+ getRules() {
203
+ return this.rules;
204
+ }
205
+ }
206
+ exports.Scanner = Scanner;
207
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import * as t from '@babel/types';
2
+ import { Finding, SecurityRule } from '../../types';
3
+ interface ASTContext {
4
+ code: string;
5
+ lines: string[];
6
+ filePath: string;
7
+ }
8
+ export declare function parseJavaScript(code: string, filePath: string): t.File | null;
9
+ export declare function scanWithAST(ast: t.File, rules: SecurityRule[], context: ASTContext): Finding[];
10
+ export declare function scanWithPatterns(code: string, rules: SecurityRule[], filePath: string): Finding[];
11
+ export {};
12
+ //# sourceMappingURL=javascript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript.d.ts","sourceRoot":"","sources":["../../../src/scanner/parsers/javascript.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEpD,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,CAiB7E;AAED,wBAAgB,WAAW,CACzB,GAAG,EAAE,CAAC,CAAC,IAAI,EACX,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,EAAE,UAAU,GAClB,OAAO,EAAE,CA2MX;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,YAAY,EAAE,EACrB,QAAQ,EAAE,MAAM,GACf,OAAO,EAAE,CAyCX"}
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.parseJavaScript = parseJavaScript;
40
+ exports.scanWithAST = scanWithAST;
41
+ exports.scanWithPatterns = scanWithPatterns;
42
+ const parser = __importStar(require("@babel/parser"));
43
+ const traverse_1 = __importDefault(require("@babel/traverse"));
44
+ const t = __importStar(require("@babel/types"));
45
+ function parseJavaScript(code, filePath) {
46
+ try {
47
+ return parser.parse(code, {
48
+ sourceType: 'module',
49
+ plugins: [
50
+ 'jsx',
51
+ 'typescript',
52
+ 'decorators-legacy',
53
+ 'classProperties',
54
+ 'optionalChaining',
55
+ 'nullishCoalescingOperator',
56
+ ],
57
+ });
58
+ }
59
+ catch {
60
+ // If parsing fails, return null and rely on regex patterns only
61
+ return null;
62
+ }
63
+ }
64
+ function scanWithAST(ast, rules, context) {
65
+ const findings = [];
66
+ const astMatchers = {
67
+ 'eval-usage': (path) => {
68
+ if (path.isCallExpression() &&
69
+ t.isIdentifier(path.node.callee) &&
70
+ path.node.callee.name === 'eval') {
71
+ const rule = rules.find(r => r.id === 'eval-usage');
72
+ if (rule) {
73
+ const loc = path.node.loc;
74
+ return {
75
+ rule,
76
+ file: context.filePath,
77
+ line: loc?.start.line || 0,
78
+ column: loc?.start.column || 0,
79
+ code: context.lines[(loc?.start.line || 1) - 1] || '',
80
+ message: rule.description,
81
+ };
82
+ }
83
+ }
84
+ return null;
85
+ },
86
+ 'sql-injection': (path) => {
87
+ if (path.isTemplateLiteral() || path.isBinaryExpression()) {
88
+ const parent = path.parentPath;
89
+ if (parent?.isCallExpression() &&
90
+ t.isMemberExpression(parent.node.callee)) {
91
+ const callee = parent.node.callee;
92
+ const methodName = t.isIdentifier(callee.property) ? callee.property.name : '';
93
+ if (['query', 'exec', 'execute', 'raw'].includes(methodName)) {
94
+ // Check if there's string concatenation or template literal with expressions
95
+ if (path.isTemplateLiteral() &&
96
+ path.node.expressions.length > 0) {
97
+ const codeSnippet = context.code.substring(path.node.start || 0, path.node.end || 0).toLowerCase();
98
+ if (codeSnippet.includes('select') ||
99
+ codeSnippet.includes('insert') ||
100
+ codeSnippet.includes('update') ||
101
+ codeSnippet.includes('delete') ||
102
+ codeSnippet.includes('where')) {
103
+ const rule = rules.find(r => r.id === 'sql-injection');
104
+ if (rule) {
105
+ const loc = path.node.loc;
106
+ return {
107
+ rule,
108
+ file: context.filePath,
109
+ line: loc?.start.line || 0,
110
+ column: loc?.start.column || 0,
111
+ code: context.lines[(loc?.start.line || 1) - 1] || '',
112
+ message: rule.description,
113
+ };
114
+ }
115
+ }
116
+ }
117
+ }
118
+ }
119
+ }
120
+ return null;
121
+ },
122
+ 'xss-innerhtml': (path) => {
123
+ if (path.isAssignmentExpression()) {
124
+ const left = path.node.left;
125
+ if (t.isMemberExpression(left) &&
126
+ t.isIdentifier(left.property) &&
127
+ left.property.name === 'innerHTML') {
128
+ const rule = rules.find(r => r.id === 'xss-innerhtml');
129
+ if (rule) {
130
+ const loc = path.node.loc;
131
+ return {
132
+ rule,
133
+ file: context.filePath,
134
+ line: loc?.start.line || 0,
135
+ column: loc?.start.column || 0,
136
+ code: context.lines[(loc?.start.line || 1) - 1] || '',
137
+ message: rule.description,
138
+ };
139
+ }
140
+ }
141
+ }
142
+ // Check for dangerouslySetInnerHTML in JSX
143
+ if (path.isJSXAttribute()) {
144
+ const name = path.node.name;
145
+ if (t.isJSXIdentifier(name) && name.name === 'dangerouslySetInnerHTML') {
146
+ const rule = rules.find(r => r.id === 'xss-innerhtml');
147
+ if (rule) {
148
+ const loc = path.node.loc;
149
+ return {
150
+ rule,
151
+ file: context.filePath,
152
+ line: loc?.start.line || 0,
153
+ column: loc?.start.column || 0,
154
+ code: context.lines[(loc?.start.line || 1) - 1] || '',
155
+ message: rule.description,
156
+ };
157
+ }
158
+ }
159
+ }
160
+ return null;
161
+ },
162
+ 'missing-auth': (path) => {
163
+ // Detect Express/Next.js API routes without auth checks
164
+ if (path.isCallExpression()) {
165
+ const callee = path.node.callee;
166
+ if (t.isMemberExpression(callee) &&
167
+ t.isIdentifier(callee.property) &&
168
+ ['get', 'post', 'put', 'delete', 'patch'].includes(callee.property.name)) {
169
+ const args = path.node.arguments;
170
+ if (args.length >= 2) {
171
+ // Get the full call expression code to check for middleware
172
+ const callCode = context.code.substring(path.node.start || 0, path.node.end || 0).toLowerCase();
173
+ // Check if any argument mentions auth-related terms (middleware)
174
+ const hasAuthMiddleware = callCode.includes('auth') ||
175
+ callCode.includes('session') ||
176
+ callCode.includes('token') ||
177
+ callCode.includes('jwt') ||
178
+ callCode.includes('middleware') ||
179
+ callCode.includes('isauthenticated') ||
180
+ callCode.includes('requireauth') ||
181
+ callCode.includes('protect') ||
182
+ callCode.includes('verify');
183
+ if (!hasAuthMiddleware) {
184
+ // Check route path for sensitive endpoints
185
+ const routePath = args[0];
186
+ if (t.isStringLiteral(routePath)) {
187
+ const pathValue = routePath.value.toLowerCase();
188
+ if (pathValue.includes('/api/') ||
189
+ pathValue.includes('/user') ||
190
+ pathValue.includes('/admin') ||
191
+ pathValue.includes('/account') ||
192
+ pathValue.includes('/profile')) {
193
+ const rule = rules.find(r => r.id === 'missing-auth-route');
194
+ if (rule) {
195
+ const loc = path.node.loc;
196
+ return {
197
+ rule,
198
+ file: context.filePath,
199
+ line: loc?.start.line || 0,
200
+ column: loc?.start.column || 0,
201
+ code: context.lines[(loc?.start.line || 1) - 1] || '',
202
+ message: `API route ${routePath.value} may be missing authentication`,
203
+ };
204
+ }
205
+ }
206
+ }
207
+ }
208
+ }
209
+ }
210
+ }
211
+ return null;
212
+ },
213
+ };
214
+ (0, traverse_1.default)(ast, {
215
+ enter(path) {
216
+ for (const matcherKey of Object.keys(astMatchers)) {
217
+ const finding = astMatchers[matcherKey](path);
218
+ if (finding) {
219
+ // Avoid duplicates
220
+ const isDuplicate = findings.some(f => f.rule.id === finding.rule.id &&
221
+ f.line === finding.line &&
222
+ f.file === finding.file);
223
+ if (!isDuplicate) {
224
+ findings.push(finding);
225
+ }
226
+ }
227
+ }
228
+ },
229
+ });
230
+ return findings;
231
+ }
232
+ function scanWithPatterns(code, rules, filePath) {
233
+ const findings = [];
234
+ const lines = code.split('\n');
235
+ for (const rule of rules) {
236
+ if (!rule.patterns)
237
+ continue;
238
+ for (const pattern of rule.patterns) {
239
+ let match;
240
+ const regex = new RegExp(pattern.source, pattern.flags + (pattern.flags.includes('g') ? '' : 'g'));
241
+ while ((match = regex.exec(code)) !== null) {
242
+ // Calculate line number from match index
243
+ const beforeMatch = code.substring(0, match.index);
244
+ const lineNumber = (beforeMatch.match(/\n/g) || []).length + 1;
245
+ const lineStart = beforeMatch.lastIndexOf('\n') + 1;
246
+ const column = match.index - lineStart;
247
+ // Avoid duplicates
248
+ const isDuplicate = findings.some(f => f.rule.id === rule.id &&
249
+ f.line === lineNumber &&
250
+ f.file === filePath);
251
+ if (!isDuplicate) {
252
+ findings.push({
253
+ rule,
254
+ file: filePath,
255
+ line: lineNumber,
256
+ column,
257
+ code: lines[lineNumber - 1] || '',
258
+ message: rule.description,
259
+ });
260
+ }
261
+ }
262
+ }
263
+ }
264
+ return findings;
265
+ }
266
+ //# sourceMappingURL=javascript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript.js","sourceRoot":"","sources":["../../../src/scanner/parsers/javascript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Finding, SecurityRule } from '../../types';
2
+ export declare function scanPythonWithPatterns(code: string, rules: SecurityRule[], filePath: string): Finding[];
3
+ //# sourceMappingURL=python.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../src/scanner/parsers/python.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA+CpD,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,YAAY,EAAE,EACrB,QAAQ,EAAE,MAAM,GACf,OAAO,EAAE,CA0EX"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scanPythonWithPatterns = scanPythonWithPatterns;
4
+ // Python-specific patterns in addition to shared patterns
5
+ const pythonPatterns = [
6
+ // SQL injection patterns
7
+ {
8
+ ruleId: 'sql-injection',
9
+ pattern: /cursor\.execute\s*\(\s*f?['"`](?:SELECT|INSERT|UPDATE|DELETE)[^'"`]*\{[^}]+\}/i,
10
+ },
11
+ {
12
+ ruleId: 'sql-injection',
13
+ pattern: /\.execute\s*\(\s*['"`](?:SELECT|INSERT|UPDATE|DELETE)[^'"`]*['"]\s*%\s*/i,
14
+ },
15
+ {
16
+ ruleId: 'sql-injection',
17
+ pattern: /\.execute\s*\(\s*['"`](?:SELECT|INSERT|UPDATE|DELETE)[^'"`]*['"`]\s*\+/i,
18
+ },
19
+ // Eval usage
20
+ {
21
+ ruleId: 'eval-usage',
22
+ pattern: /\beval\s*\([^)]*(?:input|request|data|params|args)/i,
23
+ },
24
+ {
25
+ ruleId: 'eval-usage',
26
+ pattern: /\bexec\s*\([^)]*(?:input|request|data|params|args)/i,
27
+ },
28
+ // Hardcoded secrets
29
+ {
30
+ ruleId: 'hardcoded-secret',
31
+ pattern: /(?:api[_-]?key|secret[_-]?key|password|token)\s*=\s*['"][^'"]{8,}['"]/i,
32
+ },
33
+ // Flask/Django without CSRF
34
+ {
35
+ ruleId: 'permissive-cors',
36
+ pattern: /CORS\s*\(\s*app\s*(?:,\s*resources\s*=\s*\{[^}]*\*[^}]*\})?/,
37
+ },
38
+ // Debug mode in production
39
+ {
40
+ ruleId: 'verbose-errors',
41
+ pattern: /app\.run\s*\([^)]*debug\s*=\s*True/i,
42
+ },
43
+ {
44
+ ruleId: 'verbose-errors',
45
+ pattern: /DEBUG\s*=\s*True/,
46
+ },
47
+ ];
48
+ function scanPythonWithPatterns(code, rules, filePath) {
49
+ const findings = [];
50
+ const lines = code.split('\n');
51
+ // First, scan with rule-defined patterns
52
+ for (const rule of rules) {
53
+ if (!rule.patterns || !rule.languages.includes('python'))
54
+ continue;
55
+ for (const pattern of rule.patterns) {
56
+ let match;
57
+ const regex = new RegExp(pattern.source, pattern.flags + (pattern.flags.includes('g') ? '' : 'g'));
58
+ while ((match = regex.exec(code)) !== null) {
59
+ const beforeMatch = code.substring(0, match.index);
60
+ const lineNumber = (beforeMatch.match(/\n/g) || []).length + 1;
61
+ const lineStart = beforeMatch.lastIndexOf('\n') + 1;
62
+ const column = match.index - lineStart;
63
+ const isDuplicate = findings.some(f => f.rule.id === rule.id &&
64
+ f.line === lineNumber &&
65
+ f.file === filePath);
66
+ if (!isDuplicate) {
67
+ findings.push({
68
+ rule,
69
+ file: filePath,
70
+ line: lineNumber,
71
+ column,
72
+ code: lines[lineNumber - 1] || '',
73
+ message: rule.description,
74
+ });
75
+ }
76
+ }
77
+ }
78
+ }
79
+ // Then scan with Python-specific patterns
80
+ for (const { ruleId, pattern } of pythonPatterns) {
81
+ const rule = rules.find(r => r.id === ruleId);
82
+ if (!rule)
83
+ continue;
84
+ let match;
85
+ const regex = new RegExp(pattern.source, pattern.flags + (pattern.flags.includes('g') ? '' : 'g'));
86
+ while ((match = regex.exec(code)) !== null) {
87
+ const beforeMatch = code.substring(0, match.index);
88
+ const lineNumber = (beforeMatch.match(/\n/g) || []).length + 1;
89
+ const lineStart = beforeMatch.lastIndexOf('\n') + 1;
90
+ const column = match.index - lineStart;
91
+ const isDuplicate = findings.some(f => f.rule.id === ruleId &&
92
+ f.line === lineNumber &&
93
+ f.file === filePath);
94
+ if (!isDuplicate) {
95
+ findings.push({
96
+ rule,
97
+ file: filePath,
98
+ line: lineNumber,
99
+ column,
100
+ code: lines[lineNumber - 1] || '',
101
+ message: rule.description,
102
+ });
103
+ }
104
+ }
105
+ }
106
+ return findings;
107
+ }
108
+ //# sourceMappingURL=python.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/scanner/parsers/python.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { SecurityRule } from '../../types';
2
+ export declare const securityRules: SecurityRule[];
3
+ export declare function getRuleById(id: string): SecurityRule | undefined;
4
+ export declare function getRulesBySeverity(severity: string): SecurityRule[];
5
+ //# sourceMappingURL=definitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../../src/scanner/rules/definitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,aAAa,EAAE,YAAY,EAqkBvC,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEhE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAEnE"}