@next-secure-check/rules 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 SetraTheXX
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,13 @@
1
+ # @next-secure-check/rules
2
+
3
+ Built-in deterministic security rules for `next-secure-check`.
4
+
5
+ This is an internal workspace package published for the `next-secure-check` CLI. Rules cover common Next.js security checks across secrets, injection, XSS, auth, config, headers, upload, and validation categories. Most users should install the CLI package instead:
6
+
7
+ ```bash
8
+ npx next-secure-check scan .
9
+ ```
10
+
11
+ See the main repository for rule documentation:
12
+
13
+ https://github.com/SetraTheXX/next-secure-check
@@ -0,0 +1,5 @@
1
+ import type { Rule } from "@next-secure-check/core";
2
+ export { builtInSecurityRules } from "./security-rules.js";
3
+ export declare const builtInRules: Rule[];
4
+ export declare function getBuiltInRules(): Rule[];
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAGpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,eAAO,MAAM,YAAY,EAAE,IAAI,EAAyB,CAAC;AAEzD,wBAAgB,eAAe,IAAI,IAAI,EAAE,CAExC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ import { builtInSecurityRules } from "./security-rules.js";
2
+ export { builtInSecurityRules } from "./security-rules.js";
3
+ export const builtInRules = builtInSecurityRules;
4
+ export function getBuiltInRules() {
5
+ return [...builtInRules];
6
+ }
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,CAAC,MAAM,YAAY,GAAW,oBAAoB,CAAC;AAEzD,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,YAAY,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Confidence, Finding, Rule, ScanContext, SourceFile } from "@next-secure-check/core";
2
+ export type FindingInput = {
3
+ rule: Pick<Rule, "id" | "title" | "severity" | "category"> & {
4
+ confidence?: Confidence;
5
+ };
6
+ file: Pick<SourceFile, "path" | "content" | "lines">;
7
+ line?: number;
8
+ column?: number;
9
+ evidence?: string;
10
+ description: string;
11
+ recommendation: string;
12
+ confidence?: Confidence;
13
+ references?: string[];
14
+ };
15
+ export declare function createFinding(input: FindingInput): Finding;
16
+ export declare function findMatches(file: SourceFile, pattern: RegExp): Array<{
17
+ line: number;
18
+ column: number;
19
+ evidence: string;
20
+ sourceLine: string;
21
+ }>;
22
+ export declare function hasDependency(context: ScanContext, packageNames: string[]): boolean;
23
+ export declare function projectContains(context: ScanContext, pattern: RegExp): boolean;
24
+ export declare function codeFiles(context: ScanContext): SourceFile[];
25
+ export declare function configFiles(context: ScanContext): SourceFile[];
26
+ //# sourceMappingURL=rule-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-utils.d.ts","sourceRoot":"","sources":["../src/rule-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAElG,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;IACzF,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAgB1D;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,MAAM,GACd,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB/E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAOnF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAK9E;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,EAAE,CAE5D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,EAAE,CAE9D"}
@@ -0,0 +1,58 @@
1
+ export function createFinding(input) {
2
+ return {
3
+ id: `${input.rule.id}:${input.file.path}:${input.line ?? 0}:${input.column ?? 0}`,
4
+ ruleId: input.rule.id,
5
+ title: input.rule.title,
6
+ severity: input.rule.severity,
7
+ confidence: input.confidence ?? input.rule.confidence ?? "MEDIUM",
8
+ category: input.rule.category,
9
+ filePath: input.file.path,
10
+ line: input.line,
11
+ column: input.column,
12
+ evidence: input.evidence,
13
+ description: input.description,
14
+ recommendation: input.recommendation,
15
+ references: input.references
16
+ };
17
+ }
18
+ export function findMatches(file, pattern) {
19
+ const matches = [];
20
+ const matcher = new RegExp(pattern.source, pattern.flags.includes("g") ? pattern.flags : `${pattern.flags}g`);
21
+ file.lines.forEach((lineContent, lineIndex) => {
22
+ matcher.lastIndex = 0;
23
+ let match;
24
+ while ((match = matcher.exec(lineContent)) !== null) {
25
+ matches.push({
26
+ line: lineIndex + 1,
27
+ column: match.index + 1,
28
+ evidence: lineContent.trim(),
29
+ sourceLine: lineContent
30
+ });
31
+ if (match[0].length === 0) {
32
+ matcher.lastIndex += 1;
33
+ }
34
+ }
35
+ });
36
+ pattern.lastIndex = 0;
37
+ return matches;
38
+ }
39
+ export function hasDependency(context, packageNames) {
40
+ const dependencies = {
41
+ ...(context.packageJson?.dependencies ?? {}),
42
+ ...(context.packageJson?.devDependencies ?? {})
43
+ };
44
+ return packageNames.some((packageName) => packageName in dependencies);
45
+ }
46
+ export function projectContains(context, pattern) {
47
+ return context.files.some((file) => {
48
+ pattern.lastIndex = 0;
49
+ return pattern.test(file.content);
50
+ });
51
+ }
52
+ export function codeFiles(context) {
53
+ return context.files.filter((file) => /\.(ts|tsx|js|jsx)$/.test(file.path));
54
+ }
55
+ export function configFiles(context) {
56
+ return context.files.filter((file) => /(^|\/)(next\.config\.(js|mjs|ts)|middleware\.(js|ts))$/.test(file.path));
57
+ }
58
+ //# sourceMappingURL=rule-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-utils.js","sourceRoot":"","sources":["../src/rule-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Rule } from "@next-secure-check/core";
2
+ export declare const envFileCommittedRule: Rule;
3
+ export declare const hardcodedSecretRule: Rule;
4
+ export declare const weakJwtSecretRule: Rule;
5
+ export declare const noEvalRule: Rule;
6
+ export declare const dangerouslySetInnerHtmlRule: Rule;
7
+ export declare const insecureCorsWildcardRule: Rule;
8
+ export declare const loginWithoutRateLimitRule: Rule;
9
+ export declare const registerWithoutRateLimitRule: Rule;
10
+ export declare const passwordWithoutHashingRule: Rule;
11
+ export declare const rawSqlConcatRule: Rule;
12
+ export declare const missingSecurityHeadersRule: Rule;
13
+ export declare const nextPublicSecretRule: Rule;
14
+ export declare const noNewFunctionRule: Rule;
15
+ export declare const commandExecRule: Rule;
16
+ export declare const missingFileTypeValidationRule: Rule;
17
+ export declare const missingFileSizeLimitRule: Rule;
18
+ export declare const apiRouteWithoutValidationRule: Rule;
19
+ export declare const adminRouteWithoutAuthRule: Rule;
20
+ export declare const productionBrowserSourceMapsRule: Rule;
21
+ export declare const nextPoweredByHeaderRule: Rule;
22
+ export declare const builtInSecurityRules: Rule[];
23
+ //# sourceMappingURL=security-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-rules.d.ts","sourceRoot":"","sources":["../src/security-rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAGpD,eAAO,MAAM,oBAAoB,EAAE,IAmBlC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,IAuDjC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,IAgC/B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,IAuBxB,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,IA2BzC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,IAuBtC,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,IAqBvC,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,IAsB1C,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,IAsBxC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,IAyB9B,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,IA+BxC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,IAyBlC,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,IAuB/B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,IA8B7B,CAAC;AAEF,eAAO,MAAM,6BAA6B,EAAE,IAyB3C,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,IAwBtC,CAAC;AAEF,eAAO,MAAM,6BAA6B,EAAE,IAyB3C,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,IAsBvC,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,IAyB7C,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,IAiCrC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,IAAI,EAqBtC,CAAC"}
@@ -0,0 +1,611 @@
1
+ import { codeFiles, configFiles, createFinding, findMatches, hasDependency, projectContains } from "./rule-utils.js";
2
+ export const envFileCommittedRule = {
3
+ id: "secrets/env-file-committed",
4
+ title: "Environment file committed",
5
+ severity: "HIGH",
6
+ category: "secrets",
7
+ confidence: "HIGH",
8
+ scan(context) {
9
+ return context.files
10
+ .filter((file) => isCommittedEnvFileName(file.path.split("/").at(-1) ?? ""))
11
+ .map((file) => createFinding({
12
+ rule: envFileCommittedRule,
13
+ file,
14
+ description: "Environment files may contain secrets and should not be committed.",
15
+ recommendation: "Remove committed environment files, rotate exposed secrets, and keep only .env.example templates in git.",
16
+ evidence: file.path
17
+ }));
18
+ }
19
+ };
20
+ export const hardcodedSecretRule = {
21
+ id: "secrets/hardcoded-secret",
22
+ title: "Possible hardcoded secret detected",
23
+ severity: "HIGH",
24
+ category: "secrets",
25
+ confidence: "MEDIUM",
26
+ scan(context) {
27
+ const findings = [];
28
+ const secretAssignmentPattern = /\b(api[_-]?key|secret|token|password|private[_-]?key|stripe[_-]?key|github[_-]?token|jwt[_-]?secret)\b\s*[:=]\s*["'`]([^"'`]{8,})["'`]/i;
29
+ const knownSecretPattern = /(sk_live_[A-Za-z0-9_]+|ghp_[A-Za-z0-9_]+|xox[baprs]-[A-Za-z0-9-]+)/i;
30
+ for (const file of codeFiles(context)) {
31
+ for (const match of findMatches(file, secretAssignmentPattern)) {
32
+ knownSecretPattern.lastIndex = 0;
33
+ if (knownSecretPattern.test(match.evidence)) {
34
+ continue;
35
+ }
36
+ const literalValue = extractAssignedStringLiteral(match.evidence);
37
+ if (literalValue && isLowSignalSecretSample(literalValue)) {
38
+ continue;
39
+ }
40
+ findings.push(createFinding({
41
+ rule: hardcodedSecretRule,
42
+ file,
43
+ line: match.line,
44
+ column: match.column,
45
+ evidence: match.evidence,
46
+ description: "A secret-like variable appears to contain a literal value.",
47
+ recommendation: "Move secrets to server-side environment variables and rotate any value that may have been exposed."
48
+ }));
49
+ }
50
+ for (const match of findMatches(file, knownSecretPattern)) {
51
+ findings.push(createFinding({
52
+ rule: hardcodedSecretRule,
53
+ file,
54
+ line: match.line,
55
+ column: match.column,
56
+ evidence: match.evidence,
57
+ description: "A string matches a known live secret token pattern.",
58
+ recommendation: "Remove the token from source control and rotate it immediately.",
59
+ confidence: "HIGH"
60
+ }));
61
+ }
62
+ }
63
+ return findings;
64
+ }
65
+ };
66
+ export const weakJwtSecretRule = {
67
+ id: "secrets/weak-jwt-secret",
68
+ title: "Weak JWT secret detected",
69
+ severity: "HIGH",
70
+ category: "secrets",
71
+ confidence: "HIGH",
72
+ scan(context) {
73
+ const findings = [];
74
+ const weakValues = new Set(["secret", "changeme", "change-me", "default", "password", "test", "dev", "development"]);
75
+ const pattern = /\bJWT_SECRET\b\s*[:=]\s*["'`]?([^"'`\s,;]{1,64})["'`]?/i;
76
+ for (const file of context.files) {
77
+ for (const match of findMatches(file, pattern)) {
78
+ const value = match.evidence.split(/[:=]/).at(-1)?.replace(/["'`,;]/g, "").trim().toLowerCase() ?? "";
79
+ if (value.length < 32 || weakValues.has(value)) {
80
+ findings.push(createFinding({
81
+ rule: weakJwtSecretRule,
82
+ file,
83
+ line: match.line,
84
+ column: match.column,
85
+ evidence: match.evidence,
86
+ description: "JWT secrets should be long, random, and unique per environment.",
87
+ recommendation: "Use a high-entropy secret of at least 32 bytes and rotate weak/default values."
88
+ }));
89
+ }
90
+ }
91
+ }
92
+ return findings;
93
+ }
94
+ };
95
+ export const noEvalRule = {
96
+ id: "injection/no-eval",
97
+ title: "eval() usage detected",
98
+ severity: "HIGH",
99
+ category: "injection",
100
+ confidence: "HIGH",
101
+ scan(context) {
102
+ return codeFiles(context).flatMap((file) => findMatches(file, /\beval\s*\(/)
103
+ .filter((match) => !isInsideQuotedLiteral(match.evidence, match.column))
104
+ .map((match) => createFinding({
105
+ rule: noEvalRule,
106
+ file,
107
+ line: match.line,
108
+ column: match.column,
109
+ evidence: match.evidence,
110
+ description: "eval() can execute untrusted code and may lead to code injection.",
111
+ recommendation: "Replace eval() with explicit parsing or a safe interpreter for the expected input."
112
+ })));
113
+ }
114
+ };
115
+ export const dangerouslySetInnerHtmlRule = {
116
+ id: "xss/dangerously-set-inner-html",
117
+ title: "dangerouslySetInnerHTML usage detected",
118
+ severity: "LOW",
119
+ category: "xss",
120
+ confidence: "HIGH",
121
+ scan(context) {
122
+ return codeFiles(context).flatMap((file) => findMatches(file, /dangerouslySetInnerHTML/)
123
+ .filter((match) => !isInsideQuotedLiteral(match.evidence, match.column))
124
+ .filter((match) => !isRegexLiteralLine(match.evidence))
125
+ .map((match) => createFinding({
126
+ rule: {
127
+ ...dangerouslySetInnerHtmlRule,
128
+ severity: getDangerouslySetInnerHtmlSeverity(match.sourceLine)
129
+ },
130
+ file,
131
+ line: match.line,
132
+ column: match.column,
133
+ evidence: match.evidence,
134
+ description: "Rendering raw HTML can introduce XSS if the content is user-controlled.",
135
+ recommendation: "Avoid raw HTML rendering or sanitize trusted markup with a proven sanitizer."
136
+ })));
137
+ }
138
+ };
139
+ export const insecureCorsWildcardRule = {
140
+ id: "config/insecure-cors-wildcard",
141
+ title: "Wildcard CORS origin detected",
142
+ severity: "MEDIUM",
143
+ category: "config",
144
+ confidence: "HIGH",
145
+ scan(context) {
146
+ const pattern = /(Access-Control-Allow-Origin["']?\s*[:,]\s*["']\*["']|origin\s*:\s*["']\*["'])/i;
147
+ return codeFiles(context).flatMap((file) => findMatches(file, pattern).map((match) => createFinding({
148
+ rule: insecureCorsWildcardRule,
149
+ file,
150
+ line: match.line,
151
+ column: match.column,
152
+ evidence: match.evidence,
153
+ description: "Wildcard CORS allows any origin to access the endpoint.",
154
+ recommendation: "Restrict CORS origins to trusted domains and avoid credentials with wildcard origins."
155
+ })));
156
+ }
157
+ };
158
+ export const loginWithoutRateLimitRule = {
159
+ id: "auth/login-without-rate-limit",
160
+ title: "Login endpoint may be missing rate limiting",
161
+ severity: "HIGH",
162
+ category: "auth",
163
+ confidence: "MEDIUM",
164
+ scan(context) {
165
+ const rateLimitPattern = /(rateLimit|rate-limit|ratelimit|limiter|upstash|slowDown|throttle)/i;
166
+ return codeFiles(context)
167
+ .filter((file) => /(login|signin|sign-in|auth)/i.test(file.path))
168
+ .filter((file) => !rateLimitPattern.test(file.content) && !projectContains(context, rateLimitPattern))
169
+ .map((file) => createFinding({
170
+ rule: loginWithoutRateLimitRule,
171
+ file,
172
+ description: "Authentication endpoints are common brute-force targets and should be rate limited.",
173
+ recommendation: "Add per-IP and per-account rate limiting to login/auth endpoints."
174
+ }));
175
+ }
176
+ };
177
+ export const registerWithoutRateLimitRule = {
178
+ id: "auth/register-without-rate-limit",
179
+ title: "Register endpoint may be missing rate limiting",
180
+ severity: "HIGH",
181
+ category: "auth",
182
+ confidence: "MEDIUM",
183
+ scan(context) {
184
+ const rateLimitPattern = /(rateLimit|rate-limit|ratelimit|limiter|upstash|slowDown|throttle)/i;
185
+ return codeFiles(context)
186
+ .filter((file) => /(register|signup|sign-up|create-account)/i.test(file.path))
187
+ .filter((file) => !rateLimitPattern.test(file.content) && !projectContains(context, rateLimitPattern))
188
+ .map((file) => createFinding({
189
+ rule: registerWithoutRateLimitRule,
190
+ file,
191
+ description: "Registration endpoints can be abused for spam accounts, brute force, or resource exhaustion and should be rate limited.",
192
+ recommendation: "Add per-IP and abuse-aware rate limiting to registration/signup endpoints."
193
+ }));
194
+ }
195
+ };
196
+ export const passwordWithoutHashingRule = {
197
+ id: "auth/password-without-hashing-library",
198
+ title: "Password handling without bcrypt or argon2 detected",
199
+ severity: "MEDIUM",
200
+ category: "auth",
201
+ confidence: "MEDIUM",
202
+ scan(context) {
203
+ if (hasDependency(context, ["bcrypt", "bcryptjs", "argon2"])) {
204
+ return [];
205
+ }
206
+ return codeFiles(context)
207
+ .filter((file) => hasPasswordHandlingContext(file.path, file.content))
208
+ .map((file) => createFinding({
209
+ rule: passwordWithoutHashingRule,
210
+ file,
211
+ description: "Password-related code exists, but bcrypt/argon2 dependency usage was not detected.",
212
+ recommendation: "Hash passwords with argon2 or bcrypt and avoid storing or comparing plaintext passwords."
213
+ }));
214
+ }
215
+ };
216
+ export const rawSqlConcatRule = {
217
+ id: "injection/raw-sql-concat",
218
+ title: "Possible raw SQL string interpolation detected",
219
+ severity: "HIGH",
220
+ category: "injection",
221
+ confidence: "MEDIUM",
222
+ scan(context) {
223
+ const pattern = /`[^`]*(SELECT|INSERT|UPDATE|DELETE)[^`]*\$\{[^}]+}[^`]*`|["'][^"']*(SELECT|INSERT|UPDATE|DELETE)[^"']*["']\s*\+/i;
224
+ return codeFiles(context).flatMap((file) => findMatches(file, pattern)
225
+ .filter((match) => !isLowRiskSqlStringContext(match.sourceLine, match.column))
226
+ .map((match) => createFinding({
227
+ rule: rawSqlConcatRule,
228
+ file,
229
+ line: match.line,
230
+ column: match.column,
231
+ evidence: match.evidence,
232
+ description: "SQL built with string interpolation or concatenation can lead to SQL injection.",
233
+ recommendation: "Use parameterized queries, prepared statements, or a safe ORM query builder."
234
+ })));
235
+ }
236
+ };
237
+ export const missingSecurityHeadersRule = {
238
+ id: "headers/missing-security-headers",
239
+ title: "Security headers were not detected",
240
+ severity: "LOW",
241
+ category: "headers",
242
+ confidence: "LOW",
243
+ scan(context) {
244
+ if (context.project.framework !== "nextjs") {
245
+ return [];
246
+ }
247
+ const configuredHeaders = getConfiguredSecurityHeaders(configFiles(context).map((file) => file.content).join("\n"));
248
+ if (configuredHeaders.missing.length === 0) {
249
+ return [];
250
+ }
251
+ const anchorFile = context.files.find((file) => file.path === "package.json") ?? context.files[0];
252
+ if (!anchorFile) {
253
+ return [];
254
+ }
255
+ return [
256
+ createFinding({
257
+ rule: missingSecurityHeadersRule,
258
+ file: anchorFile,
259
+ description: `Missing common security header configuration: ${configuredHeaders.missing.join(", ")}.`,
260
+ recommendation: "Configure Content-Security-Policy, frame protection, X-Content-Type-Options, Referrer-Policy, and Permissions-Policy."
261
+ })
262
+ ];
263
+ }
264
+ };
265
+ export const nextPublicSecretRule = {
266
+ id: "secrets/next-public-secret",
267
+ title: "NEXT_PUBLIC secret-like variable detected",
268
+ severity: "HIGH",
269
+ category: "secrets",
270
+ confidence: "MEDIUM",
271
+ scan(context) {
272
+ const pattern = /NEXT_PUBLIC_(?:[A-Z0-9_]*)(?:SECRET|TOKEN|PASSWORD|PRIVATE_KEY|API_KEY|JWT|STRIPE_SECRET)(?:[A-Z0-9_]*)\s*[:=]/i;
273
+ return context.files.flatMap((file) => findMatches(file, pattern).map((match) => createFinding({
274
+ rule: nextPublicSecretRule,
275
+ file,
276
+ line: match.line,
277
+ column: match.column,
278
+ evidence: match.evidence,
279
+ description: "NEXT_PUBLIC environment variables may be exposed to the browser in Next.js. Secret-like names should not use the NEXT_PUBLIC prefix.",
280
+ recommendation: "Move secret values to server-only environment variables and remove the NEXT_PUBLIC prefix unless the value is intentionally public."
281
+ })));
282
+ }
283
+ };
284
+ export const noNewFunctionRule = {
285
+ id: "injection/no-new-function",
286
+ title: "new Function() usage detected",
287
+ severity: "HIGH",
288
+ category: "injection",
289
+ confidence: "HIGH",
290
+ scan(context) {
291
+ return codeFiles(context).flatMap((file) => findMatches(file, /\bnew\s+Function\s*\(/)
292
+ .filter((match) => !isInsideQuotedLiteral(match.evidence, match.column))
293
+ .map((match) => createFinding({
294
+ rule: noNewFunctionRule,
295
+ file,
296
+ line: match.line,
297
+ column: match.column,
298
+ evidence: match.evidence,
299
+ description: "new Function() can execute dynamically generated code and may lead to code injection if input is untrusted.",
300
+ recommendation: "Avoid dynamic code execution. Replace new Function() with explicit logic or a safe parser for the expected input."
301
+ })));
302
+ }
303
+ };
304
+ export const commandExecRule = {
305
+ id: "injection/command-exec",
306
+ title: "Shell command execution detected",
307
+ severity: "HIGH",
308
+ category: "injection",
309
+ confidence: "MEDIUM",
310
+ scan(context) {
311
+ const commandCallPattern = /\b(exec|execSync|spawn|spawnSync)\s*\(/;
312
+ const childProcessImportPattern = /\bfrom\s+["'](?:node:)?child_process["']|require\(\s*["'](?:node:)?child_process["']\s*\)/;
313
+ return codeFiles(context).flatMap((file) => [
314
+ ...findMatches(file, commandCallPattern)
315
+ .filter((match) => !isMethodCall(match.sourceLine, match.column))
316
+ .filter((match) => !isInsideQuotedLiteral(match.sourceLine, match.column)),
317
+ ...findMatches(file, childProcessImportPattern)
318
+ ].map((match) => createFinding({
319
+ rule: commandExecRule,
320
+ file,
321
+ line: match.line,
322
+ column: match.column,
323
+ evidence: match.evidence,
324
+ description: "Shell command execution can lead to command injection if user input reaches the command or arguments.",
325
+ recommendation: "Avoid shell execution for user-controlled input. Use safe APIs, strict allowlists, and argument arrays when command execution is required."
326
+ })));
327
+ }
328
+ };
329
+ export const missingFileTypeValidationRule = {
330
+ id: "upload/missing-file-type-validation",
331
+ title: "Upload endpoint may be missing file type validation",
332
+ severity: "MEDIUM",
333
+ category: "upload",
334
+ confidence: "MEDIUM",
335
+ scan(context) {
336
+ const pathSignals = /\b(upload|avatar|media|file|image)\b/i;
337
+ const contentSignals = /\b(formData|File|Blob|multer|formidable|busboy)\b/i;
338
+ const validationSignals = /\b(mimetype|fileType|allowedTypes|allowedMimeTypes)\b|\.type\b|\.mime\b|content-type|includes\(|startsWith\(["']image\//i;
339
+ return codeFiles(context)
340
+ .filter((file) => pathSignals.test(file.path) && contentSignals.test(file.content))
341
+ .filter((file) => !validationSignals.test(file.content))
342
+ .map((file) => createFinding({
343
+ rule: missingFileTypeValidationRule,
344
+ file,
345
+ description: "Upload endpoints should validate file types before accepting user-controlled files.",
346
+ recommendation: "Validate MIME type and file extension with an allowlist before storing or processing uploaded files."
347
+ }));
348
+ }
349
+ };
350
+ export const missingFileSizeLimitRule = {
351
+ id: "upload/missing-file-size-limit",
352
+ title: "Upload endpoint may be missing file size limit",
353
+ severity: "MEDIUM",
354
+ category: "upload",
355
+ confidence: "MEDIUM",
356
+ scan(context) {
357
+ const pathSignals = /\b(upload|avatar|media|file|image)\b/i;
358
+ const contentSignals = /\b(formData|File|Blob|multer|formidable|busboy)\b/i;
359
+ const sizeLimitSignals = /\b(maxSize|maxFileSize|fileSize|MAX_FILE_SIZE)\b|limit\s*[:=]|\.limit\b|\.size\s*[><=]/i;
360
+ return codeFiles(context)
361
+ .filter((file) => pathSignals.test(file.path) && contentSignals.test(file.content))
362
+ .filter((file) => !sizeLimitSignals.test(file.content))
363
+ .map((file) => createFinding({
364
+ rule: missingFileSizeLimitRule,
365
+ file,
366
+ description: "Upload endpoints should enforce file size limits to reduce abuse and resource exhaustion risk.",
367
+ recommendation: "Add a strict maximum file size and reject files that exceed it before storage or further processing."
368
+ }));
369
+ }
370
+ };
371
+ export const apiRouteWithoutValidationRule = {
372
+ id: "validation/api-route-without-validation",
373
+ title: "API route may be missing input validation",
374
+ severity: "MEDIUM",
375
+ category: "validation",
376
+ confidence: "MEDIUM",
377
+ scan(context) {
378
+ const pathSignals = /\b(app\/api|pages\/api)\b/i;
379
+ const contentSignals = /(\breq\.body\b|\breq\.query\b|\breq\.json\(|request\.json\(|request\.formData\(|searchParams|nextUrl\.searchParams)/i;
380
+ const validationSignals = /\b(zod|yup|joi|safeParse|parse\(|validate|validator|schema)\b|typeof\s+[\w.]+\s*[!=]={1,2}\s*["'](?:string|number|boolean|object)["']|Array\.isArray\(/i;
381
+ return codeFiles(context)
382
+ .filter((file) => pathSignals.test(file.path))
383
+ .filter((file) => contentSignals.test(file.content))
384
+ .filter((file) => !validationSignals.test(file.content))
385
+ .map((file) => createFinding({
386
+ rule: apiRouteWithoutValidationRule,
387
+ file,
388
+ description: "API routes that consume user input should validate the input before using it.",
389
+ recommendation: "Add input validation with a schema library such as Zod, Yup, Joi, or a clear custom validation layer."
390
+ }));
391
+ }
392
+ };
393
+ export const adminRouteWithoutAuthRule = {
394
+ id: "auth/admin-route-without-auth",
395
+ title: "Admin route may be missing auth protection",
396
+ severity: "HIGH",
397
+ category: "auth",
398
+ confidence: "MEDIUM",
399
+ scan(context) {
400
+ const pathSignals = /\b(admin|dashboard|manage)\b/i;
401
+ const authSignals = /\b(auth\(|getServerSession|currentUser|clerk|requireAuth|middleware|session|jwt\.verify|verifyToken|isAdmin|role)\b/i;
402
+ return codeFiles(context)
403
+ .filter((file) => pathSignals.test(file.path))
404
+ .filter((file) => !authSignals.test(file.content))
405
+ .map((file) => createFinding({
406
+ rule: adminRouteWithoutAuthRule,
407
+ file,
408
+ description: "Admin routes should include authentication and authorization checks.",
409
+ recommendation: "Protect admin routes with authentication and role/permission checks before returning sensitive data."
410
+ }));
411
+ }
412
+ };
413
+ export const productionBrowserSourceMapsRule = {
414
+ id: "config/production-browser-source-maps",
415
+ title: "Production browser source maps may be enabled",
416
+ severity: "LOW",
417
+ category: "config",
418
+ confidence: "HIGH",
419
+ scan(context) {
420
+ const nextConfigFiles = configFiles(context).filter((file) => /next\.config\.(js|mjs|cjs|ts)$/.test(file.path));
421
+ const findings = [];
422
+ for (const file of nextConfigFiles) {
423
+ if (/productionBrowserSourceMaps\s*[:=]\s*true/i.test(file.content)) {
424
+ findings.push(createFinding({
425
+ rule: productionBrowserSourceMapsRule,
426
+ file,
427
+ description: "Production browser source maps can expose source code structure and make client-side code easier to inspect.",
428
+ recommendation: "Disable productionBrowserSourceMaps unless you intentionally need public production source maps."
429
+ }));
430
+ }
431
+ }
432
+ return findings;
433
+ }
434
+ };
435
+ export const nextPoweredByHeaderRule = {
436
+ id: "config/next-powered-by-header",
437
+ title: "X-Powered-By header may be enabled",
438
+ severity: "INFO",
439
+ category: "config",
440
+ confidence: "MEDIUM",
441
+ scan(context) {
442
+ if (context.project.framework !== "nextjs") {
443
+ return [];
444
+ }
445
+ const nextConfigFiles = configFiles(context).filter((file) => /next\.config\.(js|mjs|cjs|ts)$/.test(file.path));
446
+ if (nextConfigFiles.length === 0) {
447
+ return [];
448
+ }
449
+ const findings = [];
450
+ for (const file of nextConfigFiles) {
451
+ if (!/poweredByHeader\s*:\s*false/i.test(file.content)) {
452
+ findings.push(createFinding({
453
+ rule: nextPoweredByHeaderRule,
454
+ file,
455
+ description: "The default X-Powered-By header can reveal framework information. Hiding it is a small hardening step.",
456
+ recommendation: "Set poweredByHeader: false in next.config.js to reduce framework fingerprinting."
457
+ }));
458
+ }
459
+ }
460
+ return findings;
461
+ }
462
+ };
463
+ export const builtInSecurityRules = [
464
+ envFileCommittedRule,
465
+ hardcodedSecretRule,
466
+ weakJwtSecretRule,
467
+ noEvalRule,
468
+ noNewFunctionRule,
469
+ commandExecRule,
470
+ dangerouslySetInnerHtmlRule,
471
+ insecureCorsWildcardRule,
472
+ loginWithoutRateLimitRule,
473
+ passwordWithoutHashingRule,
474
+ rawSqlConcatRule,
475
+ missingSecurityHeadersRule,
476
+ nextPublicSecretRule,
477
+ registerWithoutRateLimitRule,
478
+ missingFileTypeValidationRule,
479
+ missingFileSizeLimitRule,
480
+ apiRouteWithoutValidationRule,
481
+ adminRouteWithoutAuthRule,
482
+ productionBrowserSourceMapsRule,
483
+ nextPoweredByHeaderRule
484
+ ];
485
+ function isInsideQuotedLiteral(line, column) {
486
+ const beforeMatch = line.slice(0, Math.max(0, column - 1));
487
+ let quote;
488
+ let escaped = false;
489
+ for (const char of beforeMatch) {
490
+ if (escaped) {
491
+ escaped = false;
492
+ continue;
493
+ }
494
+ if (char === "\\") {
495
+ escaped = true;
496
+ continue;
497
+ }
498
+ if (quote) {
499
+ if (char === quote) {
500
+ quote = undefined;
501
+ }
502
+ continue;
503
+ }
504
+ if (char === "'" || char === "\"" || char === "`") {
505
+ quote = char;
506
+ }
507
+ }
508
+ return quote !== undefined;
509
+ }
510
+ function isMethodCall(line, column) {
511
+ const beforeMatch = line.slice(0, Math.max(0, column - 1));
512
+ return /\.\s*$/.test(beforeMatch);
513
+ }
514
+ function isRegexLiteralLine(line) {
515
+ return /\/[^/\n]*dangerouslySetInnerHTML[^/\n]*\/[a-z]*/.test(line);
516
+ }
517
+ function getDangerouslySetInnerHtmlSeverity(line) {
518
+ const htmlValue = /__html\s*:\s*([^}\n]+)/.exec(line)?.[1]?.trim();
519
+ if (!htmlValue) {
520
+ return "LOW";
521
+ }
522
+ if (isStaticHtmlLiteral(htmlValue)) {
523
+ return "LOW";
524
+ }
525
+ if (/(userInput|html|content|body|params|searchParams|query|req|request|props|children|markdown)/i.test(htmlValue)) {
526
+ return "MEDIUM";
527
+ }
528
+ return "LOW";
529
+ }
530
+ function isStaticHtmlLiteral(value) {
531
+ const trimmed = value.replace(/[,;]+$/, "").trim();
532
+ if (/^["'][\s\S]*["']$/.test(trimmed)) {
533
+ return true;
534
+ }
535
+ return /^`[\s\S]*`$/.test(trimmed) && !trimmed.includes("${");
536
+ }
537
+ function isLowRiskSqlStringContext(line, column) {
538
+ const beforeMatch = line.slice(0, Math.max(0, column - 1));
539
+ return /(?:^|[^\w$.])(?:console\.(?:log|debug|info|warn|error)|logger\.(?:debug|info)|throw\s+new\s+Error)\s*\(\s*$/.test(beforeMatch);
540
+ }
541
+ function isCommittedEnvFileName(fileName) {
542
+ return /^\.env(?:\.(?:local|production|production\.local|development|development\.local|test|test\.local|staging|staging\.local))?$/.test(fileName);
543
+ }
544
+ function getConfiguredSecurityHeaders(content) {
545
+ const requiredHeaders = [
546
+ {
547
+ name: "Content-Security-Policy",
548
+ detected: /Content-Security-Policy/i.test(content)
549
+ },
550
+ {
551
+ name: "frame protection",
552
+ detected: /X-Frame-Options/i.test(content) || /frame-ancestors/i.test(content)
553
+ },
554
+ {
555
+ name: "X-Content-Type-Options",
556
+ detected: /X-Content-Type-Options/i.test(content)
557
+ },
558
+ {
559
+ name: "Referrer-Policy",
560
+ detected: /Referrer-Policy/i.test(content)
561
+ },
562
+ {
563
+ name: "Permissions-Policy",
564
+ detected: /Permissions-Policy/i.test(content)
565
+ }
566
+ ];
567
+ return {
568
+ missing: requiredHeaders.filter((header) => !header.detected).map((header) => header.name)
569
+ };
570
+ }
571
+ function extractAssignedStringLiteral(line) {
572
+ const match = /[:=]\s*["'`]([^"'`]*)["'`]/.exec(line);
573
+ return match?.[1];
574
+ }
575
+ function isLowSignalSecretSample(value) {
576
+ const normalized = value.trim().toLowerCase();
577
+ const sampleWords = ["password", "changeme", "change-me", "example", "demo", "dummy", "placeholder", "test"];
578
+ if (sampleWords.includes(normalized)) {
579
+ return true;
580
+ }
581
+ if (/^(?:test|demo|dummy|example|placeholder)[-_]?\d*$/i.test(normalized)) {
582
+ return true;
583
+ }
584
+ if (/^\d+$/.test(normalized)) {
585
+ return true;
586
+ }
587
+ if (normalized.length < 16 && countCharacterClasses(normalized) <= 2) {
588
+ return true;
589
+ }
590
+ return false;
591
+ }
592
+ function countCharacterClasses(value) {
593
+ return [
594
+ /[a-z]/.test(value),
595
+ /[A-Z]/.test(value),
596
+ /\d/.test(value),
597
+ /[^A-Za-z0-9]/.test(value)
598
+ ].filter(Boolean).length;
599
+ }
600
+ function hasPasswordHandlingContext(filePath, content) {
601
+ if (!/\bpassword\b/i.test(content)) {
602
+ return false;
603
+ }
604
+ const pathSignals = /\b(login|signin|sign-in|register|signup|sign-up|auth|account|user|credentials?)\b/i;
605
+ if (pathSignals.test(filePath)) {
606
+ return true;
607
+ }
608
+ const contentSignals = /(\b(body|req\.body|credentials?|user|account)\.password\b|\bpassword\b\s*[:=]\s*(body|req|credentials?|user|account)\b)/i;
609
+ return contentSignals.test(content);
610
+ }
611
+ //# sourceMappingURL=security-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-rules.js","sourceRoot":"","sources":["../src/security-rules.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@next-secure-check/rules",
3
+ "version": "0.1.0",
4
+ "description": "Security rules for next-secure-check",
5
+ "keywords": [
6
+ "nextjs",
7
+ "security",
8
+ "scanner",
9
+ "static-analysis",
10
+ "sast"
11
+ ],
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/SetraTheXX/next-secure-check.git"
15
+ },
16
+ "license": "MIT",
17
+ "type": "module",
18
+ "engines": {
19
+ "node": ">=18.0.0"
20
+ },
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "main": "./dist/index.js",
25
+ "types": "./dist/index.d.ts",
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "import": "./dist/index.js"
33
+ }
34
+ },
35
+ "dependencies": {
36
+ "@next-secure-check/core": "0.1.0"
37
+ },
38
+ "scripts": {
39
+ "build": "tsc -p tsconfig.json",
40
+ "typecheck": "tsc -p tsconfig.json --noEmit",
41
+ "clean": "node -e \"fs.rmSync('dist',{recursive:true,force:true});fs.rmSync('.tsbuildinfo',{force:true})\""
42
+ }
43
+ }