@fourteensystems/prodcheck 0.3.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 +252 -0
- package/bin/prodcheck.mjs +2 -0
- package/dist/cli/commands/baseline.d.ts +7 -0
- package/dist/cli/commands/baseline.d.ts.map +1 -0
- package/dist/cli/commands/baseline.js +22 -0
- package/dist/cli/commands/baseline.js.map +1 -0
- package/dist/cli/commands/ci.d.ts +14 -0
- package/dist/cli/commands/ci.d.ts.map +1 -0
- package/dist/cli/commands/ci.js +104 -0
- package/dist/cli/commands/ci.js.map +1 -0
- package/dist/cli/commands/explain.d.ts +2 -0
- package/dist/cli/commands/explain.d.ts.map +1 -0
- package/dist/cli/commands/explain.js +20 -0
- package/dist/cli/commands/explain.js.map +1 -0
- package/dist/cli/commands/init.d.ts +7 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +127 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/rules.d.ts +2 -0
- package/dist/cli/commands/rules.d.ts.map +1 -0
- package/dist/cli/commands/rules.js +13 -0
- package/dist/cli/commands/rules.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +10 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +65 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/waive.d.ts +8 -0
- package/dist/cli/commands/waive.d.ts.map +1 -0
- package/dist/cli/commands/waive.js +34 -0
- package/dist/cli/commands/waive.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +64 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/engine/baseline.d.ts +11 -0
- package/dist/engine/baseline.d.ts.map +1 -0
- package/dist/engine/baseline.js +39 -0
- package/dist/engine/baseline.js.map +1 -0
- package/dist/engine/baseline.test.d.ts +2 -0
- package/dist/engine/baseline.test.d.ts.map +1 -0
- package/dist/engine/baseline.test.js +135 -0
- package/dist/engine/baseline.test.js.map +1 -0
- package/dist/engine/config.d.ts +8 -0
- package/dist/engine/config.d.ts.map +1 -0
- package/dist/engine/config.js +134 -0
- package/dist/engine/config.js.map +1 -0
- package/dist/engine/config.test.d.ts +2 -0
- package/dist/engine/config.test.d.ts.map +1 -0
- package/dist/engine/config.test.js +107 -0
- package/dist/engine/config.test.js.map +1 -0
- package/dist/engine/extensions/load.d.ts +11 -0
- package/dist/engine/extensions/load.d.ts.map +1 -0
- package/dist/engine/extensions/load.js +26 -0
- package/dist/engine/extensions/load.js.map +1 -0
- package/dist/engine/extensions/registry.d.ts +5 -0
- package/dist/engine/extensions/registry.d.ts.map +1 -0
- package/dist/engine/extensions/registry.js +11 -0
- package/dist/engine/extensions/registry.js.map +1 -0
- package/dist/engine/extensions/types.d.ts +51 -0
- package/dist/engine/extensions/types.d.ts.map +1 -0
- package/dist/engine/extensions/types.js +2 -0
- package/dist/engine/extensions/types.js.map +1 -0
- package/dist/engine/license.d.ts +40 -0
- package/dist/engine/license.d.ts.map +1 -0
- package/dist/engine/license.js +104 -0
- package/dist/engine/license.js.map +1 -0
- package/dist/engine/report.d.ts +5 -0
- package/dist/engine/report.d.ts.map +1 -0
- package/dist/engine/report.js +115 -0
- package/dist/engine/report.js.map +1 -0
- package/dist/engine/run.d.ts +11 -0
- package/dist/engine/run.d.ts.map +1 -0
- package/dist/engine/run.js +105 -0
- package/dist/engine/run.js.map +1 -0
- package/dist/engine/sarif.d.ts +3 -0
- package/dist/engine/sarif.d.ts.map +1 -0
- package/dist/engine/sarif.js +58 -0
- package/dist/engine/sarif.js.map +1 -0
- package/dist/engine/sarif.test.d.ts +2 -0
- package/dist/engine/sarif.test.d.ts.map +1 -0
- package/dist/engine/sarif.test.js +152 -0
- package/dist/engine/sarif.test.js.map +1 -0
- package/dist/engine/score.d.ts +13 -0
- package/dist/engine/score.d.ts.map +1 -0
- package/dist/engine/score.js +116 -0
- package/dist/engine/score.js.map +1 -0
- package/dist/engine/score.test.d.ts +2 -0
- package/dist/engine/score.test.d.ts.map +1 -0
- package/dist/engine/score.test.js +227 -0
- package/dist/engine/score.test.js.map +1 -0
- package/dist/engine/types.d.ts +123 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +2 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/engine/version.d.ts +5 -0
- package/dist/engine/version.d.ts.map +1 -0
- package/dist/engine/version.js +15 -0
- package/dist/engine/version.js.map +1 -0
- package/dist/engine/waivers.d.ts +9 -0
- package/dist/engine/waivers.d.ts.map +1 -0
- package/dist/engine/waivers.js +55 -0
- package/dist/engine/waivers.js.map +1 -0
- package/dist/engine/waivers.test.d.ts +2 -0
- package/dist/engine/waivers.test.d.ts.map +1 -0
- package/dist/engine/waivers.test.js +147 -0
- package/dist/engine/waivers.test.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/next/deps.d.ts +4 -0
- package/dist/next/deps.d.ts.map +1 -0
- package/dist/next/deps.js +118 -0
- package/dist/next/deps.js.map +1 -0
- package/dist/next/deps.test.d.ts +2 -0
- package/dist/next/deps.test.d.ts.map +1 -0
- package/dist/next/deps.test.js +249 -0
- package/dist/next/deps.test.js.map +1 -0
- package/dist/next/detect.d.ts +10 -0
- package/dist/next/detect.d.ts.map +1 -0
- package/dist/next/detect.js +57 -0
- package/dist/next/detect.js.map +1 -0
- package/dist/next/detect.test.d.ts +2 -0
- package/dist/next/detect.test.d.ts.map +1 -0
- package/dist/next/detect.test.js +74 -0
- package/dist/next/detect.test.js.map +1 -0
- package/dist/next/index.d.ts +5 -0
- package/dist/next/index.d.ts.map +1 -0
- package/dist/next/index.js +59 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/middleware.d.ts +3 -0
- package/dist/next/middleware.d.ts.map +1 -0
- package/dist/next/middleware.js +48 -0
- package/dist/next/middleware.js.map +1 -0
- package/dist/next/middleware.test.d.ts +2 -0
- package/dist/next/middleware.test.d.ts.map +1 -0
- package/dist/next/middleware.test.js +203 -0
- package/dist/next/middleware.test.js.map +1 -0
- package/dist/next/routes.d.ts +10 -0
- package/dist/next/routes.d.ts.map +1 -0
- package/dist/next/routes.js +172 -0
- package/dist/next/routes.js.map +1 -0
- package/dist/next/routes.test.d.ts +2 -0
- package/dist/next/routes.test.d.ts.map +1 -0
- package/dist/next/routes.test.js +175 -0
- package/dist/next/routes.test.js.map +1 -0
- package/dist/next/server-actions.d.ts +4 -0
- package/dist/next/server-actions.d.ts.map +1 -0
- package/dist/next/server-actions.js +107 -0
- package/dist/next/server-actions.js.map +1 -0
- package/dist/next/server-actions.test.d.ts +2 -0
- package/dist/next/server-actions.test.d.ts.map +1 -0
- package/dist/next/server-actions.test.js +138 -0
- package/dist/next/server-actions.test.js.map +1 -0
- package/dist/next/trpc.d.ts +3 -0
- package/dist/next/trpc.d.ts.map +1 -0
- package/dist/next/trpc.js +312 -0
- package/dist/next/trpc.js.map +1 -0
- package/dist/next/types.d.ts +144 -0
- package/dist/next/types.d.ts.map +1 -0
- package/dist/next/types.js +2 -0
- package/dist/next/types.js.map +1 -0
- package/dist/next/wrappers.d.ts +10 -0
- package/dist/next/wrappers.d.ts.map +1 -0
- package/dist/next/wrappers.js +536 -0
- package/dist/next/wrappers.js.map +1 -0
- package/dist/next/wrappers.test.d.ts +2 -0
- package/dist/next/wrappers.test.d.ts.map +1 -0
- package/dist/next/wrappers.test.js +361 -0
- package/dist/next/wrappers.test.js.map +1 -0
- package/dist/rules/auth-boundary-missing.d.ts +5 -0
- package/dist/rules/auth-boundary-missing.d.ts.map +1 -0
- package/dist/rules/auth-boundary-missing.js +463 -0
- package/dist/rules/auth-boundary-missing.js.map +1 -0
- package/dist/rules/auth-boundary-missing.test.d.ts +2 -0
- package/dist/rules/auth-boundary-missing.test.d.ts.map +1 -0
- package/dist/rules/auth-boundary-missing.test.js +492 -0
- package/dist/rules/auth-boundary-missing.test.js.map +1 -0
- package/dist/rules/index.d.ts +12 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +95 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/input-validation-missing.d.ts +5 -0
- package/dist/rules/input-validation-missing.d.ts.map +1 -0
- package/dist/rules/input-validation-missing.js +272 -0
- package/dist/rules/input-validation-missing.js.map +1 -0
- package/dist/rules/input-validation-missing.test.d.ts +2 -0
- package/dist/rules/input-validation-missing.test.d.ts.map +1 -0
- package/dist/rules/input-validation-missing.test.js +449 -0
- package/dist/rules/input-validation-missing.test.js.map +1 -0
- package/dist/rules/rate-limit-missing.d.ts +5 -0
- package/dist/rules/rate-limit-missing.d.ts.map +1 -0
- package/dist/rules/rate-limit-missing.js +316 -0
- package/dist/rules/rate-limit-missing.js.map +1 -0
- package/dist/rules/rate-limit-missing.test.d.ts +2 -0
- package/dist/rules/rate-limit-missing.test.d.ts.map +1 -0
- package/dist/rules/rate-limit-missing.test.js +381 -0
- package/dist/rules/rate-limit-missing.test.js.map +1 -0
- package/dist/rules/tenancy-scope-missing.d.ts +5 -0
- package/dist/rules/tenancy-scope-missing.d.ts.map +1 -0
- package/dist/rules/tenancy-scope-missing.js +149 -0
- package/dist/rules/tenancy-scope-missing.js.map +1 -0
- package/dist/rules/wrapper-unrecognized.d.ts +5 -0
- package/dist/rules/wrapper-unrecognized.d.ts.map +1 -0
- package/dist/rules/wrapper-unrecognized.js +81 -0
- package/dist/rules/wrapper-unrecognized.js.map +1 -0
- package/dist/util/hof.d.ts +22 -0
- package/dist/util/hof.d.ts.map +1 -0
- package/dist/util/hof.js +99 -0
- package/dist/util/hof.js.map +1 -0
- package/dist/util/hof.test.d.ts +2 -0
- package/dist/util/hof.test.d.ts.map +1 -0
- package/dist/util/hof.test.js +79 -0
- package/dist/util/hof.test.js.map +1 -0
- package/dist/util/monorepo.d.ts +6 -0
- package/dist/util/monorepo.d.ts.map +1 -0
- package/dist/util/monorepo.js +29 -0
- package/dist/util/monorepo.js.map +1 -0
- package/dist/util/outbound-fetch.d.ts +14 -0
- package/dist/util/outbound-fetch.d.ts.map +1 -0
- package/dist/util/outbound-fetch.js +59 -0
- package/dist/util/outbound-fetch.js.map +1 -0
- package/dist/util/outbound-fetch.test.d.ts +2 -0
- package/dist/util/outbound-fetch.test.d.ts.map +1 -0
- package/dist/util/outbound-fetch.test.js +83 -0
- package/dist/util/outbound-fetch.test.js.map +1 -0
- package/dist/util/paths.d.ts +6 -0
- package/dist/util/paths.d.ts.map +1 -0
- package/dist/util/paths.js +18 -0
- package/dist/util/paths.js.map +1 -0
- package/dist/util/resolve.d.ts +30 -0
- package/dist/util/resolve.d.ts.map +1 -0
- package/dist/util/resolve.js +306 -0
- package/dist/util/resolve.js.map +1 -0
- package/dist/util/resolve.test.d.ts +2 -0
- package/dist/util/resolve.test.d.ts.map +1 -0
- package/dist/util/resolve.test.js +186 -0
- package/dist/util/resolve.test.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { isAllowlisted } from "../util/paths.js";
|
|
4
|
+
export const RULE_ID = "AUTH-BOUNDARY-MISSING";
|
|
5
|
+
const SEVERITY_RANK = { critical: 4, high: 3, med: 2, low: 1 };
|
|
6
|
+
function severityFromConfidence(confidence, maxSeverity) {
|
|
7
|
+
const max = maxSeverity;
|
|
8
|
+
const maxRank = SEVERITY_RANK[max] ?? 4;
|
|
9
|
+
// high confidence → use max severity (typically critical)
|
|
10
|
+
// med confidence → cap at high
|
|
11
|
+
const computed = confidence === "high" ? max : "high";
|
|
12
|
+
const computedRank = SEVERITY_RANK[computed] ?? 3;
|
|
13
|
+
return computedRank > maxRank ? max : computed;
|
|
14
|
+
}
|
|
15
|
+
export function run(index, config) {
|
|
16
|
+
const findings = [];
|
|
17
|
+
const maxSeverity = config.rules[RULE_ID]?.severity ?? "critical";
|
|
18
|
+
const authAllowlist = config.hints.auth.allowlistPaths;
|
|
19
|
+
// Check mutation route handlers
|
|
20
|
+
for (const route of index.routes.mutationRoutes) {
|
|
21
|
+
if (route.publicIntent)
|
|
22
|
+
continue; // Auth absence is intentional — structured suppression
|
|
23
|
+
if (isAllowlisted(route.file, authAllowlist))
|
|
24
|
+
continue;
|
|
25
|
+
const result = checkRoute(route, index, config);
|
|
26
|
+
if (result) {
|
|
27
|
+
const pathname = route.pathname ?? route.file;
|
|
28
|
+
const isWebhook = /webhook/i.test(pathname);
|
|
29
|
+
findings.push({
|
|
30
|
+
ruleId: RULE_ID,
|
|
31
|
+
severity: severityFromConfidence(result.confidence, maxSeverity),
|
|
32
|
+
confidence: result.confidence,
|
|
33
|
+
message: isWebhook
|
|
34
|
+
? `Webhook endpoint processes payloads without signature verification`
|
|
35
|
+
: `Route handler performs mutations without a recognized auth boundary`,
|
|
36
|
+
file: route.file,
|
|
37
|
+
line: result.line,
|
|
38
|
+
snippet: result.snippet,
|
|
39
|
+
evidence: result.evidence,
|
|
40
|
+
confidenceRationale: result.confidenceRationale,
|
|
41
|
+
remediation: isWebhook
|
|
42
|
+
? [
|
|
43
|
+
"Verify the provider's webhook signature before processing the payload",
|
|
44
|
+
"Examples: Stripe `constructEvent()`, GitHub HMAC, Google Pub/Sub JWT, Slack `verifyRequest()`",
|
|
45
|
+
"Use `crypto.timingSafeEqual()` for HMAC comparisons to prevent timing attacks",
|
|
46
|
+
]
|
|
47
|
+
: [
|
|
48
|
+
"Add an auth check at the top of the handler (e.g., `const session = await auth()`)",
|
|
49
|
+
"Ensure middleware.ts protects this route segment",
|
|
50
|
+
"If using a custom auth wrapper, add it to hints.auth.functions in prodcheck.config.json",
|
|
51
|
+
],
|
|
52
|
+
tags: isWebhook
|
|
53
|
+
? ["auth", "webhook", "server"]
|
|
54
|
+
: ["auth", "server"],
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Check mutation server actions (deduplicate by file since auth check is file-level)
|
|
59
|
+
const seenActionFiles = new Set();
|
|
60
|
+
for (const action of index.serverActions.mutationActions) {
|
|
61
|
+
if (seenActionFiles.has(action.file))
|
|
62
|
+
continue;
|
|
63
|
+
seenActionFiles.add(action.file);
|
|
64
|
+
if (isAllowlisted(action.file, authAllowlist))
|
|
65
|
+
continue;
|
|
66
|
+
const result = checkServerAction(action, index, config);
|
|
67
|
+
if (result) {
|
|
68
|
+
findings.push({
|
|
69
|
+
ruleId: RULE_ID,
|
|
70
|
+
severity: severityFromConfidence(result.confidence, maxSeverity),
|
|
71
|
+
confidence: result.confidence,
|
|
72
|
+
message: `Server action performs mutations without a recognized auth boundary`,
|
|
73
|
+
file: action.file,
|
|
74
|
+
line: result.line,
|
|
75
|
+
snippet: result.snippet,
|
|
76
|
+
evidence: result.evidence,
|
|
77
|
+
confidenceRationale: result.confidenceRationale,
|
|
78
|
+
remediation: [
|
|
79
|
+
"Add an auth check at the top of the server action",
|
|
80
|
+
"If using a custom auth wrapper, add it to hints.auth.functions in prodcheck.config.json",
|
|
81
|
+
],
|
|
82
|
+
tags: ["auth", "server-action"],
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Check tRPC mutation procedures
|
|
87
|
+
for (const proc of index.trpc.mutationProcedures) {
|
|
88
|
+
if (proc.procedureType === "protected")
|
|
89
|
+
continue;
|
|
90
|
+
if (isAllowlisted(proc.file, authAllowlist))
|
|
91
|
+
continue;
|
|
92
|
+
const confidence = proc.procedureType === "public" ? "high" : "med";
|
|
93
|
+
findings.push({
|
|
94
|
+
ruleId: RULE_ID,
|
|
95
|
+
severity: severityFromConfidence(confidence, maxSeverity),
|
|
96
|
+
confidence,
|
|
97
|
+
message: `tRPC mutation "${proc.name}" uses ${proc.procedureType}Procedure without auth boundary`,
|
|
98
|
+
file: proc.file,
|
|
99
|
+
line: proc.line,
|
|
100
|
+
evidence: [`${proc.procedureType}Procedure.mutation()`, ...proc.signals.mutationDetails],
|
|
101
|
+
confidenceRationale: proc.procedureType === "public"
|
|
102
|
+
? "High: public tRPC mutation with no auth boundary"
|
|
103
|
+
: "Medium: unrecognized procedure type (may have auth middleware)",
|
|
104
|
+
remediation: [
|
|
105
|
+
"Use protectedProcedure instead of publicProcedure for mutations",
|
|
106
|
+
"Add auth middleware to the procedure chain: publicProcedure.use(authMiddleware).mutation(...)",
|
|
107
|
+
"If this mutation is intentionally public, add a waiver with reason",
|
|
108
|
+
],
|
|
109
|
+
tags: ["auth", "trpc"],
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
return findings;
|
|
113
|
+
}
|
|
114
|
+
function checkRoute(route, index, config) {
|
|
115
|
+
// Use ProtectionSummary if available (computed during index building)
|
|
116
|
+
if (route.protection) {
|
|
117
|
+
if (route.protection.auth.satisfied)
|
|
118
|
+
return null;
|
|
119
|
+
// If wrapper introspection deferred this to WRAPPER-UNRECOGNIZED, don't emit per-route finding
|
|
120
|
+
if (route.protection.auth.unverifiedWrappers.length > 0)
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const src = readSource(index.rootDir, route.file);
|
|
124
|
+
if (!src)
|
|
125
|
+
return null;
|
|
126
|
+
// Check for built-in auth patterns (webhook signatures, cron keys, etc.)
|
|
127
|
+
// These are always checked regardless of ProtectionSummary
|
|
128
|
+
if (hasBuiltInAuthPattern(src))
|
|
129
|
+
return null;
|
|
130
|
+
// No auth found — determine confidence
|
|
131
|
+
const evidence = [...route.signals.mutationDetails];
|
|
132
|
+
evidence.push(`No auth function calls matched: ${config.hints.auth.functions.join(", ")}`);
|
|
133
|
+
evidence.push("No middleware auth covering this route");
|
|
134
|
+
let confidence = "high";
|
|
135
|
+
let confidenceRationale = "High: mutation evidence + no auth calls + no middleware coverage";
|
|
136
|
+
// Downgrade if we see any function calls that could be custom auth
|
|
137
|
+
if (hasPossibleCustomAuth(src)) {
|
|
138
|
+
confidence = "med";
|
|
139
|
+
confidenceRationale = "Medium: mutation evidence present but possible custom auth wrapper detected (not in hints)";
|
|
140
|
+
evidence.push("possible custom auth wrapper detected (not in hints)");
|
|
141
|
+
}
|
|
142
|
+
// Exempt callback/OAuth/OIDC/SSO/SCIM paths — public by protocol design.
|
|
143
|
+
// The OAuth flow itself (state/PKCE/nonce) IS the auth boundary.
|
|
144
|
+
const pathname = route.pathname ?? route.file;
|
|
145
|
+
if (isCallbackPath(pathname)) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
// Find the line of the first mutation evidence for precise reporting
|
|
149
|
+
const line = findFirstMutationLine(src, route.signals);
|
|
150
|
+
return { confidence, confidenceRationale, line, evidence };
|
|
151
|
+
}
|
|
152
|
+
function checkServerAction(action, index, config) {
|
|
153
|
+
const src = readSource(index.rootDir, action.file);
|
|
154
|
+
if (!src)
|
|
155
|
+
return null;
|
|
156
|
+
if (hasAuthCall(src, config.hints.auth.functions))
|
|
157
|
+
return null;
|
|
158
|
+
if (hasBuiltInAuthPattern(src))
|
|
159
|
+
return null;
|
|
160
|
+
const evidence = [...action.signals.mutationDetails];
|
|
161
|
+
evidence.push(`No auth function calls matched: ${config.hints.auth.functions.join(", ")}`);
|
|
162
|
+
let confidence = "high";
|
|
163
|
+
let confidenceRationale = "High: server action with mutation evidence + no auth calls";
|
|
164
|
+
if (hasPossibleCustomAuth(src)) {
|
|
165
|
+
confidence = "med";
|
|
166
|
+
confidenceRationale = "Medium: mutation evidence present but possible custom auth wrapper detected (not in hints)";
|
|
167
|
+
evidence.push("possible custom auth wrapper detected (not in hints)");
|
|
168
|
+
}
|
|
169
|
+
const line = findFirstMutationLine(src, action.signals);
|
|
170
|
+
return { confidence, confidenceRationale, line, evidence };
|
|
171
|
+
}
|
|
172
|
+
function hasAuthCall(src, authFunctions) {
|
|
173
|
+
for (const fn of authFunctions) {
|
|
174
|
+
const pattern = new RegExp(`\\b${escapeRegex(fn)}\\s*\\(`, "m");
|
|
175
|
+
if (pattern.test(src))
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Built-in auth patterns that don't need to be in hints.
|
|
182
|
+
* These are common enough to detect automatically.
|
|
183
|
+
*/
|
|
184
|
+
function hasBuiltInAuthPattern(src) {
|
|
185
|
+
// Stripe webhook signature verification
|
|
186
|
+
if (/stripe\.webhooks\.constructEvent\s*\(/m.test(src))
|
|
187
|
+
return true;
|
|
188
|
+
// WorkOS webhook signature verification
|
|
189
|
+
if (/workos\.webhooks\.constructEvent\s*\(/m.test(src))
|
|
190
|
+
return true;
|
|
191
|
+
// Vercel/QStash cron signature verification
|
|
192
|
+
if (/verifyVercelSignature\s*\(/m.test(src))
|
|
193
|
+
return true;
|
|
194
|
+
if (/verifyQstashSignature\s*\(/m.test(src))
|
|
195
|
+
return true;
|
|
196
|
+
// HMAC webhook signature verification (crypto.createHmac + comparison)
|
|
197
|
+
if (/createHmac\s*\(/.test(src) && /signature/i.test(src))
|
|
198
|
+
return true;
|
|
199
|
+
// Cron API key / secret env var check
|
|
200
|
+
if (/process\.env\.CRON_(?:API_KEY|SECRET)/m.test(src))
|
|
201
|
+
return true;
|
|
202
|
+
// Shared secret header verification (common webhook pattern)
|
|
203
|
+
if (/process\.env\.\w+SECRET\b/.test(src) && /headers\.get\s*\(/m.test(src))
|
|
204
|
+
return true;
|
|
205
|
+
// Supabase auth boundary — call-based, not import-based.
|
|
206
|
+
if (/\.auth\.getUser\s*\(/.test(src))
|
|
207
|
+
return true;
|
|
208
|
+
if (/\.auth\.getSession\s*\(/.test(src))
|
|
209
|
+
return true;
|
|
210
|
+
// --- Framework wrappers with built-in request signing ---
|
|
211
|
+
// Upstash Workflow serve() — verifies request signatures automatically
|
|
212
|
+
if (hasFrameworkServe(src, "@upstash/workflow"))
|
|
213
|
+
return true;
|
|
214
|
+
// Inngest serve() — verifies signing key on incoming requests
|
|
215
|
+
if (hasFrameworkServe(src, "inngest"))
|
|
216
|
+
return true;
|
|
217
|
+
// --- Webhook verification libraries (import + call) ---
|
|
218
|
+
// Svix webhook verification (used by Clerk, etc.)
|
|
219
|
+
if (hasImportAndCall(src, "svix", /\.verify\s*\(/))
|
|
220
|
+
return true;
|
|
221
|
+
// Octokit/GitHub webhook verification
|
|
222
|
+
if (hasImportAndCall(src, "@octokit/webhooks", /\.verify\s*\(/))
|
|
223
|
+
return true;
|
|
224
|
+
// --- Contextual webhook auth patterns ---
|
|
225
|
+
// timingSafeEqual used with request-derived data + early 401/403
|
|
226
|
+
if (hasWebhookTokenVerification(src))
|
|
227
|
+
return true;
|
|
228
|
+
// --- JWT verification (jose / jsonwebtoken) ---
|
|
229
|
+
// jose: jwtVerify() with token from headers/cookies + early deny
|
|
230
|
+
if (hasImportAndCall(src, "jose", /jwtVerify\s*\(/))
|
|
231
|
+
return true;
|
|
232
|
+
// jsonwebtoken: jwt.verify() / verify() with token from headers/cookies
|
|
233
|
+
if (hasImportAndCall(src, "jsonwebtoken", /\.verify\s*\(/))
|
|
234
|
+
return true;
|
|
235
|
+
// --- DB-backed API token lookup + early deny ---
|
|
236
|
+
if (hasDbTokenLookup(src))
|
|
237
|
+
return true;
|
|
238
|
+
// --- Auth-guard return: header/token/secret check → early 401/403 before mutation ---
|
|
239
|
+
if (hasAuthGuardReturn(src))
|
|
240
|
+
return true;
|
|
241
|
+
// --- Inline auth guard: common auth function name + null check + early return/throw ---
|
|
242
|
+
if (hasInlineAuthGuard(src))
|
|
243
|
+
return true;
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Detect framework `serve()` wrappers that have built-in request signing.
|
|
248
|
+
* Checks both the import source and the serve() call in the source.
|
|
249
|
+
*/
|
|
250
|
+
function hasFrameworkServe(src, packagePrefix) {
|
|
251
|
+
const importPattern = new RegExp(`from\\s+["']${escapeRegex(packagePrefix)}[^"']*["']`);
|
|
252
|
+
if (!importPattern.test(src))
|
|
253
|
+
return false;
|
|
254
|
+
return /\bserve\s*[<(]/.test(src);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Detect a known verification library by import source + method call.
|
|
258
|
+
*/
|
|
259
|
+
function hasImportAndCall(src, packageName, callPattern) {
|
|
260
|
+
const importPattern = new RegExp(`from\\s+["']${escapeRegex(packageName)}[^"']*["']`);
|
|
261
|
+
if (!importPattern.test(src))
|
|
262
|
+
return false;
|
|
263
|
+
return callPattern.test(src);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Detect webhook token verification: timingSafeEqual used with
|
|
267
|
+
* request-derived data (headers/params/body) and early 401/403 on mismatch.
|
|
268
|
+
*
|
|
269
|
+
* NOT a blanket "any timingSafeEqual = auth" — requires:
|
|
270
|
+
* 1. timingSafeEqual call present
|
|
271
|
+
* 2. Reads from request (headers, searchParams, or body)
|
|
272
|
+
* 3. Returns 401 or 403 on failure
|
|
273
|
+
*/
|
|
274
|
+
function hasWebhookTokenVerification(src) {
|
|
275
|
+
if (!/timingSafeEqual\s*\(/.test(src))
|
|
276
|
+
return false;
|
|
277
|
+
const readsRequest = /headers\.get\s*\(/.test(src)
|
|
278
|
+
|| /searchParams\.get\s*\(/.test(src)
|
|
279
|
+
|| /request\.json\s*\(/.test(src)
|
|
280
|
+
|| /req\.json\s*\(/.test(src);
|
|
281
|
+
if (!readsRequest)
|
|
282
|
+
return false;
|
|
283
|
+
// Accept explicit 401/403 or any throw (many apps throw custom errors)
|
|
284
|
+
return /status:\s*40[13]\b/.test(src) || /\(\s*40[13]\s*\)/.test(src) || /\bthrow\s+new\b/.test(src);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Detect DB-backed token lookup with early deny.
|
|
288
|
+
*
|
|
289
|
+
* Pattern: reads token from request (header, body, params) → looks it up in DB → returns 401/403 if missing.
|
|
290
|
+
* Common in B2B SaaS for API key authentication, password reset flows, etc.
|
|
291
|
+
*
|
|
292
|
+
* Requires all three:
|
|
293
|
+
* 1. Reads from request (headers, searchParams, body, or route params)
|
|
294
|
+
* 2. DB lookup on a token/key-like table (prisma.apiToken, prisma.apiKey, etc.)
|
|
295
|
+
* 3. Returns 401 or 403
|
|
296
|
+
*/
|
|
297
|
+
function hasDbTokenLookup(src) {
|
|
298
|
+
// DB lookup on a token/key-like table
|
|
299
|
+
const hasTokenLookup = /\.(apiToken|apiKey|token|accessToken|api_key|access_token|passwordResetToken|verificationToken|resetToken)\.(findUnique|findFirst|findMany)\s*\(/i.test(src);
|
|
300
|
+
if (!hasTokenLookup)
|
|
301
|
+
return false;
|
|
302
|
+
// Accept explicit 401/403, or any throw (custom error classes like DubApiError)
|
|
303
|
+
// Route handlers always read from the request, so token lookup + deny is sufficient
|
|
304
|
+
return /status:\s*40[13]\b/.test(src) || /\(\s*40[13]\s*\)/.test(src) || /\bthrow\s+new\b/.test(src);
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Detect auth-guard return patterns: an early 401/403 return whose guarding
|
|
308
|
+
* condition references an auth signal, occurring BEFORE mutation evidence.
|
|
309
|
+
*
|
|
310
|
+
* We require ALL of:
|
|
311
|
+
* 1. A return/throw producing 401 or 403
|
|
312
|
+
* 2. The surrounding context references an auth-related signal
|
|
313
|
+
* 3. The guard occurs before the first mutation evidence in the file
|
|
314
|
+
*
|
|
315
|
+
* Auth signals (the condition must reference at least one):
|
|
316
|
+
* - headers.get(...) with auth-related header names
|
|
317
|
+
* - Variables named token, apiKey, signature, secret, session, user, auth
|
|
318
|
+
* - Comparison against process.env.* or config values
|
|
319
|
+
*
|
|
320
|
+
* This intentionally does NOT match:
|
|
321
|
+
* - Feature flag checks (if (!enabled) return 403)
|
|
322
|
+
* - Plan gating (if (!isPro) return 403)
|
|
323
|
+
* - CSRF/bot checks without auth signals
|
|
324
|
+
* - 401/403 returns AFTER mutation code (error handling, not guards)
|
|
325
|
+
*/
|
|
326
|
+
function hasAuthGuardReturn(src) {
|
|
327
|
+
// Must have a 401 or 403 status somewhere
|
|
328
|
+
if (!/status:\s*40[13]\b/.test(src) && !/\(\s*40[13]\s*\)/.test(src))
|
|
329
|
+
return false;
|
|
330
|
+
const lines = src.split("\n");
|
|
331
|
+
// Find the first mutation evidence line
|
|
332
|
+
const firstMutationLine = findFirstMutationLineIndex(lines);
|
|
333
|
+
// Find lines with 401/403 returns and check nearby context for auth signals
|
|
334
|
+
for (let i = 0; i < lines.length; i++) {
|
|
335
|
+
const line = lines[i];
|
|
336
|
+
if (!/40[13]/.test(line))
|
|
337
|
+
continue;
|
|
338
|
+
if (!/status|Response|NextResponse|return|throw/i.test(line))
|
|
339
|
+
continue;
|
|
340
|
+
// Guard must occur before mutation evidence (or if no mutation found, accept it)
|
|
341
|
+
if (firstMutationLine !== undefined && i >= firstMutationLine)
|
|
342
|
+
continue;
|
|
343
|
+
// Look at the surrounding context (up to 10 lines before the 401/403)
|
|
344
|
+
const contextStart = Math.max(0, i - 10);
|
|
345
|
+
const context = lines.slice(contextStart, i + 1).join("\n");
|
|
346
|
+
if (hasAuthSignalInContext(context))
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
return false;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Detect inline auth guards using common auth function name patterns + null check.
|
|
353
|
+
*
|
|
354
|
+
* Matches function calls like getCurrentUser(), getUser(), requireSession(), checkAuth(), etc.
|
|
355
|
+
* followed by a null/falsy check within 15 lines, with an early return/throw in the guard body.
|
|
356
|
+
*
|
|
357
|
+
* This catches auth patterns that aren't in hints (custom function names).
|
|
358
|
+
*/
|
|
359
|
+
const AUTH_FN_PATTERN = /\b(?:get|require|check|validate|verify|ensure|load|fetch|update)\w*(?:User|Session|Auth|Account|Identity|Token)\s*\(/i;
|
|
360
|
+
function hasInlineAuthGuard(src) {
|
|
361
|
+
if (!AUTH_FN_PATTERN.test(src))
|
|
362
|
+
return false;
|
|
363
|
+
const lines = src.split("\n");
|
|
364
|
+
// Find lines with auth function calls
|
|
365
|
+
for (let i = 0; i < lines.length; i++) {
|
|
366
|
+
if (!AUTH_FN_PATTERN.test(lines[i]))
|
|
367
|
+
continue;
|
|
368
|
+
// Look for a null/falsy check within 15 lines after the call
|
|
369
|
+
const searchEnd = Math.min(lines.length, i + 15);
|
|
370
|
+
for (let j = i; j < searchEnd; j++) {
|
|
371
|
+
const line = lines[j];
|
|
372
|
+
// Check for if (!variable) or if (variable == null) patterns
|
|
373
|
+
if (!/if\s*\(\s*!|\s*==\s*null|\s*===\s*null/.test(line))
|
|
374
|
+
continue;
|
|
375
|
+
// Check subsequent lines (the guard body) for throw/return/redirect
|
|
376
|
+
const guardEnd = Math.min(lines.length, j + 5);
|
|
377
|
+
const guardBody = lines.slice(j, guardEnd).join("\n");
|
|
378
|
+
if (/\bthrow\b|\breturn\b|\bredirect\b|NextResponse\.redirect|NextResponse\.json/.test(guardBody)) {
|
|
379
|
+
return true;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
/** Find the 0-based line index of the first mutation evidence in source lines. */
|
|
386
|
+
function findFirstMutationLineIndex(lines) {
|
|
387
|
+
for (let i = 0; i < lines.length; i++) {
|
|
388
|
+
if (/\.(create|update|delete|upsert|createMany|updateMany|deleteMany)\s*\(/.test(lines[i])) {
|
|
389
|
+
return i;
|
|
390
|
+
}
|
|
391
|
+
if (/stripe\.\w+\.(create|update|del)\s*\(/.test(lines[i])) {
|
|
392
|
+
return i;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
return undefined;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Auth signals that distinguish real auth guards from feature flags / plan gating.
|
|
399
|
+
*/
|
|
400
|
+
const AUTH_SIGNAL_PATTERNS = [
|
|
401
|
+
// Header reads with auth-related names
|
|
402
|
+
/headers\.get\s*\(\s*["'](?:authorization|x-api-key|x-webhook-secret|x-signature|x-hub-signature)/i,
|
|
403
|
+
// Any custom header read + secret/token/key comparison
|
|
404
|
+
/headers\.get\s*\([^)]+\)[\s\S]{0,100}(?:secret|token|key|signature)\b/i,
|
|
405
|
+
// Variable names that imply auth context
|
|
406
|
+
/\b(?:const|let|var)\s+(?:token|apiKey|api_key|signature|webhookSecret|webhook_secret|headerValue)\b/i,
|
|
407
|
+
// Comparison against env vars (secret/key/token)
|
|
408
|
+
/process\.env\.\w*(?:SECRET|TOKEN|KEY|API_KEY|WEBHOOK)\w*/i,
|
|
409
|
+
// Authorization / Bearer token patterns
|
|
410
|
+
/\bauthorization\b/i,
|
|
411
|
+
/\bbearer\b/i,
|
|
412
|
+
// Known verification function names in the condition
|
|
413
|
+
/\b(?:verify|validate|check)\w*(?:Token|Signature|Auth|Secret|Key)\s*\(/i,
|
|
414
|
+
];
|
|
415
|
+
/**
|
|
416
|
+
* Check if a code context (a few lines around a 401/403 return)
|
|
417
|
+
* contains at least one auth signal, distinguishing it from
|
|
418
|
+
* feature-flag / plan-gating returns.
|
|
419
|
+
*/
|
|
420
|
+
function hasAuthSignalInContext(context) {
|
|
421
|
+
return AUTH_SIGNAL_PATTERNS.some((pattern) => pattern.test(context));
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Detect callback/OAuth/OIDC paths that are typically public by protocol design.
|
|
425
|
+
* These get downgraded (not allowlisted) — they should still rely on
|
|
426
|
+
* framework validation (state/PKCE) but are not auth-boundary issues.
|
|
427
|
+
*/
|
|
428
|
+
function isCallbackPath(pathname) {
|
|
429
|
+
return /\/(callback|oauth|oidc|sso|scim)(\/|$)/i.test(pathname);
|
|
430
|
+
}
|
|
431
|
+
function hasPossibleCustomAuth(src) {
|
|
432
|
+
if (/\b(verify|check|require|validate|ensure|guard|protect|get|fetch|load)\w*(Token|Auth|Session|User|Access|Secret|Signature|Permission)\s*\(/i.test(src)) {
|
|
433
|
+
return true;
|
|
434
|
+
}
|
|
435
|
+
if (/headers?\S*\.get\s*\(\s*["']authorization["']\s*\)/i.test(src)) {
|
|
436
|
+
return true;
|
|
437
|
+
}
|
|
438
|
+
return false;
|
|
439
|
+
}
|
|
440
|
+
function findFirstMutationLine(src, signals) {
|
|
441
|
+
const lines = src.split("\n");
|
|
442
|
+
for (let i = 0; i < lines.length; i++) {
|
|
443
|
+
if (/\.(create|update|delete|upsert|createMany|updateMany|deleteMany)\s*\(/.test(lines[i])) {
|
|
444
|
+
return i + 1;
|
|
445
|
+
}
|
|
446
|
+
if (/stripe\.\w+\.(create|update|del)\s*\(/.test(lines[i])) {
|
|
447
|
+
return i + 1;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
return undefined;
|
|
451
|
+
}
|
|
452
|
+
function readSource(rootDir, file) {
|
|
453
|
+
try {
|
|
454
|
+
return readFileSync(path.join(rootDir, file), "utf8");
|
|
455
|
+
}
|
|
456
|
+
catch {
|
|
457
|
+
return null;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
function escapeRegex(str) {
|
|
461
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
462
|
+
}
|
|
463
|
+
//# sourceMappingURL=auth-boundary-missing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-boundary-missing.js","sourceRoot":"","sources":["../../src/rules/auth-boundary-missing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-boundary-missing.test.d.ts","sourceRoot":"","sources":["../../src/rules/auth-boundary-missing.test.ts"],"names":[],"mappings":""}
|