@nodesecure/js-x-ray 9.0.0 → 9.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +9 -209
  3. package/dist/AstAnalyser.d.ts +64 -0
  4. package/dist/AstAnalyser.d.ts.map +1 -0
  5. package/dist/AstAnalyser.js +165 -0
  6. package/dist/AstAnalyser.js.map +1 -0
  7. package/dist/Deobfuscator.d.ts +36 -0
  8. package/dist/Deobfuscator.d.ts.map +1 -0
  9. package/dist/Deobfuscator.js +154 -0
  10. package/dist/Deobfuscator.js.map +1 -0
  11. package/dist/EntryFilesAnalyser.d.ts +20 -0
  12. package/dist/EntryFilesAnalyser.d.ts.map +1 -0
  13. package/dist/EntryFilesAnalyser.js +121 -0
  14. package/dist/EntryFilesAnalyser.js.map +1 -0
  15. package/dist/JsSourceParser.d.ts +18 -0
  16. package/dist/JsSourceParser.d.ts.map +1 -0
  17. package/dist/JsSourceParser.js +38 -0
  18. package/dist/JsSourceParser.js.map +1 -0
  19. package/dist/NodeCounter.d.ts +24 -0
  20. package/dist/NodeCounter.d.ts.map +1 -0
  21. package/dist/NodeCounter.js +62 -0
  22. package/dist/NodeCounter.js.map +1 -0
  23. package/dist/ProbeRunner.d.ts +40 -0
  24. package/dist/ProbeRunner.d.ts.map +1 -0
  25. package/dist/ProbeRunner.js +106 -0
  26. package/dist/ProbeRunner.js.map +1 -0
  27. package/dist/SourceFile.d.ts +43 -0
  28. package/dist/SourceFile.d.ts.map +1 -0
  29. package/dist/SourceFile.js +137 -0
  30. package/dist/SourceFile.js.map +1 -0
  31. package/dist/index.d.ts +6 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +6 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/obfuscators/freejsobfuscator.d.ts +3 -0
  36. package/dist/obfuscators/freejsobfuscator.d.ts.map +1 -0
  37. package/dist/obfuscators/freejsobfuscator.js +10 -0
  38. package/dist/obfuscators/freejsobfuscator.js.map +1 -0
  39. package/dist/obfuscators/jjencode.d.ts +3 -0
  40. package/dist/obfuscators/jjencode.d.ts.map +1 -0
  41. package/dist/obfuscators/jjencode.js +24 -0
  42. package/dist/obfuscators/jjencode.js.map +1 -0
  43. package/dist/obfuscators/jsfuck.d.ts +3 -0
  44. package/dist/obfuscators/jsfuck.d.ts.map +1 -0
  45. package/dist/obfuscators/jsfuck.js +13 -0
  46. package/dist/obfuscators/jsfuck.js.map +1 -0
  47. package/dist/obfuscators/obfuscator-io.d.ts +3 -0
  48. package/dist/obfuscators/obfuscator-io.d.ts.map +1 -0
  49. package/dist/obfuscators/obfuscator-io.js +15 -0
  50. package/dist/obfuscators/obfuscator-io.js.map +1 -0
  51. package/dist/obfuscators/trojan-source.d.ts +2 -0
  52. package/dist/obfuscators/trojan-source.d.ts.map +1 -0
  53. package/dist/obfuscators/trojan-source.js +27 -0
  54. package/dist/obfuscators/trojan-source.js.map +1 -0
  55. package/dist/probes/isArrayExpression.d.ts +21 -0
  56. package/dist/probes/isArrayExpression.d.ts.map +1 -0
  57. package/{src → dist}/probes/isArrayExpression.js +10 -15
  58. package/dist/probes/isArrayExpression.js.map +1 -0
  59. package/dist/probes/isBinaryExpression.d.ts +21 -0
  60. package/dist/probes/isBinaryExpression.d.ts.map +1 -0
  61. package/dist/probes/isBinaryExpression.js +54 -0
  62. package/dist/probes/isBinaryExpression.js.map +1 -0
  63. package/dist/probes/isESMExport.d.ts +24 -0
  64. package/dist/probes/isESMExport.d.ts.map +1 -0
  65. package/dist/probes/isESMExport.js +30 -0
  66. package/dist/probes/isESMExport.js.map +1 -0
  67. package/dist/probes/isFetch.d.ts +14 -0
  68. package/dist/probes/isFetch.d.ts.map +1 -0
  69. package/dist/probes/isFetch.js +18 -0
  70. package/dist/probes/isFetch.js.map +1 -0
  71. package/dist/probes/isImportDeclaration.d.ts +26 -0
  72. package/dist/probes/isImportDeclaration.d.ts.map +1 -0
  73. package/dist/probes/isImportDeclaration.js +38 -0
  74. package/dist/probes/isImportDeclaration.js.map +1 -0
  75. package/dist/probes/isLiteral.d.ts +21 -0
  76. package/dist/probes/isLiteral.d.ts.map +1 -0
  77. package/dist/probes/isLiteral.js +66 -0
  78. package/dist/probes/isLiteral.js.map +1 -0
  79. package/dist/probes/isLiteralRegex.d.ts +20 -0
  80. package/dist/probes/isLiteralRegex.d.ts.map +1 -0
  81. package/dist/probes/isLiteralRegex.js +30 -0
  82. package/dist/probes/isLiteralRegex.js.map +1 -0
  83. package/dist/probes/isRegexObject.d.ts +22 -0
  84. package/dist/probes/isRegexObject.d.ts.map +1 -0
  85. package/dist/probes/isRegexObject.js +50 -0
  86. package/dist/probes/isRegexObject.js.map +1 -0
  87. package/dist/probes/isRequire/RequireCallExpressionWalker.d.ts +15 -0
  88. package/dist/probes/isRequire/RequireCallExpressionWalker.d.ts.map +1 -0
  89. package/dist/probes/isRequire/RequireCallExpressionWalker.js +95 -0
  90. package/dist/probes/isRequire/RequireCallExpressionWalker.js.map +1 -0
  91. package/dist/probes/isRequire/isRequire.d.ts +20 -0
  92. package/dist/probes/isRequire/isRequire.d.ts.map +1 -0
  93. package/dist/probes/isRequire/isRequire.js +138 -0
  94. package/dist/probes/isRequire/isRequire.js.map +1 -0
  95. package/dist/probes/isSerializeEnv.d.ts +24 -0
  96. package/dist/probes/isSerializeEnv.d.ts.map +1 -0
  97. package/dist/probes/isSerializeEnv.js +66 -0
  98. package/dist/probes/isSerializeEnv.js.map +1 -0
  99. package/dist/probes/isSyncIO.d.ts +16 -0
  100. package/dist/probes/isSyncIO.d.ts.map +1 -0
  101. package/dist/probes/isSyncIO.js +74 -0
  102. package/dist/probes/isSyncIO.js.map +1 -0
  103. package/dist/probes/isUnsafeCallee.d.ts +22 -0
  104. package/dist/probes/isUnsafeCallee.d.ts.map +1 -0
  105. package/dist/probes/isUnsafeCallee.js +60 -0
  106. package/dist/probes/isUnsafeCallee.js.map +1 -0
  107. package/dist/probes/isUnsafeCommand.d.ts +24 -0
  108. package/dist/probes/isUnsafeCommand.d.ts.map +1 -0
  109. package/dist/probes/isUnsafeCommand.js +100 -0
  110. package/dist/probes/isUnsafeCommand.js.map +1 -0
  111. package/dist/probes/isWeakCrypto.d.ts +16 -0
  112. package/dist/probes/isWeakCrypto.d.ts.map +1 -0
  113. package/dist/probes/isWeakCrypto.js +46 -0
  114. package/dist/probes/isWeakCrypto.js.map +1 -0
  115. package/dist/types/estree.d.ts +11 -0
  116. package/dist/types/estree.d.ts.map +1 -0
  117. package/dist/types/estree.js +15 -0
  118. package/dist/types/estree.js.map +1 -0
  119. package/dist/utils/extractNode.d.ts +5 -0
  120. package/dist/utils/extractNode.d.ts.map +1 -0
  121. package/dist/utils/extractNode.js +13 -0
  122. package/dist/utils/extractNode.js.map +1 -0
  123. package/dist/utils/index.d.ts +5 -0
  124. package/dist/utils/index.d.ts.map +1 -0
  125. package/dist/utils/index.js +5 -0
  126. package/dist/utils/index.js.map +1 -0
  127. package/dist/utils/isOneLineExpressionExport.d.ts +3 -0
  128. package/dist/utils/isOneLineExpressionExport.d.ts.map +1 -0
  129. package/dist/utils/isOneLineExpressionExport.js +49 -0
  130. package/dist/utils/isOneLineExpressionExport.js.map +1 -0
  131. package/dist/utils/notNullOrUndefined.d.ts +2 -0
  132. package/dist/utils/notNullOrUndefined.d.ts.map +1 -0
  133. package/dist/utils/notNullOrUndefined.js +4 -0
  134. package/dist/utils/notNullOrUndefined.js.map +1 -0
  135. package/dist/utils/toArrayLocation.d.ts +5 -0
  136. package/dist/utils/toArrayLocation.d.ts.map +1 -0
  137. package/dist/utils/toArrayLocation.js +14 -0
  138. package/dist/utils/toArrayLocation.js.map +1 -0
  139. package/dist/warnings.d.ts +88 -0
  140. package/dist/warnings.d.ts.map +1 -0
  141. package/dist/warnings.js +91 -0
  142. package/dist/warnings.js.map +1 -0
  143. package/package.json +59 -77
  144. package/index.d.ts +0 -46
  145. package/index.js +0 -4
  146. package/src/AstAnalyser.js +0 -222
  147. package/src/Deobfuscator.js +0 -195
  148. package/src/EntryFilesAnalyser.js +0 -167
  149. package/src/JsSourceParser.js +0 -57
  150. package/src/NodeCounter.js +0 -76
  151. package/src/ProbeRunner.js +0 -144
  152. package/src/SourceFile.js +0 -147
  153. package/src/obfuscators/freejsobfuscator.js +0 -9
  154. package/src/obfuscators/jjencode.js +0 -27
  155. package/src/obfuscators/jsfuck.js +0 -11
  156. package/src/obfuscators/obfuscator-io.js +0 -13
  157. package/src/obfuscators/trojan-source.js +0 -28
  158. package/src/probes/isBinaryExpression.js +0 -55
  159. package/src/probes/isESMExport.js +0 -31
  160. package/src/probes/isFetch.js +0 -19
  161. package/src/probes/isImportDeclaration.js +0 -33
  162. package/src/probes/isLiteral.js +0 -70
  163. package/src/probes/isLiteralRegex.js +0 -31
  164. package/src/probes/isRegexObject.js +0 -49
  165. package/src/probes/isRequire/RequireCallExpressionWalker.js +0 -93
  166. package/src/probes/isRequire/isRequire.js +0 -148
  167. package/src/probes/isUnsafeCallee.js +0 -35
  168. package/src/probes/isWeakCrypto.js +0 -37
  169. package/src/utils/exportAssignmentHasRequireLeave.js +0 -40
  170. package/src/utils/extractNode.js +0 -14
  171. package/src/utils/index.js +0 -8
  172. package/src/utils/isNode.js +0 -5
  173. package/src/utils/isOneLineExpressionExport.js +0 -24
  174. package/src/utils/isUnsafeCallee.js +0 -28
  175. package/src/utils/notNullOrUndefined.js +0 -3
  176. package/src/utils/rootLocation.js +0 -3
  177. package/src/utils/toArrayLocation.js +0 -11
  178. package/src/warnings.js +0 -77
  179. package/types/api.d.ts +0 -177
  180. package/types/warnings.d.ts +0 -36
