@next-secure-check/rules 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/LICENSE +22 -21
  2. package/README.md +1 -1
  3. package/dist/analysis-cache.d.ts +14 -0
  4. package/dist/analysis-cache.d.ts.map +1 -0
  5. package/dist/analysis-cache.js +28 -0
  6. package/dist/analysis-cache.js.map +1 -0
  7. package/dist/analysis-facts.d.ts +62 -0
  8. package/dist/analysis-facts.d.ts.map +1 -0
  9. package/dist/analysis-facts.js +29 -0
  10. package/dist/analysis-facts.js.map +1 -0
  11. package/dist/ast-utils.d.ts +29 -0
  12. package/dist/ast-utils.d.ts.map +1 -1
  13. package/dist/ast-utils.js +95 -394
  14. package/dist/ast-utils.js.map +1 -1
  15. package/dist/command-ast.d.ts +14 -0
  16. package/dist/command-ast.d.ts.map +1 -0
  17. package/dist/command-ast.js +40 -0
  18. package/dist/command-ast.js.map +1 -0
  19. package/dist/command-discovery.d.ts +8 -0
  20. package/dist/command-discovery.d.ts.map +1 -0
  21. package/dist/command-discovery.js +92 -0
  22. package/dist/command-discovery.js.map +1 -0
  23. package/dist/command-flow.d.ts +25 -0
  24. package/dist/command-flow.d.ts.map +1 -0
  25. package/dist/command-flow.js +467 -0
  26. package/dist/command-flow.js.map +1 -0
  27. package/dist/command-guards.d.ts +4 -0
  28. package/dist/command-guards.d.ts.map +1 -0
  29. package/dist/command-guards.js +92 -0
  30. package/dist/command-guards.js.map +1 -0
  31. package/dist/password-ast.d.ts +4 -0
  32. package/dist/password-ast.d.ts.map +1 -0
  33. package/dist/password-ast.js +102 -0
  34. package/dist/password-ast.js.map +1 -0
  35. package/dist/route-ast.d.ts +9 -0
  36. package/dist/route-ast.d.ts.map +1 -0
  37. package/dist/route-ast.js +340 -0
  38. package/dist/route-ast.js.map +1 -0
  39. package/dist/rule-utils.d.ts +1 -2
  40. package/dist/rule-utils.d.ts.map +1 -1
  41. package/dist/rule-utils.js +1 -13
  42. package/dist/rule-utils.js.map +1 -1
  43. package/dist/security-rules.d.ts.map +1 -1
  44. package/dist/security-rules.js +40 -35
  45. package/dist/security-rules.js.map +1 -1
  46. package/dist/sql-ast.d.ts +6 -0
  47. package/dist/sql-ast.d.ts.map +1 -0
  48. package/dist/sql-ast.js +208 -0
  49. package/dist/sql-ast.js.map +1 -0
  50. package/dist/xss-ast.d.ts +16 -0
  51. package/dist/xss-ast.d.ts.map +1 -0
  52. package/dist/xss-ast.js +162 -0
  53. package/dist/xss-ast.js.map +1 -0
  54. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-ast.js","sourceRoot":"","sources":["../src/command-ast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;AAC3F,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;AACzD,MAAM,CAAC,MAAM,kBAAkB,GAAG,2BAA2B,CAAC;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAEpD,MAAM,UAAU,sBAAsB,CACpC,UAAyB,EACzB,kBAAuC,EACvC,sBAA2C;IAE3C,IAAI,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,OAAO,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,0BAA0B,CAAC,UAAU,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrG,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,sBAAsB,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1G,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,UAAyB;IAC5D,IAAI,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,OAAO,UAAU,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,OAAO,EAAE,CAAC,0BAA0B,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAA0D;IAClG,OAAO,QAAQ,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa,IAAI,QAAQ,KAAK,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,IAAmB;IAC7D,OAAO,IAAI,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,IAAI,IAAI,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAyB;IAC/D,OAAO,IAAI,KAAK,SAAS,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3G,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA0B;IAC3D,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACvI,CAAC;IAED,OAAO,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAA0B;IAChE,OAAO,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import ts from "typescript";
