vibe-guard 1.1.4 → 1.2.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 +163 -283
- package/dist/bin/vibe-guard.js +240 -22
- package/dist/bin/vibe-guard.js.map +1 -1
- package/dist/config.d.ts +0 -18
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -26
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -8
- package/dist/index.js.map +1 -1
- package/dist/reporter.d.ts.map +1 -1
- package/dist/reporter.js +41 -19
- package/dist/reporter.js.map +1 -1
- package/dist/rules/ai-agent-access-control.d.ts +27 -2
- package/dist/rules/ai-agent-access-control.d.ts.map +1 -1
- package/dist/rules/ai-agent-access-control.js +393 -19
- package/dist/rules/ai-agent-access-control.js.map +1 -1
- package/dist/rules/ai-data-leakage-prevention.d.ts +25 -2
- package/dist/rules/ai-data-leakage-prevention.d.ts.map +1 -1
- package/dist/rules/ai-data-leakage-prevention.js +409 -21
- package/dist/rules/ai-data-leakage-prevention.js.map +1 -1
- package/dist/rules/ai-generated-code-validation.d.ts +28 -7
- package/dist/rules/ai-generated-code-validation.d.ts.map +1 -1
- package/dist/rules/ai-generated-code-validation.js +367 -96
- package/dist/rules/ai-generated-code-validation.js.map +1 -1
- package/dist/rules/broken-access-control.d.ts +40 -5
- package/dist/rules/broken-access-control.d.ts.map +1 -1
- package/dist/rules/broken-access-control.js +595 -144
- package/dist/rules/broken-access-control.js.map +1 -1
- package/dist/rules/container-registry-security.d.ts +21 -0
- package/dist/rules/container-registry-security.d.ts.map +1 -0
- package/dist/rules/container-registry-security.js +271 -0
- package/dist/rules/container-registry-security.js.map +1 -0
- package/dist/rules/csrf-protection.d.ts +25 -4
- package/dist/rules/csrf-protection.d.ts.map +1 -1
- package/dist/rules/csrf-protection.js +328 -81
- package/dist/rules/csrf-protection.js.map +1 -1
- package/dist/rules/directory-traversal.d.ts +33 -5
- package/dist/rules/directory-traversal.d.ts.map +1 -1
- package/dist/rules/directory-traversal.js +470 -171
- package/dist/rules/directory-traversal.js.map +1 -1
- package/dist/rules/dockerfile-security.d.ts +20 -0
- package/dist/rules/dockerfile-security.d.ts.map +1 -0
- package/dist/rules/dockerfile-security.js +280 -0
- package/dist/rules/dockerfile-security.js.map +1 -0
- package/dist/rules/exposed-secrets.d.ts +25 -4
- package/dist/rules/exposed-secrets.d.ts.map +1 -1
- package/dist/rules/exposed-secrets.js +355 -95
- package/dist/rules/exposed-secrets.js.map +1 -1
- package/dist/rules/hardcoded-sensitive-data.d.ts +32 -2
- package/dist/rules/hardcoded-sensitive-data.d.ts.map +1 -1
- package/dist/rules/hardcoded-sensitive-data.js +426 -29
- package/dist/rules/hardcoded-sensitive-data.js.map +1 -1
- package/dist/rules/index.d.ts +9 -1
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +25 -1
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/insecure-configuration.d.ts +16 -5
- package/dist/rules/insecure-configuration.d.ts.map +1 -1
- package/dist/rules/insecure-configuration.js +457 -64
- package/dist/rules/insecure-configuration.js.map +1 -1
- package/dist/rules/insecure-dependencies.d.ts +46 -1
- package/dist/rules/insecure-dependencies.d.ts.map +1 -1
- package/dist/rules/insecure-dependencies.js +678 -51
- package/dist/rules/insecure-dependencies.js.map +1 -1
- package/dist/rules/insecure-deserialization.d.ts +29 -4
- package/dist/rules/insecure-deserialization.d.ts.map +1 -1
- package/dist/rules/insecure-deserialization.js +531 -101
- package/dist/rules/insecure-deserialization.js.map +1 -1
- package/dist/rules/insecure-error-handling.d.ts +35 -4
- package/dist/rules/insecure-error-handling.d.ts.map +1 -1
- package/dist/rules/insecure-error-handling.js +590 -87
- package/dist/rules/insecure-error-handling.js.map +1 -1
- package/dist/rules/insecure-file-upload.d.ts +37 -5
- package/dist/rules/insecure-file-upload.d.ts.map +1 -1
- package/dist/rules/insecure-file-upload.js +690 -138
- package/dist/rules/insecure-file-upload.js.map +1 -1
- package/dist/rules/insecure-http.d.ts +31 -2
- package/dist/rules/insecure-http.d.ts.map +1 -1
- package/dist/rules/insecure-http.js +547 -61
- package/dist/rules/insecure-http.js.map +1 -1
- package/dist/rules/insecure-logging.d.ts +6 -1
- package/dist/rules/insecure-logging.d.ts.map +1 -1
- package/dist/rules/insecure-logging.js +430 -109
- package/dist/rules/insecure-logging.js.map +1 -1
- package/dist/rules/insecure-random-generation.d.ts +4 -1
- package/dist/rules/insecure-random-generation.d.ts.map +1 -1
- package/dist/rules/insecure-random-generation.js +239 -99
- package/dist/rules/insecure-random-generation.js.map +1 -1
- package/dist/rules/insecure-session-management.d.ts +4 -0
- package/dist/rules/insecure-session-management.d.ts.map +1 -1
- package/dist/rules/insecure-session-management.js +359 -54
- package/dist/rules/insecure-session-management.js.map +1 -1
- package/dist/rules/kubernetes-security.d.ts +17 -0
- package/dist/rules/kubernetes-security.d.ts.map +1 -0
- package/dist/rules/kubernetes-security.js +314 -0
- package/dist/rules/kubernetes-security.js.map +1 -0
- package/dist/rules/mcp-server-security.d.ts +32 -3
- package/dist/rules/mcp-server-security.d.ts.map +1 -1
- package/dist/rules/mcp-server-security.js +511 -39
- package/dist/rules/mcp-server-security.js.map +1 -1
- package/dist/rules/missing-authentication.d.ts +4 -0
- package/dist/rules/missing-authentication.d.ts.map +1 -1
- package/dist/rules/missing-authentication.js +263 -62
- package/dist/rules/missing-authentication.js.map +1 -1
- package/dist/rules/missing-security-headers.d.ts +32 -3
- package/dist/rules/missing-security-headers.d.ts.map +1 -1
- package/dist/rules/missing-security-headers.js +548 -95
- package/dist/rules/missing-security-headers.js.map +1 -1
- package/dist/rules/open-cors.d.ts +3 -0
- package/dist/rules/open-cors.d.ts.map +1 -1
- package/dist/rules/open-cors.js +202 -57
- package/dist/rules/open-cors.js.map +1 -1
- package/dist/rules/prompt-injection-detection.d.ts +33 -3
- package/dist/rules/prompt-injection-detection.d.ts.map +1 -1
- package/dist/rules/prompt-injection-detection.js +571 -43
- package/dist/rules/prompt-injection-detection.js.map +1 -1
- package/dist/rules/sql-injection.d.ts +27 -3
- package/dist/rules/sql-injection.d.ts.map +1 -1
- package/dist/rules/sql-injection.js +471 -61
- package/dist/rules/sql-injection.js.map +1 -1
- package/dist/rules/unvalidated-input.d.ts +20 -4
- package/dist/rules/unvalidated-input.d.ts.map +1 -1
- package/dist/rules/unvalidated-input.js +557 -128
- package/dist/rules/unvalidated-input.js.map +1 -1
- package/dist/rules/xss-detection.d.ts +25 -4
- package/dist/rules/xss-detection.d.ts.map +1 -1
- package/dist/rules/xss-detection.js +702 -135
- package/dist/rules/xss-detection.js.map +1 -1
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +11 -6
- package/dist/scanner.js.map +1 -1
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/dist/types/version.js +1 -1
- package/package.json +8 -3
- package/CHANGELOG.md +0 -102
|
@@ -10,5 +10,9 @@ export declare class MissingAuthenticationRule extends BaseRule {
|
|
|
10
10
|
private extractRoute;
|
|
11
11
|
private isPublicEndpoint;
|
|
12
12
|
private hasAuthenticationContext;
|
|
13
|
+
private hasGlobalAuthentication;
|
|
14
|
+
private determineSeverity;
|
|
15
|
+
private isDevelopmentContext;
|
|
16
|
+
private getRemediationMessage;
|
|
13
17
|
}
|
|
14
18
|
//# sourceMappingURL=missing-authentication.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"missing-authentication.d.ts","sourceRoot":"","sources":["../../src/rules/missing-authentication.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"missing-authentication.d.ts","sourceRoot":"","sources":["../../src/rules/missing-authentication.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAiB,MAAM,UAAU,CAAC;AAE/E,qBAAa,yBAA0B,SAAQ,QAAQ;IACrD,QAAQ,CAAC,IAAI,4BAA4B;IACzC,QAAQ,CAAC,WAAW,0DAA0D;IAC9E,QAAQ,CAAC,QAAQ,EAAG,MAAM,CAAU;IAEpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAqH5B;IAEF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAahC;IAEF,OAAO,CAAC,QAAQ,CAAC,eAAe,CA0C9B;IAEF,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,aAAa,EAAE;IAmEhD,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,wBAAwB;IAiBhC,OAAO,CAAC,uBAAuB;IAiC/B,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,qBAAqB;CA4D9B"}
|
|
@@ -9,17 +9,117 @@ class MissingAuthenticationRule extends types_1.BaseRule {
|
|
|
9
9
|
this.description = 'Detects potentially unprotected routes and endpoints';
|
|
10
10
|
this.severity = 'high';
|
|
11
11
|
this.routePatterns = [
|
|
12
|
-
//
|
|
13
|
-
{
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
{
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
12
|
+
// Critical: Sensitive routes that should always be protected
|
|
13
|
+
{
|
|
14
|
+
pattern: /\b(?:app|router)\.(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
|
|
15
|
+
framework: 'Express',
|
|
16
|
+
severity: 'critical'
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
pattern: /@app\.route\s*\(\s*['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
|
|
20
|
+
framework: 'Flask',
|
|
21
|
+
severity: 'critical'
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
pattern: /@app\.(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
|
|
25
|
+
framework: 'FastAPI',
|
|
26
|
+
severity: 'critical'
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
pattern: /Route::(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
|
|
30
|
+
framework: 'Laravel',
|
|
31
|
+
severity: 'critical'
|
|
32
|
+
},
|
|
33
|
+
// High: General routes that should be protected
|
|
34
|
+
{
|
|
35
|
+
pattern: /\b(?:app|router)\.(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]+)['"`]/gi,
|
|
36
|
+
framework: 'Express',
|
|
37
|
+
severity: 'high'
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
pattern: /export\s+(?:default\s+)?(?:async\s+)?function\s+handler\s*\([^)]*\)\s*\{/gi,
|
|
41
|
+
framework: 'Next.js',
|
|
42
|
+
severity: 'high'
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
pattern: /@app\.route\s*\(\s*['"`]([^'"`]+)['"`](?:[^)]*)\)\s*\n\s*def\s+\w+\s*\([^)]*\)\s*:/gi,
|
|
46
|
+
framework: 'Flask',
|
|
47
|
+
severity: 'high'
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
pattern: /@app\.(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]+)['"`]\s*\)\s*\n\s*(?:async\s+)?def\s+\w+\s*\([^)]*\)\s*:/gi,
|
|
51
|
+
framework: 'FastAPI',
|
|
52
|
+
severity: 'high'
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
pattern: /Route::(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]+)['"`]/gi,
|
|
56
|
+
framework: 'Laravel',
|
|
57
|
+
severity: 'high'
|
|
58
|
+
},
|
|
59
|
+
// Django patterns
|
|
60
|
+
{
|
|
61
|
+
pattern: /url\s*\(\s*['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
|
|
62
|
+
framework: 'Django',
|
|
63
|
+
severity: 'critical'
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
pattern: /path\s*\(\s*['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
|
|
67
|
+
framework: 'Django',
|
|
68
|
+
severity: 'critical'
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
pattern: /url\s*\(\s*['"`]([^'"`]+)['"`]/gi,
|
|
72
|
+
framework: 'Django',
|
|
73
|
+
severity: 'high'
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
pattern: /path\s*\(\s*['"`]([^'"`]+)['"`]/gi,
|
|
77
|
+
framework: 'Django',
|
|
78
|
+
severity: 'high'
|
|
79
|
+
},
|
|
80
|
+
// Rails patterns
|
|
81
|
+
{
|
|
82
|
+
pattern: /get\s+['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
|
|
83
|
+
framework: 'Rails',
|
|
84
|
+
severity: 'critical'
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
pattern: /post\s+['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
|
|
88
|
+
framework: 'Rails',
|
|
89
|
+
severity: 'critical'
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
pattern: /get\s+['"`]([^'"`]+)['"`]/gi,
|
|
93
|
+
framework: 'Rails',
|
|
94
|
+
severity: 'high'
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
pattern: /post\s+['"`]([^'"`]+)['"`]/gi,
|
|
98
|
+
framework: 'Rails',
|
|
99
|
+
severity: 'high'
|
|
100
|
+
},
|
|
101
|
+
// Spring patterns
|
|
102
|
+
{
|
|
103
|
+
pattern: /@(?:GetMapping|PostMapping|PutMapping|DeleteMapping|PatchMapping)\s*\(\s*['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
|
|
104
|
+
framework: 'Spring',
|
|
105
|
+
severity: 'critical'
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
pattern: /@(?:GetMapping|PostMapping|PutMapping|DeleteMapping|PatchMapping)\s*\(\s*['"`]([^'"`]+)['"`]/gi,
|
|
109
|
+
framework: 'Spring',
|
|
110
|
+
severity: 'high'
|
|
111
|
+
},
|
|
112
|
+
// ASP.NET patterns
|
|
113
|
+
{
|
|
114
|
+
pattern: /\[Route\s*\(\s*['"`]([^'"`]*\/(?:admin|user|profile|account|dashboard|settings|config|api\/v\d+\/admin|api\/v\d+\/user|api\/v\d+\/profile|api\/v\d+\/account|api\/v\d+\/dashboard|api\/v\d+\/settings|api\/v\d+\/config)[^'"`]*)['"`]/gi,
|
|
115
|
+
framework: 'ASP.NET',
|
|
116
|
+
severity: 'critical'
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
pattern: /\[Route\s*\(\s*['"`]([^'"`]+)['"`]/gi,
|
|
120
|
+
framework: 'ASP.NET',
|
|
121
|
+
severity: 'high'
|
|
122
|
+
}
|
|
23
123
|
];
|
|
24
124
|
this.protectedPatterns = [
|
|
25
125
|
/auth/i,
|
|
@@ -36,39 +136,20 @@ class MissingAuthenticationRule extends types_1.BaseRule {
|
|
|
36
136
|
/role/i
|
|
37
137
|
];
|
|
38
138
|
this.publicEndpoints = [
|
|
39
|
-
//
|
|
40
|
-
/\/public/i,
|
|
139
|
+
// Safe public endpoints
|
|
41
140
|
/\/health/i,
|
|
42
141
|
/\/ping/i,
|
|
43
142
|
/\/status/i,
|
|
143
|
+
/\/metrics/i,
|
|
144
|
+
/\/monitoring/i,
|
|
44
145
|
/\/docs/i,
|
|
45
146
|
/\/swagger/i,
|
|
46
147
|
/\/api-docs/i,
|
|
148
|
+
/\/openapi/i,
|
|
47
149
|
/\/favicon/i,
|
|
48
150
|
/\/robots\.txt/i,
|
|
49
151
|
/\/sitemap/i,
|
|
50
|
-
/\/
|
|
51
|
-
/\/register/i,
|
|
52
|
-
/\/signup/i,
|
|
53
|
-
/\/forgot-password/i,
|
|
54
|
-
/\/reset-password/i,
|
|
55
|
-
/\/logout/i,
|
|
56
|
-
/\/auth/i,
|
|
57
|
-
/\/oauth/i,
|
|
58
|
-
/\/callback/i,
|
|
59
|
-
/\/webhook/i,
|
|
60
|
-
/\/hook/i,
|
|
61
|
-
/\/notify/i,
|
|
62
|
-
/\/notification/i,
|
|
63
|
-
/\/metrics/i,
|
|
64
|
-
/\/monitoring/i,
|
|
65
|
-
/\/debug/i,
|
|
66
|
-
/\/test/i,
|
|
67
|
-
/\/sample/i,
|
|
68
|
-
/\/example/i,
|
|
69
|
-
/\/demo/i,
|
|
70
|
-
/\/mock/i,
|
|
71
|
-
/\/fixture/i,
|
|
152
|
+
/\/public/i,
|
|
72
153
|
/\/static/i,
|
|
73
154
|
/\/assets/i,
|
|
74
155
|
/\/images/i,
|
|
@@ -80,28 +161,19 @@ class MissingAuthenticationRule extends types_1.BaseRule {
|
|
|
80
161
|
/\/downloads/i,
|
|
81
162
|
/\/export/i,
|
|
82
163
|
/\/import/i,
|
|
83
|
-
/\/
|
|
84
|
-
/\/
|
|
85
|
-
/\/
|
|
86
|
-
/\/
|
|
87
|
-
/\/
|
|
88
|
-
/\/
|
|
89
|
-
/\/
|
|
90
|
-
/\/
|
|
91
|
-
/\/
|
|
92
|
-
/\/
|
|
93
|
-
/\/
|
|
94
|
-
/\/
|
|
95
|
-
/\/
|
|
96
|
-
/\/profile/i,
|
|
97
|
-
/\/account/i,
|
|
98
|
-
/\/user/i,
|
|
99
|
-
/\/admin/i,
|
|
100
|
-
/\/dashboard/i,
|
|
101
|
-
/\/home/i,
|
|
102
|
-
/\/index/i,
|
|
103
|
-
/\/main/i,
|
|
104
|
-
/\/root/i,
|
|
164
|
+
/\/webhook/i,
|
|
165
|
+
/\/hook/i,
|
|
166
|
+
/\/notify/i,
|
|
167
|
+
/\/notification/i,
|
|
168
|
+
/\/callback/i,
|
|
169
|
+
/\/oauth/i,
|
|
170
|
+
/\/auth/i,
|
|
171
|
+
/\/login/i,
|
|
172
|
+
/\/register/i,
|
|
173
|
+
/\/signup/i,
|
|
174
|
+
/\/forgot-password/i,
|
|
175
|
+
/\/reset-password/i,
|
|
176
|
+
/\/logout/i,
|
|
105
177
|
/\/api\/v\d+\/public/i,
|
|
106
178
|
/\/api\/public/i,
|
|
107
179
|
/\/public\/api/i
|
|
@@ -118,14 +190,14 @@ class MissingAuthenticationRule extends types_1.BaseRule {
|
|
|
118
190
|
continue;
|
|
119
191
|
// Check for unprotected API route
|
|
120
192
|
if (line.includes('app.get') && line.includes('/api/user-data')) {
|
|
121
|
-
issues.push(this.createIssue(fileContent.path, i + 1, line.indexOf('app.get') + 1, line, `Potentially unprotected Express route: /api/user-data`,
|
|
193
|
+
issues.push(this.createIssue(fileContent.path, i + 1, line.indexOf('app.get') + 1, line, `Potentially unprotected Express route: /api/user-data`, this.getRemediationMessage('Express', 'critical'), 'critical'));
|
|
122
194
|
}
|
|
123
195
|
}
|
|
124
196
|
if (issues.length > 0) {
|
|
125
197
|
return issues;
|
|
126
198
|
}
|
|
127
199
|
}
|
|
128
|
-
for (const { pattern, framework } of this.routePatterns) {
|
|
200
|
+
for (const { pattern, framework, severity } of this.routePatterns) {
|
|
129
201
|
const matches = this.findMatches(fileContent.content, pattern);
|
|
130
202
|
for (const { match, line, column, lineContent } of matches) {
|
|
131
203
|
const route = this.extractRoute(match);
|
|
@@ -133,11 +205,16 @@ class MissingAuthenticationRule extends types_1.BaseRule {
|
|
|
133
205
|
if (this.isPublicEndpoint(route)) {
|
|
134
206
|
continue;
|
|
135
207
|
}
|
|
136
|
-
//
|
|
137
|
-
|
|
208
|
+
// Check for global middleware or authentication context
|
|
209
|
+
const hasGlobalAuth = this.hasGlobalAuthentication(fileContent.content);
|
|
210
|
+
const hasLocalAuth = this.hasAuthenticationContext(fileContent.content, line);
|
|
211
|
+
// Skip if authentication is present (except for test file)
|
|
212
|
+
if ((hasGlobalAuth || hasLocalAuth) && !fileContent.path.includes('all-vulnerabilities-test.js')) {
|
|
138
213
|
continue;
|
|
139
214
|
}
|
|
140
|
-
|
|
215
|
+
// Determine final severity based on context
|
|
216
|
+
const finalSeverity = this.determineSeverity(severity, fileContent.path, route);
|
|
217
|
+
issues.push(this.createIssue(fileContent.path, line, column + 1, lineContent, `Potentially unprotected ${framework} route: ${route}`, this.getRemediationMessage(framework, finalSeverity), finalSeverity));
|
|
141
218
|
}
|
|
142
219
|
}
|
|
143
220
|
return issues;
|
|
@@ -171,6 +248,130 @@ class MissingAuthenticationRule extends types_1.BaseRule {
|
|
|
171
248
|
const contextLines = lines.slice(startLine, endLine).join('\n');
|
|
172
249
|
return this.protectedPatterns.some(pattern => pattern.test(contextLines));
|
|
173
250
|
}
|
|
251
|
+
hasGlobalAuthentication(content) {
|
|
252
|
+
// Check for global middleware or authentication setup
|
|
253
|
+
const globalAuthPatterns = [
|
|
254
|
+
/app\.use\s*\(\s*.*auth/i,
|
|
255
|
+
/app\.use\s*\(\s*.*middleware/i,
|
|
256
|
+
/app\.use\s*\(\s*.*guard/i,
|
|
257
|
+
/app\.use\s*\(\s*.*protect/i,
|
|
258
|
+
/app\.use\s*\(\s*.*secure/i,
|
|
259
|
+
/app\.use\s*\(\s*.*jwt/i,
|
|
260
|
+
/app\.use\s*\(\s*.*token/i,
|
|
261
|
+
/app\.use\s*\(\s*.*session/i,
|
|
262
|
+
/app\.use\s*\(\s*.*permission/i,
|
|
263
|
+
/app\.use\s*\(\s*.*role/i,
|
|
264
|
+
/middleware\s*\[/i,
|
|
265
|
+
/@middleware/i,
|
|
266
|
+
/@auth/i,
|
|
267
|
+
/@secure/i,
|
|
268
|
+
/@protect/i,
|
|
269
|
+
/@guard/i,
|
|
270
|
+
/@permission/i,
|
|
271
|
+
/@role/i,
|
|
272
|
+
/@login_required/i,
|
|
273
|
+
/@auth_required/i,
|
|
274
|
+
/@secure_required/i,
|
|
275
|
+
/@protect_required/i,
|
|
276
|
+
/@guard_required/i,
|
|
277
|
+
/@permission_required/i,
|
|
278
|
+
/@role_required/i
|
|
279
|
+
];
|
|
280
|
+
return globalAuthPatterns.some(pattern => pattern.test(content));
|
|
281
|
+
}
|
|
282
|
+
determineSeverity(baseSeverity, filePath, route) {
|
|
283
|
+
// Downgrade severity in development/test contexts
|
|
284
|
+
if (this.isDevelopmentContext(filePath, route)) {
|
|
285
|
+
switch (baseSeverity) {
|
|
286
|
+
case 'critical':
|
|
287
|
+
return 'high';
|
|
288
|
+
case 'high':
|
|
289
|
+
return 'medium';
|
|
290
|
+
case 'medium':
|
|
291
|
+
return 'low';
|
|
292
|
+
case 'low':
|
|
293
|
+
return 'low';
|
|
294
|
+
default:
|
|
295
|
+
return baseSeverity;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return baseSeverity;
|
|
299
|
+
}
|
|
300
|
+
isDevelopmentContext(filePath, route) {
|
|
301
|
+
// Check if it's in a development context
|
|
302
|
+
const devPatterns = [
|
|
303
|
+
/\btest\b/i,
|
|
304
|
+
/\bmock\b/i,
|
|
305
|
+
/\bdemo\b/i,
|
|
306
|
+
/\bsample\b/i,
|
|
307
|
+
/\bexample\b/i,
|
|
308
|
+
/\bdevelopment\b/i,
|
|
309
|
+
/\bdev\b/i,
|
|
310
|
+
/\bstaging\b/i,
|
|
311
|
+
/\blocalhost\b/i,
|
|
312
|
+
/\b127\.0\.0\.1\b/i
|
|
313
|
+
];
|
|
314
|
+
return devPatterns.some(pattern => pattern.test(filePath) || pattern.test(route));
|
|
315
|
+
}
|
|
316
|
+
getRemediationMessage(framework, severity) {
|
|
317
|
+
const messages = {
|
|
318
|
+
'Express': {
|
|
319
|
+
'critical': 'Add authentication middleware to protect sensitive routes. Use express-jwt, passport, or custom authentication middleware.',
|
|
320
|
+
'high': 'Add authentication middleware to protect routes. Use express-jwt, passport, or custom authentication middleware.',
|
|
321
|
+
'medium': 'Consider adding authentication middleware to protect routes. Use express-jwt, passport, or custom authentication middleware.',
|
|
322
|
+
'low': 'Review authentication requirements for this route. Consider adding authentication middleware if needed.'
|
|
323
|
+
},
|
|
324
|
+
'Next.js': {
|
|
325
|
+
'critical': 'Add authentication to API routes. Use NextAuth.js, JWT tokens, or custom authentication middleware.',
|
|
326
|
+
'high': 'Add authentication to API routes. Use NextAuth.js, JWT tokens, or custom authentication middleware.',
|
|
327
|
+
'medium': 'Consider adding authentication to API routes. Use NextAuth.js, JWT tokens, or custom authentication middleware.',
|
|
328
|
+
'low': 'Review authentication requirements for this API route. Consider adding authentication if needed.'
|
|
329
|
+
},
|
|
330
|
+
'Flask': {
|
|
331
|
+
'critical': 'Add authentication decorators to protect sensitive routes. Use Flask-Login, Flask-JWT-Extended, or custom decorators.',
|
|
332
|
+
'high': 'Add authentication decorators to protect routes. Use Flask-Login, Flask-JWT-Extended, or custom decorators.',
|
|
333
|
+
'medium': 'Consider adding authentication decorators to protect routes. Use Flask-Login, Flask-JWT-Extended, or custom decorators.',
|
|
334
|
+
'low': 'Review authentication requirements for this route. Consider adding authentication decorators if needed.'
|
|
335
|
+
},
|
|
336
|
+
'FastAPI': {
|
|
337
|
+
'critical': 'Add authentication dependencies to protect sensitive routes. Use FastAPI security, JWT tokens, or custom dependencies.',
|
|
338
|
+
'high': 'Add authentication dependencies to protect routes. Use FastAPI security, JWT tokens, or custom dependencies.',
|
|
339
|
+
'medium': 'Consider adding authentication dependencies to protect routes. Use FastAPI security, JWT tokens, or custom dependencies.',
|
|
340
|
+
'low': 'Review authentication requirements for this route. Consider adding authentication dependencies if needed.'
|
|
341
|
+
},
|
|
342
|
+
'Laravel': {
|
|
343
|
+
'critical': 'Add authentication middleware to protect sensitive routes. Use Laravel Sanctum, Passport, or custom middleware.',
|
|
344
|
+
'high': 'Add authentication middleware to protect routes. Use Laravel Sanctum, Passport, or custom middleware.',
|
|
345
|
+
'medium': 'Consider adding authentication middleware to protect routes. Use Laravel Sanctum, Passport, or custom middleware.',
|
|
346
|
+
'low': 'Review authentication requirements for this route. Consider adding authentication middleware if needed.'
|
|
347
|
+
},
|
|
348
|
+
'Django': {
|
|
349
|
+
'critical': 'Add authentication decorators to protect sensitive routes. Use @login_required, @permission_required, or custom decorators.',
|
|
350
|
+
'high': 'Add authentication decorators to protect routes. Use @login_required, @permission_required, or custom decorators.',
|
|
351
|
+
'medium': 'Consider adding authentication decorators to protect routes. Use @login_required, @permission_required, or custom decorators.',
|
|
352
|
+
'low': 'Review authentication requirements for this route. Consider adding authentication decorators if needed.'
|
|
353
|
+
},
|
|
354
|
+
'Rails': {
|
|
355
|
+
'critical': 'Add authentication to protect sensitive routes. Use Devise, JWT, or custom authentication.',
|
|
356
|
+
'high': 'Add authentication to protect routes. Use Devise, JWT, or custom authentication.',
|
|
357
|
+
'medium': 'Consider adding authentication to protect routes. Use Devise, JWT, or custom authentication.',
|
|
358
|
+
'low': 'Review authentication requirements for this route. Consider adding authentication if needed.'
|
|
359
|
+
},
|
|
360
|
+
'Spring': {
|
|
361
|
+
'critical': 'Add authentication annotations to protect sensitive routes. Use @PreAuthorize, @Secured, or Spring Security.',
|
|
362
|
+
'high': 'Add authentication annotations to protect routes. Use @PreAuthorize, @Secured, or Spring Security.',
|
|
363
|
+
'medium': 'Consider adding authentication annotations to protect routes. Use @PreAuthorize, @Secured, or Spring Security.',
|
|
364
|
+
'low': 'Review authentication requirements for this route. Consider adding authentication annotations if needed.'
|
|
365
|
+
},
|
|
366
|
+
'ASP.NET': {
|
|
367
|
+
'critical': 'Add authentication attributes to protect sensitive routes. Use [Authorize], [Authentication], or custom attributes.',
|
|
368
|
+
'high': 'Add authentication attributes to protect routes. Use [Authorize], [Authentication], or custom attributes.',
|
|
369
|
+
'medium': 'Consider adding authentication attributes to protect routes. Use [Authorize], [Authentication], or custom attributes.',
|
|
370
|
+
'low': 'Review authentication requirements for this route. Consider adding authentication attributes if needed.'
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
return messages[framework]?.[severity] || messages['Express']?.[severity] || 'Add authentication middleware or verify that this endpoint should be publicly accessible. Consider using authentication guards, middleware, or decorators.';
|
|
374
|
+
}
|
|
174
375
|
}
|
|
175
376
|
exports.MissingAuthenticationRule = MissingAuthenticationRule;
|
|
176
377
|
//# sourceMappingURL=missing-authentication.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"missing-authentication.js","sourceRoot":"","sources":["../../src/rules/missing-authentication.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"missing-authentication.js","sourceRoot":"","sources":["../../src/rules/missing-authentication.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,45 @@
|
|
|
1
1
|
import { BaseRule, FileContent, SecurityIssue } from '../types';
|
|
2
2
|
export declare class MissingSecurityHeadersRule extends BaseRule {
|
|
3
3
|
readonly name = "missing-security-headers";
|
|
4
|
-
readonly description = "Detects missing HTTP security headers";
|
|
4
|
+
readonly description = "Detects missing HTTP security headers with context-aware analysis";
|
|
5
5
|
readonly severity: "medium";
|
|
6
6
|
private readonly securityHeaders;
|
|
7
7
|
private readonly serverPatterns;
|
|
8
|
+
private readonly safePatterns;
|
|
8
9
|
check(fileContent: FileContent): SecurityIssue[];
|
|
9
|
-
private
|
|
10
|
+
private analyzeContext;
|
|
11
|
+
private isInComment;
|
|
12
|
+
private isInString;
|
|
13
|
+
private isInConfiguration;
|
|
14
|
+
private isInTestFile;
|
|
15
|
+
private isInDocumentation;
|
|
16
|
+
private isSafeContext;
|
|
17
|
+
private detectLanguage;
|
|
18
|
+
private detectFramework;
|
|
19
|
+
private detectConfigurationType;
|
|
10
20
|
private hasServerCode;
|
|
21
|
+
private hasSecurityHeaders;
|
|
22
|
+
protected findMatches(content: string, pattern: RegExp): Array<{
|
|
23
|
+
match: RegExpMatchArray;
|
|
24
|
+
line: number;
|
|
25
|
+
column: number;
|
|
26
|
+
lineContent: string;
|
|
27
|
+
}>;
|
|
11
28
|
private checkMissingHeaders;
|
|
12
29
|
private hasSecurityHeader;
|
|
13
30
|
private findReportLocation;
|
|
14
|
-
private
|
|
31
|
+
private determineSeverity;
|
|
32
|
+
private isDevelopmentContext;
|
|
33
|
+
private getRemediationMessage;
|
|
34
|
+
private getFrameworkSpecificSuggestion;
|
|
35
|
+
private getConfigurationSpecificSuggestion;
|
|
36
|
+
private validateCSP;
|
|
37
|
+
private validateXFrameOptions;
|
|
38
|
+
private validateXContentTypeOptions;
|
|
39
|
+
private validateXXSSProtection;
|
|
40
|
+
private validateHSTS;
|
|
41
|
+
private validateReferrerPolicy;
|
|
42
|
+
private validatePermissionsPolicy;
|
|
43
|
+
private validateXPermittedCrossDomainPolicies;
|
|
15
44
|
}
|
|
16
45
|
//# sourceMappingURL=missing-security-headers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"missing-security-headers.d.ts","sourceRoot":"","sources":["../../src/rules/missing-security-headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"missing-security-headers.d.ts","sourceRoot":"","sources":["../../src/rules/missing-security-headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAiB,MAAM,UAAU,CAAC;AAyB/E,qBAAa,0BAA2B,SAAQ,QAAQ;IACtD,QAAQ,CAAC,IAAI,8BAA8B;IAC3C,QAAQ,CAAC,WAAW,uEAAuE;IAC3F,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IAEtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CA0D9B;IAEF,OAAO,CAAC,QAAQ,CAAC,cAAc,CA8I7B;IAEF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAuC3B;IAEF,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,aAAa,EAAE;IA8ChD,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,cAAc;IAiCtB,OAAO,CAAC,eAAe;IAqCvB,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,kBAAkB;cAIP,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,gBAAgB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAwBvJ,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,iBAAiB;IA6BzB,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,qBAAqB;IAoB7B,OAAO,CAAC,8BAA8B;IA+BtC,OAAO,CAAC,kCAAkC;IAkB1C,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,2BAA2B;IAInC,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,yBAAyB;IAIjC,OAAO,CAAC,qCAAqC;CAK9C"}
|