@@ -0,0 +1,18 @@
1
+ // Import Third-party Dependencies
2
+ import { getCallExpressionIdentifier } from "@nodesecure/estree-ast-utils";
3
+ // Import Internal Dependencies
4
+ import { SourceFile } from "../SourceFile.js";
5
+ function validateNode(node) {
6
+ const id = getCallExpressionIdentifier(node);
7
+ return [id === "fetch"];
8
+ }
9
+ function main(_node, { sourceFile }) {
10
+ sourceFile.flags.add("fetch");
11
+ }
12
+ export default {
13
+ name: "isFetch",
14
+ validateNode,
15
+ main,
16
+ breakOnMatch: false
17
+ };
18
+ //# sourceMappingURL=isFetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isFetch.js","sourceRoot":"","sources":["../../src/probes/isFetch.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAG3E,+BAA+B;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,SAAS,YAAY,CACnB,IAAiB;IAEjB,MAAM,EAAE,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;IAE7C,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,IAAI,CACX,KAAkB,EAClB,EAAE,UAAU,EAA+B;IAE3C,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,eAAe;IACb,IAAI,EAAE,SAAS;IACf,YAAY;IACZ,IAAI;IACJ,YAAY,EAAE,KAAK;CACpB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ESTree } from "meriyah";
2
+ import { SourceFile } from "../SourceFile.js";
3
+ import type { Literal } from "../types/estree.js";
4
+ /**
5
+ * @description Search for ESM ImportDeclaration
6
+ * @see https://github.com/estree/estree/blob/master/es2015.md#importdeclaration
7
+ * @example
8
+ * import * as foo from "bar";
9
+ * import fs from "fs";
10
+ * import "make-promises-safe";
11
+ */
12
+ declare function validateNode(node: ESTree.Node): [boolean, any?];
13
+ declare function main(node: (ESTree.ImportDeclaration | ESTree.ImportExpression) & {
14
+ source: Literal<string>;
15
+ }, options: {
16
+ sourceFile: SourceFile;
17
+ }): void;
18
+ declare const _default: {
19
+ name: string;
20
+ validateNode: typeof validateNode;
21
+ main: typeof main;
22
+ breakOnMatch: boolean;
23
+ breakGroup: string;
24
+ };
25
+ export default _default;
26
+ //# sourceMappingURL=isImportDeclaration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isImportDeclaration.d.ts","sourceRoot":"","sources":["../../src/probes/isImportDeclaration.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;;;;GAOG;AACH,iBAAS,YAAY,CACnB,IAAI,EAAE,MAAM,CAAC,IAAI,GAChB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAUjB;AAED,iBAAS,IAAI,CACX,IAAI,EAAE,CACF,MAAM,CAAC,iBAAiB,GACxB,MAAM,CAAC,gBAAgB,CAC1B,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CAAE,EAChC,OAAO,EAAE;IAAE,UAAU,EAAE,UAAU,CAAC;CAAE,QAcrC;;;;;;;;AAED,wBAME"}
@@ -0,0 +1,38 @@
1
+ // Import Internal Dependencies
2
+ import { SourceFile } from "../SourceFile.js";
3
+ import { generateWarning } from "../warnings.js";
4
+ /**
5
+ * @description Search for ESM ImportDeclaration
6
+ * @see https://github.com/estree/estree/blob/master/es2015.md#importdeclaration
7
+ * @example
8
+ * import * as foo from "bar";
9
+ * import fs from "fs";
10
+ * import "make-promises-safe";
11
+ */
12
+ function validateNode(node) {
13
+ if (node.type !== "ImportDeclaration" && node.type !== "ImportExpression") {
14
+ return [false];
15
+ }
16
+ // Note: the source property is the right-side Literal part of the Import
17
+ return [
18
+ node.source.type === "Literal" &&
19
+ typeof node.source.value === "string"
20
+ ];
21
+ }
22
+ function main(node, options) {
23
+ const { sourceFile } = options;
24
+ // Searching for dangerous import "data:text/javascript;..." statement.
25
+ // see: https://2ality.com/2019/10/eval-via-import.html
26
+ if (node.source.value.startsWith("data:text/javascript")) {
27
+ sourceFile.warnings.push(generateWarning("unsafe-import", { value: node.source.value, location: node.loc }));
28
+ }
29
+ sourceFile.addDependency(node.source.value, node.loc);
30
+ }
31
+ export default {
32
+ name: "isImportDeclaration",
33
+ validateNode,
34
+ main,
35
+ breakOnMatch: true,
36
+ breakGroup: "import"
37
+ };
38
+ //# sourceMappingURL=isImportDeclaration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isImportDeclaration.js","sourceRoot":"","sources":["../../src/probes/isImportDeclaration.ts"],"names":[],"mappings":"AAGA,+BAA+B;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD;;;;;;;GAOG;AACH,SAAS,YAAY,CACnB,IAAiB;IAEjB,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QAC1E,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAED,yEAAyE;IACzE,OAAO;QACL,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS;YAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ;KACtC,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CACX,IAGgC,EAChC,OAAoC;IAEpC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE/B,uEAAuE;IACvE,uDAAuD;IACvD,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACzD,UAAU,CAAC,QAAQ,CAAC,IAAI,CACtB,eAAe,CACb,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAClE,CACF,CAAC;IACJ,CAAC;IACD,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AACxD,CAAC;AAED,eAAe;IACb,IAAI,EAAE,qBAAqB;IAC3B,YAAY;IACZ,IAAI;IACJ,YAAY,EAAE,IAAI;IAClB,UAAU,EAAE,QAAQ;CACrB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { ESTree } from "meriyah";
2
+ import { SourceFile } from "../SourceFile.js";
3
+ import type { Literal } from "../types/estree.js";
4
+ /**
5
+ * @description Search for Literal AST Node
6
+ * @see https://github.com/estree/estree/blob/master/es5.md#literal
7
+ * @example
8
+ * "foobar"
9
+ */
10
+ declare function validateNode(node: ESTree.Node): [boolean, any?];
11
+ declare function main(node: Literal<string>, options: {
12
+ sourceFile: SourceFile;
13
+ }): void;
14
+ declare const _default: {
15
+ name: string;
16
+ validateNode: typeof validateNode;
17
+ main: typeof main;
18
+ breakOnMatch: boolean;
19
+ };
20
+ export default _default;
21
+ //# sourceMappingURL=isLiteral.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isLiteral.d.ts","sourceRoot":"","sources":["../../src/probes/isLiteral.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAiBlD;;;;;GAKG;AACH,iBAAS,YAAY,CACnB,IAAI,EAAE,MAAM,CAAC,IAAI,GAChB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAIjB;AAED,iBAAS,IAAI,CACX,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EACrB,OAAO,EAAE;IAAE,UAAU,EAAE,UAAU,CAAC;CAAE,QAwCrC;;;;;;;AAED,wBAKE"}
@@ -0,0 +1,66 @@
1
+ // Import Node.js Dependencies
2
+ import { builtinModules } from "node:module";
3
+ // Import Third-party Dependencies
4
+ import { Hex } from "@nodesecure/sec-literal";
5
+ // Import Internal Dependencies
6
+ import { SourceFile } from "../SourceFile.js";
7
+ import { generateWarning } from "../warnings.js";
8
+ const kMapRegexIps = Object.freeze({
9
+ // eslint-disable-next-line @stylistic/max-len
10
+ regexIPv4: /^(https?:\/\/)(?!127\.)(?!.*:(?:0{1,3}|25[6-9])\.)(?!.*:(?:25[6-9])\.(?:0{1,3}|25[6-9])\.)(?!.*:(?:25[6-9])\.(?:25[6-9])\.(?:0{1,3}|25[6-9])\.)(?!.*:(?:25[6-9])\.(?:25[6-9])\.(?:25[6-9])\.(?:0{1,3}|25[6-9]))((?:\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])\.){3}(?:\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])(?::\d{1,5})?(\/[^\s]*)?$/,
11
+ regexIPv6: /^(https?:\/\/)(\[[0-9A-Fa-f:]+\])(?::\d{1,5})?(\/[^\s]*)?$/
12
+ });
13
+ // CONSTANTS
14
+ const kNodeDeps = new Set(builtinModules);
15
+ const kShadyLinkRegExps = [
16
+ kMapRegexIps.regexIPv4,
17
+ kMapRegexIps.regexIPv6,
18
+ /(http[s]?:\/\/(bit\.ly|ipinfo\.io|httpbin\.org).*)$/,
19
+ /(http[s]?:\/\/.*\.(link|xyz|tk|ml|ga|cf|gq|pw|top|club|mw|bd|ke|am|sbs|date|quest|cd|bid|cd|ws|icu|cam|uno|email|stream))$/
20
+ ];
21
+ /**
22
+ * @description Search for Literal AST Node
23
+ * @see https://github.com/estree/estree/blob/master/es5.md#literal
24
+ * @example
25
+ * "foobar"
26
+ */
27
+ function validateNode(node) {
28
+ return [
29
+ node.type === "Literal" && typeof node.value === "string"
30
+ ];
31
+ }
32
+ function main(node, options) {
33
+ const { sourceFile } = options;
34
+ const location = node.loc ?? void 0;
35
+ // We are searching for value obfuscated as hex of a minimum length of 4.
36
+ if (/^[0-9A-Fa-f]{4,}$/g.test(node.value)) {
37
+ const value = Buffer.from(node.value, "hex").toString();
38
+ sourceFile.deobfuscator.analyzeString(value);
39
+ // If the value we are retrieving is the name of a Node.js dependency,
40
+ // then we add it to the dependencies list and we throw an unsafe-import at the current location.
41
+ if (kNodeDeps.has(value)) {
42
+ sourceFile.addDependency(value, node.loc);
43
+ sourceFile.warnings.push(generateWarning("unsafe-import", { value: null, location }));
44
+ }
45
+ else if (value === "require" || !Hex.isSafe(node.value)) {
46
+ sourceFile.addEncodedLiteral(node.value, location);
47
+ }
48
+ }
49
+ // Else we are checking all other string with our suspect method
50
+ else {
51
+ for (const regex of kShadyLinkRegExps) {
52
+ if (regex.test(node.value)) {
53
+ sourceFile.warnings.push(generateWarning("shady-link", { value: node.value, location }));
54
+ return;
55
+ }
56
+ }
57
+ sourceFile.analyzeLiteral(node);
58
+ }
59
+ }
60
+ export default {
61
+ name: "isLiteral",
62
+ validateNode,
63
+ main,
64
+ breakOnMatch: false
65
+ };
66
+ //# sourceMappingURL=isLiteral.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isLiteral.js","sourceRoot":"","sources":["../../src/probes/isLiteral.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,kCAAkC;AAClC,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAG9C,+BAA+B;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IACjC,8CAA8C;IAC9C,SAAS,EAAE,uTAAuT;IAClU,SAAS,EAAE,4DAA4D;CACxE,CAAC,CAAC;AAEH,YAAY;AACZ,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;AAC1C,MAAM,iBAAiB,GAAG;IACxB,YAAY,CAAC,SAAS;IACtB,YAAY,CAAC,SAAS;IACtB,qDAAqD;IACrD,4HAA4H;CAC7H,CAAC;AAEF;;;;;GAKG;AACH,SAAS,YAAY,CACnB,IAAiB;IAEjB,OAAO;QACL,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;KAC1D,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CACX,IAAqB,EACrB,OAAoC;IAEpC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;IAEpC,yEAAyE;IACzE,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxD,UAAU,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAE7C,sEAAsE;QACtE,iGAAiG;QACjG,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1C,UAAU,CAAC,QAAQ,CAAC,IAAI,CACtB,eAAe,CACb,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAC3C,CACF,CAAC;QACJ,CAAC;aACI,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,gEAAgE;SAC3D,CAAC;QACJ,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,UAAU,CAAC,QAAQ,CAAC,IAAI,CACtB,eAAe,CACb,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,CAC9C,CACF,CAAC;gBAEF,OAAO;YACT,CAAC;QACH,CAAC;QAED,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,eAAe;IACb,IAAI,EAAE,WAAW;IACjB,YAAY;IACZ,IAAI;IACJ,YAAY,EAAE,KAAK;CACpB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { ESTree } from "meriyah";
2
+ import { SourceFile } from "../SourceFile.js";
3
+ /**
4
+ * @description Search for RegExpLiteral AST Node
5
+ * @see https://github.com/estree/estree/blob/master/es5.md#regexpliteral
6
+ * @example
7
+ * /hello/
8
+ */
9
+ declare function validateNode(node: ESTree.Node): [boolean, any?];
10
+ declare function main(node: ESTree.RegExpLiteral, options: {
11
+ sourceFile: SourceFile;
12
+ }): void;
13
+ declare const _default: {
14
+ name: string;
15
+ validateNode: typeof validateNode;
16
+ main: typeof main;
17
+ breakOnMatch: boolean;
18
+ };
19
+ export default _default;
20
+ //# sourceMappingURL=isLiteralRegex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isLiteralRegex.d.ts","sourceRoot":"","sources":["../../src/probes/isLiteralRegex.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C;;;;;GAKG;AACH,iBAAS,YAAY,CACnB,IAAI,EAAE,MAAM,CAAC,IAAI,GAChB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAIjB;AAED,iBAAS,IAAI,CACX,IAAI,EAAE,MAAM,CAAC,aAAa,EAC1B,OAAO,EAAE;IAAE,UAAU,EAAE,UAAU,CAAC;CAAE,QAUrC;;;;;;;AAED,wBAKE"}
@@ -0,0 +1,30 @@
1
+ // Import Third-party Dependencies
2
+ import safeRegex from "safe-regex";
3
+ // Import Internal Dependencies
4
+ import { SourceFile } from "../SourceFile.js";
5
+ import { generateWarning } from "../warnings.js";
6
+ /**
7
+ * @description Search for RegExpLiteral AST Node
8
+ * @see https://github.com/estree/estree/blob/master/es5.md#regexpliteral
9
+ * @example
10
+ * /hello/
11
+ */
12
+ function validateNode(node) {
13
+ return [
14
+ node.type === "Literal" && "regex" in node
15
+ ];
16
+ }
17
+ function main(node, options) {
18
+ const { sourceFile } = options;
19
+ // We use the safe-regex package to detect whether or not regex is safe!
20
+ if (!safeRegex(node.regex.pattern)) {
21
+ sourceFile.warnings.push(generateWarning("unsafe-regex", { value: node.regex.pattern, location: node.loc }));
22
+ }
23
+ }
24
+ export default {
25
+ name: "isLiteralRegex",
26
+ validateNode,
27
+ main,
28
+ breakOnMatch: false
29
+ };
30
+ //# sourceMappingURL=isLiteralRegex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isLiteralRegex.js","sourceRoot":"","sources":["../../src/probes/isLiteralRegex.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,OAAO,SAAS,MAAM,YAAY,CAAC;AAGnC,+BAA+B;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;GAKG;AACH,SAAS,YAAY,CACnB,IAAiB;IAEjB,OAAO;QACL,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,IAAI;KAC3C,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CACX,IAA0B,EAC1B,OAAoC;IAEpC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE/B,wEAAwE;IACxE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,UAAU,CAAC,QAAQ,CAAC,IAAI,CACtB,eAAe,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CACnF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,eAAe;IACb,IAAI,EAAE,gBAAgB;IACtB,YAAY;IACZ,IAAI;IACJ,YAAY,EAAE,KAAK;CACpB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { ESTree } from "meriyah";
2
+ import { SourceFile } from "../SourceFile.js";
3
+ /**
4
+ * @description Search for Regex Object constructor.
5
+ * @see https://github.com/estree/estree/blob/master/es5.md#newexpression
6
+ * @example
7
+ * new RegExp("...");
8
+ */
9
+ declare function validateNode(node: ESTree.Node): [boolean, any?];
10
+ declare function main(node: ESTree.NewExpression & {
11
+ callee: ESTree.Identifier;
12
+ }, options: {
13
+ sourceFile: SourceFile;
14
+ }): void;
15
+ declare const _default: {
16
+ name: string;
17
+ validateNode: typeof validateNode;
18
+ main: typeof main;
19
+ breakOnMatch: boolean;
20
+ };
21
+ export default _default;
22
+ //# sourceMappingURL=isRegexObject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isRegexObject.d.ts","sourceRoot":"","sources":["../../src/probes/isRegexObject.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C;;;;;GAKG;AACH,iBAAS,YAAY,CACnB,IAAI,EAAE,MAAM,CAAC,IAAI,GAChB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAIjB;AAED,iBAAS,IAAI,CACX,IAAI,EAAE,MAAM,CAAC,aAAa,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC;CAC3B,EACD,OAAO,EAAE;IAAE,UAAU,EAAE,UAAU,CAAC;CAAE,QA0BrC;;;;;;;AAYD,wBAKE"}
@@ -0,0 +1,50 @@
1
+ // Import Third-party Dependencies
2
+ import safeRegex from "safe-regex";
3
+ // Import Internal Dependencies
4
+ import { SourceFile } from "../SourceFile.js";
5
+ import { generateWarning } from "../warnings.js";
6
+ /**
7
+ * @description Search for Regex Object constructor.
8
+ * @see https://github.com/estree/estree/blob/master/es5.md#newexpression
9
+ * @example
10
+ * new RegExp("...");
11
+ */
12
+ function validateNode(node) {
13
+ return [
14
+ isRegexConstructor(node) && node.arguments.length > 0
15
+ ];
16
+ }
17
+ function main(node, options) {
18
+ const { sourceFile } = options;
19
+ const arg = node.arguments.at(0);
20
+ if (!arg) {
21
+ return;
22
+ }
23
+ /**
24
+ * Note: RegExp Object can contain a RegExpLiteral
25
+ * @see https://github.com/estree/estree/blob/master/es5.md#regexpliteral
26
+ *
27
+ * @example
28
+ * new RegExp(/^foo/)
29
+ */
30
+ const pattern = arg.type === "Literal" && "regex" in arg ?
31
+ arg.regex.pattern :
32
+ arg.value;
33
+ // We use the safe-regex package to detect whether or not regex is safe!
34
+ if (!safeRegex(pattern)) {
35
+ sourceFile.warnings.push(generateWarning("unsafe-regex", { value: pattern, location: node.loc }));
36
+ }
37
+ }
38
+ function isRegexConstructor(node) {
39
+ if (node.type !== "NewExpression" || node.callee.type !== "Identifier") {
40
+ return false;
41
+ }
42
+ return node.callee.name === "RegExp";
43
+ }
44
+ export default {
45
+ name: "isRegexObject",
46
+ validateNode,
47
+ main,
48
+ breakOnMatch: false
49
+ };
50
+ //# sourceMappingURL=isRegexObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isRegexObject.js","sourceRoot":"","sources":["../../src/probes/isRegexObject.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,OAAO,SAAS,MAAM,YAAY,CAAC;AAGnC,+BAA+B;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD;;;;;GAKG;AACH,SAAS,YAAY,CACnB,IAAiB;IAEjB,OAAO;QACL,kBAAkB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CACX,IAEC,EACD,OAAoC;IAEpC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE/B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAA4C,CAAC;IAC5E,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IAED;;;;;;OAMG;IACH,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,GAAG,CAAC,CAAC;QACxD,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnB,GAAG,CAAC,KAAK,CAAC;IAEZ,wEAAwE;IACxE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,UAAU,CAAC,QAAQ,CAAC,IAAI,CACtB,eAAe,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CACxE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,IAAiB;IAEjB,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACvE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;AACvC,CAAC;AAED,eAAe;IACb,IAAI,EAAE,eAAe;IACrB,YAAY;IACZ,IAAI;IACJ,YAAY,EAAE,KAAK;CACpB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ESTree } from "meriyah";
2
+ import { VariableTracer } from "@nodesecure/tracer";
3
+ export declare class RequireCallExpressionWalker {
4
+ #private;
5
+ tracer: VariableTracer;
6
+ dependencies: Set<string>;
7
+ triggerWarning: boolean;
8
+ constructor(tracer: VariableTracer);
9
+ reset(): void;
10
+ walk(callExprNode: ESTree.CallExpression): {
11
+ dependencies: Set<string>;
12
+ triggerWarning: boolean;
13
+ };
14
+ }
15
+ //# sourceMappingURL=RequireCallExpressionWalker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequireCallExpressionWalker.d.ts","sourceRoot":"","sources":["../../../src/probes/isRequire/RequireCallExpressionWalker.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAQpD,qBAAa,2BAA2B;;IACtC,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,cAAqB;IACjC,cAAc,UAAQ;gBAGpB,MAAM,EAAE,cAAc;IAKxB,KAAK;IAKL,IAAI,CACF,YAAY,EAAE,MAAM,CAAC,cAAc;;;;CAwGtC"}
@@ -0,0 +1,95 @@
1
+ // Import Node.js Dependencies
2
+ import path from "node:path";
3
+ // Import Third-party Dependencies
4
+ import { Hex } from "@nodesecure/sec-literal";
5
+ import { walk as doWalk } from "estree-walker";
6
+ import { arrayExpressionToString, getMemberExpressionIdentifier, getCallExpressionArguments } from "@nodesecure/estree-ast-utils";
7
+ import { VariableTracer } from "@nodesecure/tracer";
8
+ // Import Internal Dependencies
9
+ import { isLiteral, isCallExpression } from "../../types/estree.js";
10
+ export class RequireCallExpressionWalker {
11
+ tracer;
12
+ dependencies = new Set();
13
+ triggerWarning = true;
14
+ constructor(tracer) {
15
+ this.tracer = tracer;
16
+ }
17
+ reset() {
18
+ this.dependencies.clear();
19
+ this.triggerWarning = true;
20
+ }
21
+ walk(callExprNode) {
22
+ this.reset();
23
+ // we need the `this` context of doWalk.enter
24
+ const self = this;
25
+ // @ts-expect-error
26
+ doWalk(callExprNode, {
27
+ enter(node) {
28
+ if (!isCallExpression(node) ||
29
+ node.arguments.length === 0) {
30
+ return;
31
+ }
32
+ const castedNode = node;
33
+ const rootArgument = castedNode.arguments.at(0);
34
+ if (rootArgument.type === "Literal" &&
35
+ typeof rootArgument.value === "string" &&
36
+ Hex.isHex(rootArgument.value)) {
37
+ self.dependencies.add(Buffer.from(rootArgument.value, "hex").toString());
38
+ this.skip();
39
+ return;
40
+ }
41
+ const fullName = castedNode.callee.type === "MemberExpression" ?
42
+ [...getMemberExpressionIdentifier(castedNode.callee)].join(".") :
43
+ castedNode.callee.name;
44
+ const tracedFullName = self.tracer.getDataFromIdentifier(fullName)?.identifierOrMemberExpr ?? fullName;
45
+ switch (tracedFullName) {
46
+ case "atob":
47
+ self.#handleAtob(castedNode);
48
+ break;
49
+ case "Buffer.from":
50
+ self.#handleBufferFrom(castedNode);
51
+ break;
52
+ case "require.resolve":
53
+ self.#handleRequireResolve(rootArgument);
54
+ break;
55
+ case "path.join":
56
+ self.#handlePathJoin(castedNode);
57
+ break;
58
+ }
59
+ }
60
+ });
61
+ return {
62
+ dependencies: this.dependencies,
63
+ triggerWarning: this.triggerWarning
64
+ };
65
+ }
66
+ #handleAtob(node) {
67
+ const nodeArguments = getCallExpressionArguments(node, {
68
+ externalIdentifierLookup: (name) => this.tracer.literalIdentifiers.get(name) ?? null
69
+ });
70
+ if (nodeArguments !== null && nodeArguments.length > 0) {
71
+ this.dependencies.add(Buffer.from(nodeArguments.at(0), "base64").toString());
72
+ }
73
+ }
74
+ #handleBufferFrom(node) {
75
+ const [element] = node.arguments;
76
+ if (element.type === "ArrayExpression") {
77
+ const depName = [...arrayExpressionToString(element)].join("").trim();
78
+ this.dependencies.add(depName);
79
+ }
80
+ }
81
+ #handleRequireResolve(node) {
82
+ if (isLiteral(node)) {
83
+ this.dependencies.add(node.value);
84
+ }
85
+ }
86
+ #handlePathJoin(node) {
87
+ if (!node.arguments.every((arg) => isLiteral(arg))) {
88
+ return;
89
+ }
90
+ const constructedPath = path.posix.join(...node.arguments.map((arg) => arg.value));
91
+ this.dependencies.add(constructedPath);
92
+ this.triggerWarning = false;
93
+ }
94
+ }
95
+ //# sourceMappingURL=RequireCallExpressionWalker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequireCallExpressionWalker.js","sourceRoot":"","sources":["../../../src/probes/isRequire/RequireCallExpressionWalker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ESTree } from "meriyah";
2
+ import { SourceFile } from "../../SourceFile.js";
3
+ declare function validateNodeRequire(node: ESTree.Node, { tracer }: SourceFile): [boolean, any?];
4
+ declare function teardown({ sourceFile }: {
5
+ sourceFile: SourceFile;
6
+ }): void;
7
+ declare function main(node: ESTree.CallExpression, options: {
8
+ sourceFile: SourceFile;
9
+ data?: string;
10
+ }): symbol | undefined;
11
+ declare const _default: {
12
+ name: string;
13
+ validateNode: (typeof validateNodeRequire)[];
14
+ main: typeof main;
15
+ teardown: typeof teardown;
16
+ breakOnMatch: boolean;
17
+ breakGroup: string;
18
+ };
19
+ export default _default;
20
+ //# sourceMappingURL=isRequire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isRequire.d.ts","sourceRoot":"","sources":["../../../src/probes/isRequire/isRequire.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAItC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKjD,iBAAS,mBAAmB,CAC1B,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,EAAE,MAAM,EAAE,EAAE,UAAU,GACrB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAgBjB;AA2BD,iBAAS,QAAQ,CACf,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,UAAU,CAAC;CAAE,QAG5C;AAED,iBAAS,IAAI,CACX,IAAI,EAAE,MAAM,CAAC,cAAc,EAC3B,OAAO,EAAE;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CAAE,sBA8GpD;;;;;;;;;AAED,wBAUE"}
@@ -0,0 +1,138 @@
1
+ /* eslint-disable consistent-return */
2
+ // Import Third-party Dependencies
3
+ import { concatBinaryExpression, arrayExpressionToString, getCallExpressionIdentifier, getCallExpressionArguments } from "@nodesecure/estree-ast-utils";
4
+ // Import Internal Dependencies
5
+ import { ProbeSignals } from "../../ProbeRunner.js";
6
+ import { SourceFile } from "../../SourceFile.js";
7
+ import { isLiteral } from "../../types/estree.js";
8
+ import { RequireCallExpressionWalker } from "./RequireCallExpressionWalker.js";
9
+ import { generateWarning } from "../../warnings.js";
10
+ function validateNodeRequire(node, { tracer }) {
11
+ const id = getCallExpressionIdentifier(node, {
12
+ resolveCallExpression: false
13
+ });
14
+ if (id === null) {
15
+ return [false];
16
+ }
17
+ const data = tracer.getDataFromIdentifier(id, {
18
+ removeGlobalIdentifier: true
19
+ });
20
+ return [
21
+ data !== null && data.name === "require",
22
+ id ?? void 0
23
+ ];
24
+ }
25
+ function validateNodeEvalRequire(node) {
26
+ const id = getCallExpressionIdentifier(node);
27
+ if (id !== "eval") {
28
+ return [false];
29
+ }
30
+ const castedNode = node;
31
+ if (castedNode.callee.type !== "CallExpression") {
32
+ return [false];
33
+ }
34
+ const args = getCallExpressionArguments(castedNode.callee);
35
+ if (args === null) {
36
+ return [false];
37
+ }
38
+ return [
39
+ args.length > 0 && args.at(0) === "require",
40
+ id
41
+ ];
42
+ }
43
+ function teardown({ sourceFile }) {
44
+ sourceFile.dependencyAutoWarning = false;
45
+ }
46
+ function main(node, options) {
47
+ const { sourceFile, data: calleeName } = options;
48
+ const { tracer } = sourceFile;
49
+ if (node.arguments.length === 0) {
50
+ return;
51
+ }
52
+ const arg = node.arguments.at(0);
53
+ if (arg === undefined) {
54
+ return;
55
+ }
56
+ if (calleeName === "eval") {
57
+ sourceFile.dependencyAutoWarning = true;
58
+ }
59
+ const location = node.loc;
60
+ switch (arg.type) {
61
+ // const foo = "http"; require(foo);
62
+ case "Identifier":
63
+ if (sourceFile.tracer.literalIdentifiers.has(arg.name)) {
64
+ sourceFile.addDependency(sourceFile.tracer.literalIdentifiers.get(arg.name), node.loc);
65
+ }
66
+ else {
67
+ sourceFile.warnings.push(generateWarning("unsafe-import", { value: null, location }));
68
+ }
69
+ break;
70
+ // require("http")
71
+ case "Literal":
72
+ if (isLiteral(arg)) {
73
+ sourceFile.addDependency(arg.value, node.loc);
74
+ }
75
+ break;
76
+ // require(["ht", "tp"])
77
+ case "ArrayExpression": {
78
+ const value = [
79
+ ...arrayExpressionToString(arg, {
80
+ externalIdentifierLookup: (name) => tracer.literalIdentifiers.get(name) ?? null
81
+ })
82
+ ]
83
+ .join("")
84
+ .trim();
85
+ if (value === "") {
86
+ sourceFile.warnings.push(generateWarning("unsafe-import", { value: null, location }));
87
+ }
88
+ else {
89
+ sourceFile.addDependency(value, node.loc);
90
+ }
91
+ break;
92
+ }
93
+ // require("ht" + "tp");
94
+ case "BinaryExpression": {
95
+ if (arg.operator !== "+") {
96
+ sourceFile.warnings.push(generateWarning("unsafe-import", { value: null, location }));
97
+ break;
98
+ }
99
+ try {
100
+ const iter = concatBinaryExpression(arg, {
101
+ externalIdentifierLookup: (name) => tracer.literalIdentifiers.get(name) ?? null,
102
+ stopOnUnsupportedNode: true
103
+ });
104
+ sourceFile.addDependency([...iter].join(""), node.loc);
105
+ }
106
+ catch {
107
+ sourceFile.warnings.push(generateWarning("unsafe-import", { value: null, location }));
108
+ }
109
+ break;
110
+ }
111
+ // require(Buffer.from("...", "hex").toString());
112
+ case "CallExpression": {
113
+ const walker = new RequireCallExpressionWalker(tracer);
114
+ const { dependencies, triggerWarning } = walker.walk(arg);
115
+ dependencies.forEach((depName) => sourceFile.addDependency(depName, node.loc, true));
116
+ if (triggerWarning) {
117
+ sourceFile.warnings.push(generateWarning("unsafe-import", { value: null, location }));
118
+ }
119
+ // We skip walking the tree to avoid anymore warnings...
120
+ return ProbeSignals.Skip;
121
+ }
122
+ default:
123
+ sourceFile.warnings.push(generateWarning("unsafe-import", { value: null, location }));
124
+ }
125
+ return;
126
+ }
127
+ export default {
128
+ name: "isRequire",
129
+ validateNode: [
130
+ validateNodeRequire,
131
+ validateNodeEvalRequire
132
+ ],
133
+ main,
134
+ teardown,
135
+ breakOnMatch: true,
136
+ breakGroup: "import"
137
+ };
138
+ //# sourceMappingURL=isRequire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isRequire.js","sourceRoot":"","sources":["../../../src/probes/isRequire/isRequire.ts"],"names":[],"mappings":"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"}