2
+ export type CommandDiscoveryFacts = {
3
+ commandIdentifiers: Set<string>;
4
+ childProcessNamespaces: Set<string>;
5
+ commandDeclarationNodes: ts.Node[];
6
+ };
7
+ export declare function collectCommandDiscovery(sourceFile: ts.SourceFile): CommandDiscoveryFacts;
8
+ //# sourceMappingURL=command-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-discovery.d.ts","sourceRoot":"","sources":["../src/command-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAQ5B,MAAM,MAAM,qBAAqB,GAAG;IAClC,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,sBAAsB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,uBAAuB,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;CACpC,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,qBAAqB,CAexF"}
@@ -0,0 +1,92 @@
1
+ import ts from "typescript";
2
+ import { COMMAND_EXECUTION_NAMES, bindingElementLocalName, bindingElementName, isChildProcessSpecifier } from "./command-ast.js";
3
+ export function collectCommandDiscovery(sourceFile) {
4
+ const commandIdentifiers = new Set();
5
+ const childProcessNamespaces = new Set();
6
+ const commandDeclarationNodes = [];
7
+ visitCommandDiscoveryNodes(sourceFile, (node) => {
8
+ collectChildProcessImports(node, commandIdentifiers, childProcessNamespaces, commandDeclarationNodes);
9
+ collectChildProcessRequires(node, commandIdentifiers, childProcessNamespaces, commandDeclarationNodes);
10
+ });
11
+ return {
12
+ commandIdentifiers,
13
+ childProcessNamespaces,
14
+ commandDeclarationNodes
15
+ };
16
+ }
17
+ function collectChildProcessImports(node, commandIdentifiers, childProcessNamespaces, declarationNodes) {
18
+ if (!ts.isImportDeclaration(node) || !isChildProcessSpecifier(node.moduleSpecifier)) {
19
+ return;
20
+ }
21
+ const importClause = node.importClause;
22
+ if (!importClause) {
23
+ return;
24
+ }
25
+ if (importClause.name) {
26
+ childProcessNamespaces.add(importClause.name.text);
27
+ }
28
+ const namedBindings = importClause.namedBindings;
29
+ if (namedBindings && ts.isNamespaceImport(namedBindings)) {
30
+ childProcessNamespaces.add(namedBindings.name.text);
31
+ return;
32
+ }
33
+ if (!namedBindings || !ts.isNamedImports(namedBindings)) {
34
+ return;
35
+ }
36
+ for (const importSpecifier of namedBindings.elements) {
37
+ const importedName = importSpecifier.propertyName?.text ?? importSpecifier.name.text;
38
+ if (!COMMAND_EXECUTION_NAMES.has(importedName)) {
39
+ continue;
40
+ }
41
+ commandIdentifiers.add(importSpecifier.name.text);
42
+ if (importedName === "exec" || importedName === "execSync") {
43
+ declarationNodes.push(importSpecifier);
44
+ }
45
+ }
46
+ }
47
+ function collectChildProcessRequires(node, commandIdentifiers, childProcessNamespaces, declarationNodes) {
48
+ if (!ts.isVariableDeclaration(node) || !node.initializer) {
49
+ return;
50
+ }
51
+ if (isRequireChildProcessCall(node.initializer)) {
52
+ if (ts.isIdentifier(node.name)) {
53
+ childProcessNamespaces.add(node.name.text);
54
+ return;
55
+ }
56
+ if (ts.isObjectBindingPattern(node.name)) {
57
+ for (const element of node.name.elements) {
58
+ const importedName = bindingElementName(element);
59
+ const localName = bindingElementLocalName(element);
60
+ if (!importedName || !localName || !COMMAND_EXECUTION_NAMES.has(importedName)) {
61
+ continue;
62
+ }
63
+ commandIdentifiers.add(localName);
64
+ if (importedName === "exec" || importedName === "execSync") {
65
+ declarationNodes.push(element);
66
+ }
67
+ }
68
+ }
69
+ return;
70
+ }
71
+ if (ts.isPropertyAccessExpression(node.initializer) && isRequireChildProcessCall(node.initializer.expression)) {
72
+ const importedName = node.initializer.name.text;
73
+ if (ts.isIdentifier(node.name) && COMMAND_EXECUTION_NAMES.has(importedName)) {
74
+ commandIdentifiers.add(node.name.text);
75
+ if (importedName === "exec" || importedName === "execSync") {
76
+ declarationNodes.push(node);
77
+ }
78
+ }
79
+ }
80
+ }
81
+ function isRequireChildProcessCall(node) {
82
+ if (!ts.isCallExpression(node) || !ts.isIdentifier(node.expression) || node.expression.text !== "require") {
83
+ return false;
84
+ }
85
+ const [specifier] = node.arguments;
86
+ return isChildProcessSpecifier(specifier);
87
+ }
88
+ function visitCommandDiscoveryNodes(node, callback) {
89
+ callback(node);
90
+ ts.forEachChild(node, (child) => visitCommandDiscoveryNodes(child, callback));
91
+ }
92
+ //# sourceMappingURL=command-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-discovery.js","sourceRoot":"","sources":["../src/command-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import ts from "typescript";
2
+ import { type BoundedFlowFacts, type BoundedFlowInvalidationReason } from "./analysis-facts.js";
3
+ export type CommandFlowFacts = {
4
+ sourcePaths: ReadonlyMap<ts.CallExpression, string>;
5
+ safeCommandCalls: ReadonlySet<ts.CallExpression>;
6
+ boundedFlow: BoundedFlowFacts;
7
+ };
8
+ export type BoundedFlowContext = {
9
+ readonly scopeRoot: ts.Node;
10
+ readonly findSourcePathInExpression: (node: ts.Node) => string | undefined;
11
+ readonly findSourcePathInArguments: (node: ts.CallExpression) => string | undefined;
12
+ readonly recordSink: (node: ts.CallExpression, kind?: string) => void;
13
+ readonly recordEvidencePath: (node: ts.Node, path: string) => void;
14
+ };
15
+ export type BoundedFlowCallbacks = {
16
+ readonly onVariableDeclaration?: (node: ts.VariableDeclaration, context: BoundedFlowContext) => void;
17
+ readonly onAssignment?: (node: ts.BinaryExpression, context: BoundedFlowContext) => void;
18
+ readonly onCall?: (node: ts.CallExpression, context: BoundedFlowContext) => void;
19
+ readonly onTaggedTemplate?: (node: ts.TaggedTemplateExpression, context: BoundedFlowContext) => void;
20
+ readonly onInvalidation?: (identifier: string, reason: BoundedFlowInvalidationReason, context: BoundedFlowContext) => void;
21
+ };
22
+ export declare function isAnalyzableCommandExecutionCall(node: ts.CallExpression, commandIdentifiers: ReadonlySet<string>, childProcessNamespaces: ReadonlySet<string>): boolean;
23
+ export declare function collectCommandSourcePaths(sourceFile: ts.SourceFile, commandIdentifiers: ReadonlySet<string>, childProcessNamespaces: ReadonlySet<string>): ReadonlyMap<ts.CallExpression, string>;
24
+ export declare function collectCommandFlowFacts(sourceFile: ts.SourceFile, commandIdentifiers: ReadonlySet<string>, childProcessNamespaces: ReadonlySet<string>, callbacks?: BoundedFlowCallbacks): CommandFlowFacts;
25
+ //# sourceMappingURL=command-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-flow.d.ts","sourceRoot":"","sources":["../src/command-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAc5B,OAAO,EAGL,KAAK,gBAAgB,EAErB,KAAK,6BAA6B,EACnC,MAAM,qBAAqB,CAAC;AAG7B,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACpD,gBAAgB,EAAE,WAAW,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;IACjD,WAAW,EAAE,gBAAgB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC;IAC5B,QAAQ,CAAC,0BAA0B,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,GAAG,SAAS,CAAC;IAC3E,QAAQ,CAAC,yBAAyB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,KAAK,MAAM,GAAG,SAAS,CAAC;IACpF,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACtE,QAAQ,CAAC,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACpE,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,EAAE,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACrG,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACzF,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,EAAE,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,wBAAwB,EAAE,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACrG,QAAQ,CAAC,cAAc,CAAC,EAAE,CACxB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,6BAA6B,EACrC,OAAO,EAAE,kBAAkB,KACxB,IAAI,CAAC;CACX,CAAC;AAEF,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,EAAE,CAAC,cAAc,EACvB,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC,EACvC,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAAC,GAC1C,OAAO,CAET;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC,EACvC,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAAC,GAC1C,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC,CAExC;AAED,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC,EACvC,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAAC,EAC3C,SAAS,GAAE,oBAAyB,GACnC,gBAAgB,CA6BlB"}
@@ -0,0 +1,467 @@
1
+ import ts from "typescript";
2
+ import { COMMAND_ALIAS_LIMIT, REQUEST_SOURCE_NAMES, ROUTE_PARAMS_NAMES, SEARCH_PARAMS_NAME, bindingElementLocalName, bindingElementName, commandExecutionName, isCommandAssignmentOperator, isCommandExecutionCall, isCommandMutationOperator } from "./command-ast.js";
3
+ import { createBoundedFlowFactsBuilder, finalizeBoundedFlowFacts } from "./analysis-facts.js";
4
+ import { hasCommandAllowlistGuard, isCommandAllowlistMembershipCall } from "./command-guards.js";
5
+ export function isAnalyzableCommandExecutionCall(node, commandIdentifiers, childProcessNamespaces) {
6
+ return isCommandExecutionCall(node.expression, commandIdentifiers, childProcessNamespaces) && !isSafeStaticSpawnCall(node);
7
+ }
8
+ export function collectCommandSourcePaths(sourceFile, commandIdentifiers, childProcessNamespaces) {
9
+ return collectCommandFlowFacts(sourceFile, commandIdentifiers, childProcessNamespaces).sourcePaths;
10
+ }
11
+ export function collectCommandFlowFacts(sourceFile, commandIdentifiers, childProcessNamespaces, callbacks = {}) {
12
+ const factsBuilder = createBoundedFlowFactsBuilder();
13
+ collectFunctionBoundaryFacts(sourceFile, factsBuilder);
14
+ analyzeCommandScope(sourceFile, sourceFile, commandIdentifiers, childProcessNamespaces, factsBuilder, callbacks);
15
+ visitCommandNodes(sourceFile, (node) => {
16
+ if (!isCommandFunctionLike(node)) {
17
+ return;
18
+ }
19
+ const body = commandFunctionBody(node);
20
+ if (body) {
21
+ analyzeCommandScope(body, body, commandIdentifiers, childProcessNamespaces, factsBuilder, callbacks);
22
+ }
23
+ });
24
+ const boundedFlow = finalizeBoundedFlowFacts(factsBuilder);
25
+ const sourcePaths = new Map();
26
+ for (const [node, path] of boundedFlow.evidencePaths) {
27
+ if (ts.isCallExpression(node)) {
28
+ sourcePaths.set(node, path);
29
+ }
30
+ }
31
+ return {
32
+ sourcePaths,
33
+ safeCommandCalls: boundedFlow.guardedSinks,
34
+ boundedFlow
35
+ };
36
+ }
37
+ function isSafeStaticSpawnCall(node) {
38
+ const methodName = commandExecutionName(node.expression);
39
+ if (methodName !== "spawn" && methodName !== "spawnSync") {
40
+ return false;
41
+ }
42
+ const command = node.arguments[0] ? unwrapCommandExpression(node.arguments[0]) : undefined;
43
+ const argumentsArray = node.arguments[1] ? unwrapCommandExpression(node.arguments[1]) : undefined;
44
+ if (!command || literalText(command) === undefined || !argumentsArray || !ts.isArrayLiteralExpression(argumentsArray)) {
45
+ return false;
46
+ }
47
+ if (!argumentsArray.elements.every((element) => !ts.isSpreadElement(element) && literalText(element) !== undefined)) {
48
+ return false;
49
+ }
50
+ const options = node.arguments[2] ? unwrapCommandExpression(node.arguments[2]) : undefined;
51
+ if (!options) {
52
+ return true;
53
+ }
54
+ if (!ts.isObjectLiteralExpression(options)) {
55
+ return false;
56
+ }
57
+ return options.properties.every((property) => {
58
+ if (ts.isSpreadAssignment(property)) {
59
+ return false;
60
+ }
61
+ if (!ts.isPropertyAssignment(property)) {
62
+ return true;
63
+ }
64
+ const propertyName = ts.isIdentifier(property.name) || ts.isStringLiteral(property.name) ? property.name.text : undefined;
65
+ if (!propertyName) {
66
+ return false;
67
+ }
68
+ if (propertyName !== "shell") {
69
+ return true;
70
+ }
71
+ return property.initializer.kind === ts.SyntaxKind.FalseKeyword;
72
+ });
73
+ }
74
+ function analyzeCommandScope(scopeRoot, node, commandIdentifiers, childProcessNamespaces, factsBuilder, callbacks, state = createCommandFlowState(factsBuilder, scopeRoot, callbacks)) {
75
+ if (node !== scopeRoot && isCommandFunctionLike(node)) {
76
+ return;
77
+ }
78
+ if (ts.isVariableDeclaration(node)) {
79
+ recordCommandDeclaration(node, state);
80
+ state.callbacks.onVariableDeclaration?.(node, createBoundedFlowContext(state));
81
+ }
82
+ if (ts.isBinaryExpression(node) && isCommandAssignmentOperator(node.operatorToken.kind)) {
83
+ recordCommandAssignment(node, state);
84
+ state.callbacks.onAssignment?.(node, createBoundedFlowContext(state));
85
+ }
86
+ if (ts.isPrefixUnaryExpression(node) && isCommandMutationOperator(node.operator)) {
87
+ invalidateCommandTarget(node.operand, state, "mutation");
88
+ }
89
+ if (ts.isPostfixUnaryExpression(node) && isCommandMutationOperator(node.operator)) {
90
+ invalidateCommandTarget(node.operand, state, "mutation");
91
+ }
92
+ if (ts.isTaggedTemplateExpression(node)) {
93
+ state.callbacks.onTaggedTemplate?.(node, createBoundedFlowContext(state));
94
+ }
95
+ if (ts.isCallExpression(node)) {
96
+ state.callbacks.onCall?.(node, createBoundedFlowContext(state));
97
+ if (isAnalyzableCommandExecutionCall(node, commandIdentifiers, childProcessNamespaces)) {
98
+ state.factsBuilder.sinkFacts.set(node, { node, scope: scopeRoot, kind: commandExecutionName(node.expression) });
99
+ const sourcePath = findCommandSourcePathInArguments(node, state);
100
+ if (sourcePath) {
101
+ const guardIdentifier = guardedCommandIdentifier(node, state);
102
+ if (guardIdentifier) {
103
+ state.factsBuilder.guardedSinks.add(node);
104
+ state.factsBuilder.guardFacts.set(node, {
105
+ node,
106
+ scope: scopeRoot,
107
+ kind: "command-allowlist",
108
+ identifier: guardIdentifier
109
+ });
110
+ }
111
+ else {
112
+ state.factsBuilder.evidencePaths.set(node, sourcePath);
113
+ }
114
+ }
115
+ else {
116
+ invalidateTaintedReferences(node, state, "call-escape");
117
+ }
118
+ }
119
+ else if (!isCommandAllowlistMembershipCall(node) && !sourcePathForExpression(node, state)) {
120
+ invalidateTaintedReferences(node, state, "call-escape");
121
+ }
122
+ }
123
+ ts.forEachChild(node, (child) => analyzeCommandScope(scopeRoot, child, commandIdentifiers, childProcessNamespaces, factsBuilder, callbacks, state));
124
+ }
125
+ function guardedCommandIdentifier(node, state) {
126
+ const [commandArgument] = node.arguments;
127
+ if (!commandArgument) {
128
+ return undefined;
129
+ }
130
+ const normalized = unwrapCommandExpression(commandArgument);
131
+ if (!ts.isIdentifier(normalized) || !sourcePathForExpression(normalized, state)) {
132
+ return undefined;
133
+ }
134
+ return hasCommandAllowlistGuard(node, normalized.text) && !hasUntrustedSpawnArguments(node, state)
135
+ ? normalized.text
136
+ : undefined;
137
+ }
138
+ function hasUntrustedSpawnArguments(node, state) {
139
+ const methodName = commandExecutionName(node.expression);
140
+ if (methodName !== "spawn" && methodName !== "spawnSync") {
141
+ return false;
142
+ }
143
+ return node.arguments.slice(1).some((argument) => Boolean(findCommandSourcePathInExpression(argument, state)));
144
+ }
145
+ function createCommandFlowState(factsBuilder, scopeRoot, callbacks) {
146
+ return {
147
+ factsBuilder,
148
+ scopeRoot,
149
+ callbacks,
150
+ declared: new Set(),
151
+ initialized: new Set(),
152
+ invalidated: new Set(),
153
+ tracked: new Map()
154
+ };
155
+ }
156
+ function createBoundedFlowContext(state) {
157
+ return {
158
+ scopeRoot: state.scopeRoot,
159
+ findSourcePathInExpression: (node) => findCommandSourcePathInExpression(node, state),
160
+ findSourcePathInArguments: (node) => findCommandSourcePathInArguments(node, state),
161
+ recordSink: (node, kind) => {
162
+ state.factsBuilder.sinkFacts.set(node, { node, scope: state.scopeRoot, kind });
163
+ },
164
+ recordEvidencePath: (node, path) => {
165
+ state.factsBuilder.evidencePaths.set(node, path);
166
+ }
167
+ };
168
+ }
169
+ function recordCommandDeclaration(node, state) {
170
+ if (ts.isIdentifier(node.name)) {
171
+ state.declared.add(node.name.text);
172
+ if (!node.initializer) {
173
+ return;
174
+ }
175
+ state.initialized.add(node.name.text);
176
+ const value = sourcePathForAssignment(node.initializer, state, node.name.text);
177
+ recordIdentifierAlias(node, node.name.text, node.initializer, value, state);
178
+ trackCommandValue(node.name.text, value, state);
179
+ return;
180
+ }
181
+ if (!ts.isObjectBindingPattern(node.name) || !node.initializer) {
182
+ return;
183
+ }
184
+ const base = sourcePathForReference(node.initializer, state);
185
+ for (const element of node.name.elements) {
186
+ const localName = bindingElementLocalName(element);
187
+ const propertyName = bindingElementName(element);
188
+ if (!localName) {
189
+ continue;
190
+ }
191
+ state.declared.add(localName);
192
+ state.initialized.add(localName);
193
+ trackCommandValue(localName, base && propertyName ? commandProperty(base, propertyName) : undefined, state);
194
+ }
195
+ }
196
+ function recordCommandAssignment(node, state) {
197
+ const target = commandTargetIdentifier(node.left);
198
+ if (!target) {
199
+ invalidateTaintedReferences(node.left, state, "reassignment");
200
+ return;
201
+ }
202
+ if (node.operatorToken.kind !== ts.SyntaxKind.EqualsToken) {
203
+ invalidateCommandTarget(node.left, state, "mutation");
204
+ return;
205
+ }
206
+ if (state.invalidated.has(target) || state.initialized.has(target)) {
207
+ invalidateCommandTarget(node.left, state, "reassignment");
208
+ return;
209
+ }
210
+ state.declared.add(target);
211
+ state.initialized.add(target);
212
+ const value = sourcePathForAssignment(node.right, state, target);
213
+ recordIdentifierAlias(node, target, node.right, value, state);
214
+ trackCommandValue(target, value, state);
215
+ }
216
+ function recordIdentifierAlias(node, target, expression, value, state) {
217
+ const normalized = unwrapCommandExpression(expression);
218
+ if (!value || value.aliasDepth > COMMAND_ALIAS_LIMIT || !ts.isIdentifier(normalized) || normalized.text === target) {
219
+ return;
220
+ }
221
+ state.factsBuilder.aliasFacts.push({
222
+ node,
223
+ scope: state.scopeRoot,
224
+ from: normalized.text,
225
+ to: target,
226
+ depth: value.aliasDepth,
227
+ path: value.path
228
+ });
229
+ }
230
+ function trackCommandValue(name, value, state) {
231
+ if (!value || value.aliasDepth > COMMAND_ALIAS_LIMIT || state.invalidated.has(name)) {
232
+ state.tracked.delete(name);
233
+ return;
234
+ }
235
+ state.tracked.set(name, value);
236
+ }
237
+ function findCommandSourcePathInArguments(node, state) {
238
+ for (const argument of node.arguments) {
239
+ const sourcePath = findCommandSourcePathInExpression(argument, state);
240
+ if (sourcePath) {
241
+ return sourcePath;
242
+ }
243
+ }
244
+ return undefined;
245
+ }
246
+ function findCommandSourcePathInExpression(node, state) {
247
+ const directSource = sourcePathForExpression(node, state);
248
+ if (directSource) {
249
+ return directSource.path;
250
+ }
251
+ let sourcePath;
252
+ ts.forEachChild(node, (child) => {
253
+ if (sourcePath || isCommandFunctionLike(child)) {
254
+ return;
255
+ }
256
+ sourcePath = findCommandSourcePathInExpression(child, state);
257
+ });
258
+ return sourcePath;
259
+ }
260
+ function sourcePathForExpression(expression, state) {
261
+ const normalized = unwrapCommandExpression(expression);
262
+ if (ts.isBinaryExpression(normalized)) {
263
+ return sourcePathForExpression(normalized.left, state) ?? sourcePathForExpression(normalized.right, state);
264
+ }
265
+ if (ts.isConditionalExpression(normalized)) {
266
+ return sourcePathForExpression(normalized.whenTrue, state) ?? sourcePathForExpression(normalized.whenFalse, state);
267
+ }
268
+ if (ts.isIdentifier(normalized)) {
269
+ const tracked = state.tracked.get(normalized.text);
270
+ if (tracked && !state.invalidated.has(normalized.text)) {
271
+ return tracked;
272
+ }
273
+ if (ROUTE_PARAMS_NAMES.test(normalized.text)) {
274
+ return recordDirectSource(normalized, { path: normalized.text, aliasDepth: 0 }, state);
275
+ }
276
+ return undefined;
277
+ }
278
+ return sourcePathForReference(normalized, state);
279
+ }
280
+ function sourcePathForAssignment(expression, state, targetName) {
281
+ const normalized = unwrapCommandExpression(expression);
282
+ if (ts.isIdentifier(normalized)) {
283
+ const tracked = state.tracked.get(normalized.text);
284
+ if (tracked && !state.invalidated.has(normalized.text)) {
285
+ return commandAlias(tracked, targetName ?? normalized.text);
286
+ }
287
+ }
288
+ return sourcePathForExpression(normalized, state);
289
+ }
290
+ function sourcePathForReference(expression, state) {
291
+ const normalized = unwrapCommandExpression(expression);
292
+ if (ts.isIdentifier(normalized)) {
293
+ if (state.invalidated.has(normalized.text)) {
294
+ return undefined;
295
+ }
296
+ const tracked = state.tracked.get(normalized.text);
297
+ if (tracked) {
298
+ return tracked;
299
+ }
300
+ if (ROUTE_PARAMS_NAMES.test(normalized.text)) {
301
+ return recordDirectSource(normalized, { path: normalized.text, aliasDepth: 0 }, state);
302
+ }
303
+ return undefined;
304
+ }
305
+ if (ts.isPropertyAccessExpression(normalized)) {
306
+ const directSource = directCommandPropertySource(normalized);
307
+ if (directSource) {
308
+ return recordDirectSource(normalized, directSource, state);
309
+ }
310
+ const base = sourcePathForReference(normalized.expression, state);
311
+ return base ? commandProperty(base, normalized.name.text) : undefined;
312
+ }
313
+ if (ts.isElementAccessExpression(normalized)) {
314
+ const propertyName = normalized.argumentExpression && literalText(normalized.argumentExpression);
315
+ if (!propertyName) {
316
+ return undefined;
317
+ }
318
+ const directSource = directCommandElementSource(normalized, propertyName);
319
+ if (directSource) {
320
+ return recordDirectSource(normalized, directSource, state);
321
+ }
322
+ const base = sourcePathForReference(normalized.expression, state);
323
+ return base ? commandProperty(base, propertyName) : undefined;
324
+ }
325
+ if (ts.isCallExpression(normalized) && ts.isPropertyAccessExpression(normalized.expression)) {
326
+ const methodName = normalized.expression.name.text;
327
+ const receiver = normalized.expression.expression;
328
+ if ((methodName === "json" || methodName === "formData") && isRequestSourceReceiver(receiver)) {
329
+ return recordDirectSource(normalized, { path: `${commandExpressionLabel(receiver)}.${methodName}()`, aliasDepth: 0 }, state);
330
+ }
331
+ if (methodName === "get") {
332
+ if (isSearchParamsReceiver(receiver)) {
333
+ return recordDirectSource(normalized, { path: `${commandExpressionLabel(receiver)}.get()`, aliasDepth: 0 }, state);
334
+ }
335
+ const base = sourcePathForReference(receiver, state);
336
+ return base ? commandProperty(base, "get()") : undefined;
337
+ }
338
+ }
339
+ return undefined;
340
+ }
341
+ function recordDirectSource(node, value, state) {
342
+ state.factsBuilder.sourceFacts.set(node, {
343
+ node,
344
+ path: value.path,
345
+ scope: state.scopeRoot
346
+ });
347
+ return value;
348
+ }
349
+ function directCommandPropertySource(node) {
350
+ if (!isRequestSourceReceiver(node.expression) || (node.name.text !== "body" && node.name.text !== "query")) {
351
+ return undefined;
352
+ }
353
+ return { path: `${commandExpressionLabel(node.expression)}.${node.name.text}`, aliasDepth: 0 };
354
+ }
355
+ function directCommandElementSource(node, propertyName) {
356
+ if (!isRequestSourceReceiver(node.expression) || (propertyName !== "body" && propertyName !== "query")) {
357
+ return undefined;
358
+ }
359
+ return { path: `${commandExpressionLabel(node.expression)}.${propertyName}`, aliasDepth: 0 };
360
+ }
361
+ function commandProperty(value, propertyName) {
362
+ return {
363
+ path: `${value.path} -> ${propertyName}`,
364
+ aliasDepth: value.aliasDepth
365
+ };
366
+ }
367
+ function commandAlias(value, aliasName) {
368
+ return {
369
+ path: `${value.path} -> ${aliasName}`,
370
+ aliasDepth: value.aliasDepth + 1
371
+ };
372
+ }
373
+ function invalidateCommandTarget(node, state, reason) {
374
+ const target = commandTargetIdentifier(node);
375
+ if (target) {
376
+ recordInvalidation(node, target, reason, state);
377
+ state.tracked.delete(target);
378
+ state.invalidated.add(target);
379
+ }
380
+ invalidateTaintedReferences(node, state, reason);
381
+ }
382
+ function invalidateTaintedReferences(node, state, reason) {
383
+ const identifiers = new Set();
384
+ visitCommandNodes(node, (child) => {
385
+ if (!ts.isIdentifier(child) || !state.tracked.has(child.text)) {
386
+ return;
387
+ }
388
+ if (ts.isPropertyAccessExpression(child.parent) && child.parent.name === child) {
389
+ return;
390
+ }
391
+ identifiers.add(child.text);
392
+ });
393
+ for (const identifier of identifiers) {
394
+ recordInvalidation(node, identifier, reason, state);
395
+ state.tracked.delete(identifier);
396
+ state.invalidated.add(identifier);
397
+ }
398
+ }
399
+ function recordInvalidation(node, identifier, reason, state) {
400
+ state.factsBuilder.invalidationFacts.push({ node, scope: state.scopeRoot, identifier, reason });
401
+ state.callbacks.onInvalidation?.(identifier, reason, createBoundedFlowContext(state));
402
+ }
403
+ function commandTargetIdentifier(node) {
404
+ if (ts.isIdentifier(node)) {
405
+ return node.text;
406
+ }
407
+ if (ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node)) {
408
+ return commandTargetIdentifier(node.expression);
409
+ }
410
+ return undefined;
411
+ }
412
+ function unwrapCommandExpression(expression) {
413
+ let current = expression;
414
+ while (ts.isParenthesizedExpression(current) ||
415
+ ts.isAwaitExpression(current) ||
416
+ ts.isNonNullExpression(current) ||
417
+ ts.isAsExpression(current) ||
418
+ ts.isTypeAssertionExpression(current)) {
419
+ current = current.expression;
420
+ }
421
+ return current;
422
+ }
423
+ function isRequestSourceReceiver(expression) {
424
+ return ts.isIdentifier(expression) && REQUEST_SOURCE_NAMES.test(expression.text);
425
+ }
426
+ function isSearchParamsReceiver(expression) {
427
+ if (ts.isIdentifier(expression)) {
428
+ return SEARCH_PARAMS_NAME.test(expression.text);
429
+ }
430
+ return ts.isPropertyAccessExpression(expression) && SEARCH_PARAMS_NAME.test(expression.name.text);
431
+ }
432
+ function commandExpressionLabel(expression) {
433
+ if (ts.isIdentifier(expression)) {
434
+ return expression.text;
435
+ }
436
+ if (ts.isPropertyAccessExpression(expression)) {
437
+ return `${commandExpressionLabel(expression.expression)}.${expression.name.text}`;
438
+ }
439
+ return "source";
440
+ }
441
+ function literalText(node) {
442
+ return ts.isStringLiteralLike(node) || ts.isNumericLiteral(node) ? node.text : undefined;
443
+ }
444
+ function isCommandFunctionLike(node) {
445
+ return (ts.isArrowFunction(node) ||
446
+ ts.isConstructorDeclaration(node) ||
447
+ ts.isFunctionDeclaration(node) ||
448
+ ts.isFunctionExpression(node) ||
449
+ ts.isGetAccessorDeclaration(node) ||
450
+ ts.isMethodDeclaration(node) ||
451
+ ts.isSetAccessorDeclaration(node));
452
+ }
453
+ function collectFunctionBoundaryFacts(sourceFile, factsBuilder) {
454
+ visitCommandNodes(sourceFile, (node) => {
455
+ if (isCommandFunctionLike(node)) {
456
+ factsBuilder.functionBoundaryFacts.push({ node });
457
+ }
458
+ });
459
+ }
460
+ function commandFunctionBody(node) {
461
+ return node.body;
462
+ }
463
+ function visitCommandNodes(node, callback) {
464
+ callback(node);
465
+ ts.forEachChild(node, (child) => visitCommandNodes(child, callback));
466
+ }
467
+ //# sourceMappingURL=command-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-flow.js","sourceRoot":"","sources":["../src/command-flow.ts"],"names":[],"mappings":"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"}