secure-scan 1.2.2

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 (569) hide show
  1. package/README.md +564 -0
  2. package/dist/ai/aiAnalyzer.d.ts +99 -0
  3. package/dist/ai/aiAnalyzer.d.ts.map +1 -0
  4. package/dist/ai/aiAnalyzer.js +669 -0
  5. package/dist/ai/aiAnalyzer.js.map +1 -0
  6. package/dist/ai/index.d.ts +5 -0
  7. package/dist/ai/index.d.ts.map +1 -0
  8. package/dist/ai/index.js +21 -0
  9. package/dist/ai/index.js.map +1 -0
  10. package/dist/analyzers/base/baseAnalyzer.d.ts +44 -0
  11. package/dist/analyzers/base/baseAnalyzer.d.ts.map +1 -0
  12. package/dist/analyzers/base/baseAnalyzer.js +53 -0
  13. package/dist/analyzers/base/baseAnalyzer.js.map +1 -0
  14. package/dist/analyzers/base/index.d.ts +5 -0
  15. package/dist/analyzers/base/index.d.ts.map +1 -0
  16. package/dist/analyzers/base/index.js +21 -0
  17. package/dist/analyzers/base/index.js.map +1 -0
  18. package/dist/analyzers/c-cpp/cppAnalyzer.d.ts +60 -0
  19. package/dist/analyzers/c-cpp/cppAnalyzer.d.ts.map +1 -0
  20. package/dist/analyzers/c-cpp/cppAnalyzer.js +218 -0
  21. package/dist/analyzers/c-cpp/cppAnalyzer.js.map +1 -0
  22. package/dist/analyzers/c-cpp/index.d.ts +5 -0
  23. package/dist/analyzers/c-cpp/index.d.ts.map +1 -0
  24. package/dist/analyzers/c-cpp/index.js +21 -0
  25. package/dist/analyzers/c-cpp/index.js.map +1 -0
  26. package/dist/analyzers/core/engine/index.d.ts +5 -0
  27. package/dist/analyzers/core/engine/index.d.ts.map +1 -0
  28. package/dist/analyzers/core/engine/index.js +21 -0
  29. package/dist/analyzers/core/engine/index.js.map +1 -0
  30. package/dist/analyzers/core/engine/ruleEngine.d.ts +46 -0
  31. package/dist/analyzers/core/engine/ruleEngine.d.ts.map +1 -0
  32. package/dist/analyzers/core/engine/ruleEngine.js +173 -0
  33. package/dist/analyzers/core/engine/ruleEngine.js.map +1 -0
  34. package/dist/analyzers/core/index.d.ts +8 -0
  35. package/dist/analyzers/core/index.d.ts.map +1 -0
  36. package/dist/analyzers/core/index.js +24 -0
  37. package/dist/analyzers/core/index.js.map +1 -0
  38. package/dist/analyzers/core/scanner/fileScanner.d.ts +31 -0
  39. package/dist/analyzers/core/scanner/fileScanner.d.ts.map +1 -0
  40. package/dist/analyzers/core/scanner/fileScanner.js +199 -0
  41. package/dist/analyzers/core/scanner/fileScanner.js.map +1 -0
  42. package/dist/analyzers/core/scanner/index.d.ts +5 -0
  43. package/dist/analyzers/core/scanner/index.d.ts.map +1 -0
  44. package/dist/analyzers/core/scanner/index.js +21 -0
  45. package/dist/analyzers/core/scanner/index.js.map +1 -0
  46. package/dist/analyzers/core/scoring/index.d.ts +5 -0
  47. package/dist/analyzers/core/scoring/index.d.ts.map +1 -0
  48. package/dist/analyzers/core/scoring/index.js +21 -0
  49. package/dist/analyzers/core/scoring/index.js.map +1 -0
  50. package/dist/analyzers/core/scoring/riskScoring.d.ts +49 -0
  51. package/dist/analyzers/core/scoring/riskScoring.d.ts.map +1 -0
  52. package/dist/analyzers/core/scoring/riskScoring.js +180 -0
  53. package/dist/analyzers/core/scoring/riskScoring.js.map +1 -0
  54. package/dist/analyzers/core/securityScanner.d.ts +47 -0
  55. package/dist/analyzers/core/securityScanner.d.ts.map +1 -0
  56. package/dist/analyzers/core/securityScanner.js +298 -0
  57. package/dist/analyzers/core/securityScanner.js.map +1 -0
  58. package/dist/analyzers/csharp/csharpAnalyzer.d.ts +64 -0
  59. package/dist/analyzers/csharp/csharpAnalyzer.d.ts.map +1 -0
  60. package/dist/analyzers/csharp/csharpAnalyzer.js +232 -0
  61. package/dist/analyzers/csharp/csharpAnalyzer.js.map +1 -0
  62. package/dist/analyzers/csharp/index.d.ts +5 -0
  63. package/dist/analyzers/csharp/index.d.ts.map +1 -0
  64. package/dist/analyzers/csharp/index.js +21 -0
  65. package/dist/analyzers/csharp/index.js.map +1 -0
  66. package/dist/analyzers/iac/iacAnalyzer.d.ts +36 -0
  67. package/dist/analyzers/iac/iacAnalyzer.d.ts.map +1 -0
  68. package/dist/analyzers/iac/iacAnalyzer.js +182 -0
  69. package/dist/analyzers/iac/iacAnalyzer.js.map +1 -0
  70. package/dist/analyzers/iac/index.d.ts +5 -0
  71. package/dist/analyzers/iac/index.d.ts.map +1 -0
  72. package/dist/analyzers/iac/index.js +21 -0
  73. package/dist/analyzers/iac/index.js.map +1 -0
  74. package/dist/analyzers/index.d.ts +30 -0
  75. package/dist/analyzers/index.d.ts.map +1 -0
  76. package/dist/analyzers/index.js +80 -0
  77. package/dist/analyzers/index.js.map +1 -0
  78. package/dist/analyzers/java/index.d.ts +5 -0
  79. package/dist/analyzers/java/index.d.ts.map +1 -0
  80. package/dist/analyzers/java/index.js +21 -0
  81. package/dist/analyzers/java/index.js.map +1 -0
  82. package/dist/analyzers/java/javaAnalyzer.d.ts +64 -0
  83. package/dist/analyzers/java/javaAnalyzer.d.ts.map +1 -0
  84. package/dist/analyzers/java/javaAnalyzer.js +224 -0
  85. package/dist/analyzers/java/javaAnalyzer.js.map +1 -0
  86. package/dist/analyzers/javascript/astUtils.d.ts +170 -0
  87. package/dist/analyzers/javascript/astUtils.d.ts.map +1 -0
  88. package/dist/analyzers/javascript/astUtils.js +700 -0
  89. package/dist/analyzers/javascript/astUtils.js.map +1 -0
  90. package/dist/analyzers/javascript/index.d.ts +18 -0
  91. package/dist/analyzers/javascript/index.d.ts.map +1 -0
  92. package/dist/analyzers/javascript/index.js +50 -0
  93. package/dist/analyzers/javascript/index.js.map +1 -0
  94. package/dist/analyzers/javascript/javascriptAnalyzer.d.ts +111 -0
  95. package/dist/analyzers/javascript/javascriptAnalyzer.d.ts.map +1 -0
  96. package/dist/analyzers/javascript/javascriptAnalyzer.js +860 -0
  97. package/dist/analyzers/javascript/javascriptAnalyzer.js.map +1 -0
  98. package/dist/analyzers/javascript/malwareDetector.d.ts +102 -0
  99. package/dist/analyzers/javascript/malwareDetector.d.ts.map +1 -0
  100. package/dist/analyzers/javascript/malwareDetector.js +616 -0
  101. package/dist/analyzers/javascript/malwareDetector.js.map +1 -0
  102. package/dist/analyzers/javascript/packageJsonAnalyzer.d.ts +87 -0
  103. package/dist/analyzers/javascript/packageJsonAnalyzer.d.ts.map +1 -0
  104. package/dist/analyzers/javascript/packageJsonAnalyzer.js +553 -0
  105. package/dist/analyzers/javascript/packageJsonAnalyzer.js.map +1 -0
  106. package/dist/analyzers/javascript/taintAnalyzer.d.ts +120 -0
  107. package/dist/analyzers/javascript/taintAnalyzer.d.ts.map +1 -0
  108. package/dist/analyzers/javascript/taintAnalyzer.js +526 -0
  109. package/dist/analyzers/javascript/taintAnalyzer.js.map +1 -0
  110. package/dist/analyzers/php/index.d.ts +5 -0
  111. package/dist/analyzers/php/index.d.ts.map +1 -0
  112. package/dist/analyzers/php/index.js +21 -0
  113. package/dist/analyzers/php/index.js.map +1 -0
  114. package/dist/analyzers/php/phpAnalyzer.d.ts +56 -0
  115. package/dist/analyzers/php/phpAnalyzer.d.ts.map +1 -0
  116. package/dist/analyzers/php/phpAnalyzer.js +202 -0
  117. package/dist/analyzers/php/phpAnalyzer.js.map +1 -0
  118. package/dist/analyzers/python/index.d.ts +5 -0
  119. package/dist/analyzers/python/index.d.ts.map +1 -0
  120. package/dist/analyzers/python/index.js +21 -0
  121. package/dist/analyzers/python/index.js.map +1 -0
  122. package/dist/analyzers/python/pythonAnalyzer.d.ts +64 -0
  123. package/dist/analyzers/python/pythonAnalyzer.d.ts.map +1 -0
  124. package/dist/analyzers/python/pythonAnalyzer.js +226 -0
  125. package/dist/analyzers/python/pythonAnalyzer.js.map +1 -0
  126. package/dist/cli/index.d.ts +7 -0
  127. package/dist/cli/index.d.ts.map +1 -0
  128. package/dist/cli/index.js +281 -0
  129. package/dist/cli/index.js.map +1 -0
  130. package/dist/core/engine/index.d.ts +5 -0
  131. package/dist/core/engine/index.d.ts.map +1 -0
  132. package/dist/core/engine/index.js +21 -0
  133. package/dist/core/engine/index.js.map +1 -0
  134. package/dist/core/engine/ruleEngine.d.ts +46 -0
  135. package/dist/core/engine/ruleEngine.d.ts.map +1 -0
  136. package/dist/core/engine/ruleEngine.js +173 -0
  137. package/dist/core/engine/ruleEngine.js.map +1 -0
  138. package/dist/core/index.d.ts +8 -0
  139. package/dist/core/index.d.ts.map +1 -0
  140. package/dist/core/index.js +24 -0
  141. package/dist/core/index.js.map +1 -0
  142. package/dist/core/scanner/fileScanner.d.ts +31 -0
  143. package/dist/core/scanner/fileScanner.d.ts.map +1 -0
  144. package/dist/core/scanner/fileScanner.js +199 -0
  145. package/dist/core/scanner/fileScanner.js.map +1 -0
  146. package/dist/core/scanner/index.d.ts +5 -0
  147. package/dist/core/scanner/index.d.ts.map +1 -0
  148. package/dist/core/scanner/index.js +21 -0
  149. package/dist/core/scanner/index.js.map +1 -0
  150. package/dist/core/scoring/index.d.ts +5 -0
  151. package/dist/core/scoring/index.d.ts.map +1 -0
  152. package/dist/core/scoring/index.js +21 -0
  153. package/dist/core/scoring/index.js.map +1 -0
  154. package/dist/core/scoring/riskScoring.d.ts +49 -0
  155. package/dist/core/scoring/riskScoring.d.ts.map +1 -0
  156. package/dist/core/scoring/riskScoring.js +180 -0
  157. package/dist/core/scoring/riskScoring.js.map +1 -0
  158. package/dist/core/securityScanner.d.ts +47 -0
  159. package/dist/core/securityScanner.d.ts.map +1 -0
  160. package/dist/core/securityScanner.js +298 -0
  161. package/dist/core/securityScanner.js.map +1 -0
  162. package/dist/dependencies/aiDependencyAnalyzer.d.ts +96 -0
  163. package/dist/dependencies/aiDependencyAnalyzer.d.ts.map +1 -0
  164. package/dist/dependencies/aiDependencyAnalyzer.js +435 -0
  165. package/dist/dependencies/aiDependencyAnalyzer.js.map +1 -0
  166. package/dist/dependencies/database/cveDatabase.d.ts +32 -0
  167. package/dist/dependencies/database/cveDatabase.d.ts.map +1 -0
  168. package/dist/dependencies/database/cveDatabase.js +393 -0
  169. package/dist/dependencies/database/cveDatabase.js.map +1 -0
  170. package/dist/dependencies/database/index.d.ts +6 -0
  171. package/dist/dependencies/database/index.d.ts.map +1 -0
  172. package/dist/dependencies/database/index.js +22 -0
  173. package/dist/dependencies/database/index.js.map +1 -0
  174. package/dist/dependencies/database/maliciousPackages.d.ts +43 -0
  175. package/dist/dependencies/database/maliciousPackages.d.ts.map +1 -0
  176. package/dist/dependencies/database/maliciousPackages.js +279 -0
  177. package/dist/dependencies/database/maliciousPackages.js.map +1 -0
  178. package/dist/dependencies/dependencyAnalyzer.d.ts +74 -0
  179. package/dist/dependencies/dependencyAnalyzer.d.ts.map +1 -0
  180. package/dist/dependencies/dependencyAnalyzer.js +349 -0
  181. package/dist/dependencies/dependencyAnalyzer.js.map +1 -0
  182. package/dist/dependencies/detectors/index.d.ts +7 -0
  183. package/dist/dependencies/detectors/index.d.ts.map +1 -0
  184. package/dist/dependencies/detectors/index.js +28 -0
  185. package/dist/dependencies/detectors/index.js.map +1 -0
  186. package/dist/dependencies/detectors/securityStandards.d.ts +15 -0
  187. package/dist/dependencies/detectors/securityStandards.d.ts.map +1 -0
  188. package/dist/dependencies/detectors/securityStandards.js +178 -0
  189. package/dist/dependencies/detectors/securityStandards.js.map +1 -0
  190. package/dist/dependencies/detectors/vulnerabilityDetector.d.ts +53 -0
  191. package/dist/dependencies/detectors/vulnerabilityDetector.d.ts.map +1 -0
  192. package/dist/dependencies/detectors/vulnerabilityDetector.js +289 -0
  193. package/dist/dependencies/detectors/vulnerabilityDetector.js.map +1 -0
  194. package/dist/dependencies/index.d.ts +14 -0
  195. package/dist/dependencies/index.d.ts.map +1 -0
  196. package/dist/dependencies/index.js +43 -0
  197. package/dist/dependencies/index.js.map +1 -0
  198. package/dist/dependencies/installed/index.d.ts +8 -0
  199. package/dist/dependencies/installed/index.d.ts.map +1 -0
  200. package/dist/dependencies/installed/index.js +24 -0
  201. package/dist/dependencies/installed/index.js.map +1 -0
  202. package/dist/dependencies/installed/installedScanner.d.ts +91 -0
  203. package/dist/dependencies/installed/installedScanner.d.ts.map +1 -0
  204. package/dist/dependencies/installed/installedScanner.js +766 -0
  205. package/dist/dependencies/installed/installedScanner.js.map +1 -0
  206. package/dist/dependencies/installed/malwarePatterns.d.ts +32 -0
  207. package/dist/dependencies/installed/malwarePatterns.d.ts.map +1 -0
  208. package/dist/dependencies/installed/malwarePatterns.js +480 -0
  209. package/dist/dependencies/installed/malwarePatterns.js.map +1 -0
  210. package/dist/dependencies/installed/types.d.ts +274 -0
  211. package/dist/dependencies/installed/types.d.ts.map +1 -0
  212. package/dist/dependencies/installed/types.js +7 -0
  213. package/dist/dependencies/installed/types.js.map +1 -0
  214. package/dist/dependencies/parsers/base/baseParser.d.ts +44 -0
  215. package/dist/dependencies/parsers/base/baseParser.d.ts.map +1 -0
  216. package/dist/dependencies/parsers/base/baseParser.js +80 -0
  217. package/dist/dependencies/parsers/base/baseParser.js.map +1 -0
  218. package/dist/dependencies/parsers/base/index.d.ts +6 -0
  219. package/dist/dependencies/parsers/base/index.d.ts.map +1 -0
  220. package/dist/dependencies/parsers/base/index.js +27 -0
  221. package/dist/dependencies/parsers/base/index.js.map +1 -0
  222. package/dist/dependencies/parsers/cpp/cppParser.d.ts +36 -0
  223. package/dist/dependencies/parsers/cpp/cppParser.d.ts.map +1 -0
  224. package/dist/dependencies/parsers/cpp/cppParser.js +196 -0
  225. package/dist/dependencies/parsers/cpp/cppParser.js.map +1 -0
  226. package/dist/dependencies/parsers/cpp/index.d.ts +6 -0
  227. package/dist/dependencies/parsers/cpp/index.d.ts.map +1 -0
  228. package/dist/dependencies/parsers/cpp/index.js +27 -0
  229. package/dist/dependencies/parsers/cpp/index.js.map +1 -0
  230. package/dist/dependencies/parsers/csharp/csharpParser.d.ts +32 -0
  231. package/dist/dependencies/parsers/csharp/csharpParser.d.ts.map +1 -0
  232. package/dist/dependencies/parsers/csharp/csharpParser.js +125 -0
  233. package/dist/dependencies/parsers/csharp/csharpParser.js.map +1 -0
  234. package/dist/dependencies/parsers/csharp/index.d.ts +6 -0
  235. package/dist/dependencies/parsers/csharp/index.d.ts.map +1 -0
  236. package/dist/dependencies/parsers/csharp/index.js +27 -0
  237. package/dist/dependencies/parsers/csharp/index.js.map +1 -0
  238. package/dist/dependencies/parsers/index.d.ts +24 -0
  239. package/dist/dependencies/parsers/index.d.ts.map +1 -0
  240. package/dist/dependencies/parsers/index.js +69 -0
  241. package/dist/dependencies/parsers/index.js.map +1 -0
  242. package/dist/dependencies/parsers/java/index.d.ts +6 -0
  243. package/dist/dependencies/parsers/java/index.d.ts.map +1 -0
  244. package/dist/dependencies/parsers/java/index.js +27 -0
  245. package/dist/dependencies/parsers/java/index.js.map +1 -0
  246. package/dist/dependencies/parsers/java/javaParser.d.ts +32 -0
  247. package/dist/dependencies/parsers/java/javaParser.d.ts.map +1 -0
  248. package/dist/dependencies/parsers/java/javaParser.js +168 -0
  249. package/dist/dependencies/parsers/java/javaParser.js.map +1 -0
  250. package/dist/dependencies/parsers/javascript/index.d.ts +6 -0
  251. package/dist/dependencies/parsers/javascript/index.d.ts.map +1 -0
  252. package/dist/dependencies/parsers/javascript/index.js +27 -0
  253. package/dist/dependencies/parsers/javascript/index.js.map +1 -0
  254. package/dist/dependencies/parsers/javascript/javascriptParser.d.ts +55 -0
  255. package/dist/dependencies/parsers/javascript/javascriptParser.d.ts.map +1 -0
  256. package/dist/dependencies/parsers/javascript/javascriptParser.js +266 -0
  257. package/dist/dependencies/parsers/javascript/javascriptParser.js.map +1 -0
  258. package/dist/dependencies/parsers/php/index.d.ts +6 -0
  259. package/dist/dependencies/parsers/php/index.d.ts.map +1 -0
  260. package/dist/dependencies/parsers/php/index.js +27 -0
  261. package/dist/dependencies/parsers/php/index.js.map +1 -0
  262. package/dist/dependencies/parsers/php/phpParser.d.ts +35 -0
  263. package/dist/dependencies/parsers/php/phpParser.d.ts.map +1 -0
  264. package/dist/dependencies/parsers/php/phpParser.js +162 -0
  265. package/dist/dependencies/parsers/php/phpParser.js.map +1 -0
  266. package/dist/dependencies/parsers/python/index.d.ts +6 -0
  267. package/dist/dependencies/parsers/python/index.d.ts.map +1 -0
  268. package/dist/dependencies/parsers/python/index.js +27 -0
  269. package/dist/dependencies/parsers/python/index.js.map +1 -0
  270. package/dist/dependencies/parsers/python/pythonParser.d.ts +60 -0
  271. package/dist/dependencies/parsers/python/pythonParser.d.ts.map +1 -0
  272. package/dist/dependencies/parsers/python/pythonParser.js +336 -0
  273. package/dist/dependencies/parsers/python/pythonParser.js.map +1 -0
  274. package/dist/dependencies/types.d.ts +280 -0
  275. package/dist/dependencies/types.d.ts.map +1 -0
  276. package/dist/dependencies/types.js +59 -0
  277. package/dist/dependencies/types.js.map +1 -0
  278. package/dist/i18n/index.d.ts +2 -0
  279. package/dist/i18n/index.d.ts.map +1 -0
  280. package/dist/i18n/index.js +18 -0
  281. package/dist/i18n/index.js.map +1 -0
  282. package/dist/i18n/translations.d.ts +55 -0
  283. package/dist/i18n/translations.d.ts.map +1 -0
  284. package/dist/i18n/translations.js +119 -0
  285. package/dist/i18n/translations.js.map +1 -0
  286. package/dist/index.d.ts +14 -0
  287. package/dist/index.d.ts.map +1 -0
  288. package/dist/index.js +36 -0
  289. package/dist/index.js.map +1 -0
  290. package/dist/reports/dependencyReportGenerator.d.ts +20 -0
  291. package/dist/reports/dependencyReportGenerator.d.ts.map +1 -0
  292. package/dist/reports/dependencyReportGenerator.js +690 -0
  293. package/dist/reports/dependencyReportGenerator.js.map +1 -0
  294. package/dist/reports/htmlReportGenerator.d.ts +43 -0
  295. package/dist/reports/htmlReportGenerator.d.ts.map +1 -0
  296. package/dist/reports/htmlReportGenerator.js +793 -0
  297. package/dist/reports/htmlReportGenerator.js.map +1 -0
  298. package/dist/reports/index.d.ts +7 -0
  299. package/dist/reports/index.d.ts.map +1 -0
  300. package/dist/reports/index.js +23 -0
  301. package/dist/reports/index.js.map +1 -0
  302. package/dist/reports/installedDepsReportGenerator.d.ts +14 -0
  303. package/dist/reports/installedDepsReportGenerator.d.ts.map +1 -0
  304. package/dist/reports/installedDepsReportGenerator.js +872 -0
  305. package/dist/reports/installedDepsReportGenerator.js.map +1 -0
  306. package/dist/rules/index.d.ts +31 -0
  307. package/dist/rules/index.d.ts.map +1 -0
  308. package/dist/rules/index.js +95 -0
  309. package/dist/rules/index.js.map +1 -0
  310. package/dist/rules/malware/categories/backdoors.d.ts +12 -0
  311. package/dist/rules/malware/categories/backdoors.d.ts.map +1 -0
  312. package/dist/rules/malware/categories/backdoors.js +163 -0
  313. package/dist/rules/malware/categories/backdoors.js.map +1 -0
  314. package/dist/rules/malware/categories/cryptominers.d.ts +13 -0
  315. package/dist/rules/malware/categories/cryptominers.d.ts.map +1 -0
  316. package/dist/rules/malware/categories/cryptominers.js +415 -0
  317. package/dist/rules/malware/categories/cryptominers.js.map +1 -0
  318. package/dist/rules/malware/categories/exfiltration.d.ts +20 -0
  319. package/dist/rules/malware/categories/exfiltration.d.ts.map +1 -0
  320. package/dist/rules/malware/categories/exfiltration.js +658 -0
  321. package/dist/rules/malware/categories/exfiltration.js.map +1 -0
  322. package/dist/rules/malware/categories/keyloggers.d.ts +19 -0
  323. package/dist/rules/malware/categories/keyloggers.d.ts.map +1 -0
  324. package/dist/rules/malware/categories/keyloggers.js +763 -0
  325. package/dist/rules/malware/categories/keyloggers.js.map +1 -0
  326. package/dist/rules/malware/categories/loaders.d.ts +20 -0
  327. package/dist/rules/malware/categories/loaders.d.ts.map +1 -0
  328. package/dist/rules/malware/categories/loaders.js +702 -0
  329. package/dist/rules/malware/categories/loaders.js.map +1 -0
  330. package/dist/rules/malware/categories/network.d.ts +19 -0
  331. package/dist/rules/malware/categories/network.d.ts.map +1 -0
  332. package/dist/rules/malware/categories/network.js +622 -0
  333. package/dist/rules/malware/categories/network.js.map +1 -0
  334. package/dist/rules/malware/categories/obfuscation.d.ts +22 -0
  335. package/dist/rules/malware/categories/obfuscation.d.ts.map +1 -0
  336. package/dist/rules/malware/categories/obfuscation.js +766 -0
  337. package/dist/rules/malware/categories/obfuscation.js.map +1 -0
  338. package/dist/rules/malware/constants/index.d.ts +281 -0
  339. package/dist/rules/malware/constants/index.d.ts.map +1 -0
  340. package/dist/rules/malware/constants/index.js +327 -0
  341. package/dist/rules/malware/constants/index.js.map +1 -0
  342. package/dist/rules/malware/engine/index.d.ts +178 -0
  343. package/dist/rules/malware/engine/index.d.ts.map +1 -0
  344. package/dist/rules/malware/engine/index.js +552 -0
  345. package/dist/rules/malware/engine/index.js.map +1 -0
  346. package/dist/rules/malware/index.d.ts +205 -0
  347. package/dist/rules/malware/index.d.ts.map +1 -0
  348. package/dist/rules/malware/index.js +837 -0
  349. package/dist/rules/malware/index.js.map +1 -0
  350. package/dist/rules/malware/scoring/index.d.ts +84 -0
  351. package/dist/rules/malware/scoring/index.d.ts.map +1 -0
  352. package/dist/rules/malware/scoring/index.js +441 -0
  353. package/dist/rules/malware/scoring/index.js.map +1 -0
  354. package/dist/rules/malware/types/index.d.ts +616 -0
  355. package/dist/rules/malware/types/index.d.ts.map +1 -0
  356. package/dist/rules/malware/types/index.js +155 -0
  357. package/dist/rules/malware/types/index.js.map +1 -0
  358. package/dist/rules/malware/utils/index.d.ts +117 -0
  359. package/dist/rules/malware/utils/index.d.ts.map +1 -0
  360. package/dist/rules/malware/utils/index.js +514 -0
  361. package/dist/rules/malware/utils/index.js.map +1 -0
  362. package/dist/rules/standards.d.ts +26 -0
  363. package/dist/rules/standards.d.ts.map +1 -0
  364. package/dist/rules/standards.js +352 -0
  365. package/dist/rules/standards.js.map +1 -0
  366. package/dist/rules/vulnerabilities/constants/index.d.ts +835 -0
  367. package/dist/rules/vulnerabilities/constants/index.d.ts.map +1 -0
  368. package/dist/rules/vulnerabilities/constants/index.js +544 -0
  369. package/dist/rules/vulnerabilities/constants/index.js.map +1 -0
  370. package/dist/rules/vulnerabilities/engine/index.d.ts +145 -0
  371. package/dist/rules/vulnerabilities/engine/index.d.ts.map +1 -0
  372. package/dist/rules/vulnerabilities/engine/index.js +581 -0
  373. package/dist/rules/vulnerabilities/engine/index.js.map +1 -0
  374. package/dist/rules/vulnerabilities/index.d.ts +148 -0
  375. package/dist/rules/vulnerabilities/index.d.ts.map +1 -0
  376. package/dist/rules/vulnerabilities/index.js +252 -0
  377. package/dist/rules/vulnerabilities/index.js.map +1 -0
  378. package/dist/rules/vulnerabilities/rules/authentication.d.ts +8 -0
  379. package/dist/rules/vulnerabilities/rules/authentication.d.ts.map +1 -0
  380. package/dist/rules/vulnerabilities/rules/authentication.js +419 -0
  381. package/dist/rules/vulnerabilities/rules/authentication.js.map +1 -0
  382. package/dist/rules/vulnerabilities/rules/commandInjection.d.ts +8 -0
  383. package/dist/rules/vulnerabilities/rules/commandInjection.d.ts.map +1 -0
  384. package/dist/rules/vulnerabilities/rules/commandInjection.js +300 -0
  385. package/dist/rules/vulnerabilities/rules/commandInjection.js.map +1 -0
  386. package/dist/rules/vulnerabilities/rules/csrf.d.ts +8 -0
  387. package/dist/rules/vulnerabilities/rules/csrf.d.ts.map +1 -0
  388. package/dist/rules/vulnerabilities/rules/csrf.js +261 -0
  389. package/dist/rules/vulnerabilities/rules/csrf.js.map +1 -0
  390. package/dist/rules/vulnerabilities/rules/deserialization.d.ts +8 -0
  391. package/dist/rules/vulnerabilities/rules/deserialization.d.ts.map +1 -0
  392. package/dist/rules/vulnerabilities/rules/deserialization.js +336 -0
  393. package/dist/rules/vulnerabilities/rules/deserialization.js.map +1 -0
  394. package/dist/rules/vulnerabilities/rules/fileUpload.d.ts +8 -0
  395. package/dist/rules/vulnerabilities/rules/fileUpload.d.ts.map +1 -0
  396. package/dist/rules/vulnerabilities/rules/fileUpload.js +325 -0
  397. package/dist/rules/vulnerabilities/rules/fileUpload.js.map +1 -0
  398. package/dist/rules/vulnerabilities/rules/hardcodedSecrets.d.ts +8 -0
  399. package/dist/rules/vulnerabilities/rules/hardcodedSecrets.d.ts.map +1 -0
  400. package/dist/rules/vulnerabilities/rules/hardcodedSecrets.js +446 -0
  401. package/dist/rules/vulnerabilities/rules/hardcodedSecrets.js.map +1 -0
  402. package/dist/rules/vulnerabilities/rules/index.d.ts +17 -0
  403. package/dist/rules/vulnerabilities/rules/index.d.ts.map +1 -0
  404. package/dist/rules/vulnerabilities/rules/index.js +47 -0
  405. package/dist/rules/vulnerabilities/rules/index.js.map +1 -0
  406. package/dist/rules/vulnerabilities/rules/pathTraversal.d.ts +8 -0
  407. package/dist/rules/vulnerabilities/rules/pathTraversal.d.ts.map +1 -0
  408. package/dist/rules/vulnerabilities/rules/pathTraversal.js +351 -0
  409. package/dist/rules/vulnerabilities/rules/pathTraversal.js.map +1 -0
  410. package/dist/rules/vulnerabilities/rules/prototypePollution.d.ts +8 -0
  411. package/dist/rules/vulnerabilities/rules/prototypePollution.d.ts.map +1 -0
  412. package/dist/rules/vulnerabilities/rules/prototypePollution.js +272 -0
  413. package/dist/rules/vulnerabilities/rules/prototypePollution.js.map +1 -0
  414. package/dist/rules/vulnerabilities/rules/securityMisconfiguration.d.ts +8 -0
  415. package/dist/rules/vulnerabilities/rules/securityMisconfiguration.d.ts.map +1 -0
  416. package/dist/rules/vulnerabilities/rules/securityMisconfiguration.js +438 -0
  417. package/dist/rules/vulnerabilities/rules/securityMisconfiguration.js.map +1 -0
  418. package/dist/rules/vulnerabilities/rules/sqlInjection.d.ts +12 -0
  419. package/dist/rules/vulnerabilities/rules/sqlInjection.d.ts.map +1 -0
  420. package/dist/rules/vulnerabilities/rules/sqlInjection.js +636 -0
  421. package/dist/rules/vulnerabilities/rules/sqlInjection.js.map +1 -0
  422. package/dist/rules/vulnerabilities/rules/ssrf.d.ts +8 -0
  423. package/dist/rules/vulnerabilities/rules/ssrf.d.ts.map +1 -0
  424. package/dist/rules/vulnerabilities/rules/ssrf.js +401 -0
  425. package/dist/rules/vulnerabilities/rules/ssrf.js.map +1 -0
  426. package/dist/rules/vulnerabilities/rules/xss.d.ts +11 -0
  427. package/dist/rules/vulnerabilities/rules/xss.d.ts.map +1 -0
  428. package/dist/rules/vulnerabilities/rules/xss.js +724 -0
  429. package/dist/rules/vulnerabilities/rules/xss.js.map +1 -0
  430. package/dist/rules/vulnerabilities/scoring/index.d.ts +80 -0
  431. package/dist/rules/vulnerabilities/scoring/index.d.ts.map +1 -0
  432. package/dist/rules/vulnerabilities/scoring/index.js +414 -0
  433. package/dist/rules/vulnerabilities/scoring/index.js.map +1 -0
  434. package/dist/rules/vulnerabilities/types/index.d.ts +830 -0
  435. package/dist/rules/vulnerabilities/types/index.d.ts.map +1 -0
  436. package/dist/rules/vulnerabilities/types/index.js +164 -0
  437. package/dist/rules/vulnerabilities/types/index.js.map +1 -0
  438. package/dist/rules/vulnerabilities/utils/index.d.ts +206 -0
  439. package/dist/rules/vulnerabilities/utils/index.d.ts.map +1 -0
  440. package/dist/rules/vulnerabilities/utils/index.js +615 -0
  441. package/dist/rules/vulnerabilities/utils/index.js.map +1 -0
  442. package/dist/types/index.d.ts +359 -0
  443. package/dist/types/index.d.ts.map +1 -0
  444. package/dist/types/index.js +61 -0
  445. package/dist/types/index.js.map +1 -0
  446. package/dist/utils/index.d.ts +82 -0
  447. package/dist/utils/index.d.ts.map +1 -0
  448. package/dist/utils/index.js +326 -0
  449. package/dist/utils/index.js.map +1 -0
  450. package/dist/utils/logger.d.ts +40 -0
  451. package/dist/utils/logger.d.ts.map +1 -0
  452. package/dist/utils/logger.js +139 -0
  453. package/dist/utils/logger.js.map +1 -0
  454. package/docs/ARCHITECTURE.md +320 -0
  455. package/docs/V1.2.1-IA_Performances.md +116 -0
  456. package/docs/images/WIN_Defender.png +0 -0
  457. package/package.json +68 -0
  458. package/secure-scan.config.json +134 -0
  459. package/secure-scan.sln +29 -0
  460. package/src/ai/aiAnalyzer.ts +714 -0
  461. package/src/ai/index.ts +5 -0
  462. package/src/analyzers/base/baseAnalyzer.ts +66 -0
  463. package/src/analyzers/base/index.ts +5 -0
  464. package/src/analyzers/c-cpp/cppAnalyzer.ts +308 -0
  465. package/src/analyzers/c-cpp/index.ts +5 -0
  466. package/src/analyzers/core/engine/index.ts +5 -0
  467. package/src/analyzers/core/engine/ruleEngine.ts +221 -0
  468. package/src/analyzers/core/index.ts +8 -0
  469. package/src/analyzers/core/scanner/fileScanner.ts +204 -0
  470. package/src/analyzers/core/scanner/index.ts +5 -0
  471. package/src/analyzers/core/scoring/index.ts +5 -0
  472. package/src/analyzers/core/scoring/riskScoring.ts +198 -0
  473. package/src/analyzers/core/securityScanner.ts +321 -0
  474. package/src/analyzers/csharp/csharpAnalyzer.ts +328 -0
  475. package/src/analyzers/csharp/index.ts +5 -0
  476. package/src/analyzers/iac/iacAnalyzer.ts +318 -0
  477. package/src/analyzers/iac/index.ts +5 -0
  478. package/src/analyzers/index.ts +67 -0
  479. package/src/analyzers/java/index.ts +5 -0
  480. package/src/analyzers/java/javaAnalyzer.ts +320 -0
  481. package/src/analyzers/javascript/PROMPT_JS_ANALYZER.md +267 -0
  482. package/src/analyzers/javascript/astUtils.ts +789 -0
  483. package/src/analyzers/javascript/index.ts +50 -0
  484. package/src/analyzers/javascript/javascriptAnalyzer.ts +984 -0
  485. package/src/analyzers/javascript/malwareDetector.ts +697 -0
  486. package/src/analyzers/javascript/packageJsonAnalyzer.ts +626 -0
  487. package/src/analyzers/javascript/taintAnalyzer.ts +630 -0
  488. package/src/analyzers/php/index.ts +5 -0
  489. package/src/analyzers/php/phpAnalyzer.ts +280 -0
  490. package/src/analyzers/python/index.ts +5 -0
  491. package/src/analyzers/python/pythonAnalyzer.ts +319 -0
  492. package/src/cli/index.ts +276 -0
  493. package/src/dependencies/aiDependencyAnalyzer.ts +496 -0
  494. package/src/dependencies/database/cveDatabase.ts +426 -0
  495. package/src/dependencies/database/index.ts +6 -0
  496. package/src/dependencies/database/maliciousPackages.ts +286 -0
  497. package/src/dependencies/dependencyAnalyzer.ts +394 -0
  498. package/src/dependencies/detectors/index.ts +7 -0
  499. package/src/dependencies/detectors/securityStandards.ts +200 -0
  500. package/src/dependencies/detectors/vulnerabilityDetector.ts +343 -0
  501. package/src/dependencies/index.ts +27 -0
  502. package/src/dependencies/installed/index.ts +8 -0
  503. package/src/dependencies/installed/installedScanner.ts +821 -0
  504. package/src/dependencies/installed/malwarePatterns.ts +492 -0
  505. package/src/dependencies/installed/types.ts +287 -0
  506. package/src/dependencies/parsers/base/baseParser.ts +108 -0
  507. package/src/dependencies/parsers/base/index.ts +6 -0
  508. package/src/dependencies/parsers/cpp/cppParser.ts +245 -0
  509. package/src/dependencies/parsers/cpp/index.ts +6 -0
  510. package/src/dependencies/parsers/csharp/csharpParser.ts +151 -0
  511. package/src/dependencies/parsers/csharp/index.ts +6 -0
  512. package/src/dependencies/parsers/index.ts +56 -0
  513. package/src/dependencies/parsers/java/index.ts +6 -0
  514. package/src/dependencies/parsers/java/javaParser.ts +203 -0
  515. package/src/dependencies/parsers/javascript/index.ts +6 -0
  516. package/src/dependencies/parsers/javascript/javascriptParser.ts +362 -0
  517. package/src/dependencies/parsers/php/index.ts +6 -0
  518. package/src/dependencies/parsers/php/phpParser.ts +208 -0
  519. package/src/dependencies/parsers/python/index.ts +6 -0
  520. package/src/dependencies/parsers/python/pythonParser.ts +437 -0
  521. package/src/dependencies/types.ts +330 -0
  522. package/src/i18n/index.ts +1 -0
  523. package/src/i18n/translations.ts +194 -0
  524. package/src/index.ts +16 -0
  525. package/src/reports/dependencyReportGenerator.ts +717 -0
  526. package/src/reports/htmlReportGenerator.ts +781 -0
  527. package/src/reports/index.ts +7 -0
  528. package/src/reports/installedDepsReportGenerator.ts +899 -0
  529. package/src/rules/index.ts +58 -0
  530. package/src/rules/malware/INFO.md +287 -0
  531. package/src/rules/malware/categories/backdoors.ts +174 -0
  532. package/src/rules/malware/categories/cryptominers.ts +434 -0
  533. package/src/rules/malware/categories/exfiltration.ts +677 -0
  534. package/src/rules/malware/categories/keyloggers.ts +780 -0
  535. package/src/rules/malware/categories/loaders.ts +721 -0
  536. package/src/rules/malware/categories/network.ts +639 -0
  537. package/src/rules/malware/categories/obfuscation.ts +788 -0
  538. package/src/rules/malware/constants/index.ts +358 -0
  539. package/src/rules/malware/engine/index.ts +758 -0
  540. package/src/rules/malware/index.ts +928 -0
  541. package/src/rules/malware/scoring/index.ts +549 -0
  542. package/src/rules/malware/types/index.ts +752 -0
  543. package/src/rules/malware/utils/index.ts +643 -0
  544. package/src/rules/standards.ts +372 -0
  545. package/src/rules/vulnerabilities/PROMPT_VULNERABILITIES.md +226 -0
  546. package/src/rules/vulnerabilities/constants/index.ts +625 -0
  547. package/src/rules/vulnerabilities/engine/index.ts +831 -0
  548. package/src/rules/vulnerabilities/index.ts +312 -0
  549. package/src/rules/vulnerabilities/rules/authentication.ts +426 -0
  550. package/src/rules/vulnerabilities/rules/commandInjection.ts +307 -0
  551. package/src/rules/vulnerabilities/rules/csrf.ts +268 -0
  552. package/src/rules/vulnerabilities/rules/deserialization.ts +343 -0
  553. package/src/rules/vulnerabilities/rules/fileUpload.ts +332 -0
  554. package/src/rules/vulnerabilities/rules/hardcodedSecrets.ts +453 -0
  555. package/src/rules/vulnerabilities/rules/index.ts +17 -0
  556. package/src/rules/vulnerabilities/rules/pathTraversal.ts +358 -0
  557. package/src/rules/vulnerabilities/rules/prototypePollution.ts +279 -0
  558. package/src/rules/vulnerabilities/rules/securityMisconfiguration.ts +445 -0
  559. package/src/rules/vulnerabilities/rules/sqlInjection.ts +669 -0
  560. package/src/rules/vulnerabilities/rules/ssrf.ts +408 -0
  561. package/src/rules/vulnerabilities/rules/xss.ts +753 -0
  562. package/src/rules/vulnerabilities/scoring/index.ts +543 -0
  563. package/src/rules/vulnerabilities/types/index.ts +1004 -0
  564. package/src/rules/vulnerabilities/utils/index.ts +709 -0
  565. package/src/types/index.ts +391 -0
  566. package/src/utils/index.ts +306 -0
  567. package/src/utils/logger.ts +150 -0
  568. package/test-installed-scanner.ts +136 -0
  569. package/tsconfig.json +30 -0
@@ -0,0 +1,643 @@
1
+ /**
2
+ * @fileoverview Malware Detection Utilities
3
+ * @module rules/malware/utils
4
+ *
5
+ * Core utility functions for malware detection including entropy calculation,
6
+ * code normalization, obfuscation detection, and pattern matching helpers.
7
+ */
8
+
9
+ import {
10
+ SupportedLanguage,
11
+ PatternMatch,
12
+ SourceLocation,
13
+ MalwarePattern,
14
+ PatternType,
15
+ RegexPattern
16
+ } from '../types';
17
+ import {
18
+ ENTROPY_THRESHOLDS,
19
+ OBFUSCATION_INDICATORS,
20
+ LIMITS
21
+ } from '../constants';
22
+
23
+ // ============================================================================
24
+ // ENTROPY CALCULATION
25
+ // ============================================================================
26
+
27
+ /**
28
+ * Calculate Shannon entropy of a string
29
+ * Higher entropy indicates more randomness/potential obfuscation
30
+ *
31
+ * @param content - String to analyze
32
+ * @returns Entropy value (0-8 for ASCII)
33
+ */
34
+ export function calculateEntropy(content: string): number {
35
+ if (!content || content.length === 0) {
36
+ return 0;
37
+ }
38
+
39
+ const charFrequency: Map<string, number> = new Map();
40
+
41
+ for (const char of content) {
42
+ charFrequency.set(char, (charFrequency.get(char) || 0) + 1);
43
+ }
44
+
45
+ let entropy = 0;
46
+ const length = content.length;
47
+
48
+ for (const count of Array.from(charFrequency.values())) {
49
+ const probability = count / length;
50
+ entropy -= probability * Math.log2(probability);
51
+ }
52
+
53
+ return entropy;
54
+ }
55
+
56
+ /**
57
+ * Calculate entropy per line and detect anomalies
58
+ *
59
+ * @param content - Source code content
60
+ * @returns Object with average entropy and lines with high entropy
61
+ */
62
+ export function analyzeEntropyByLine(content: string): {
63
+ averageEntropy: number;
64
+ maxEntropy: number;
65
+ highEntropyLines: Array<{ line: number; entropy: number; content: string }>;
66
+ } {
67
+ const lines = content.split('\n');
68
+ const entropies = lines.map(line => calculateEntropy(line));
69
+
70
+ const averageEntropy = entropies.reduce((a, b) => a + b, 0) / entropies.length;
71
+ const maxEntropy = Math.max(...entropies);
72
+
73
+ const highEntropyLines = lines
74
+ .map((line, index) => ({
75
+ line: index + 1,
76
+ entropy: entropies[index],
77
+ content: line.substring(0, LIMITS.MAX_SNIPPET_LENGTH)
78
+ }))
79
+ .filter(item => item.entropy > ENTROPY_THRESHOLDS.SUSPICIOUS);
80
+
81
+ return { averageEntropy, maxEntropy, highEntropyLines };
82
+ }
83
+
84
+ // ============================================================================
85
+ // CODE NORMALIZATION
86
+ // ============================================================================
87
+
88
+ /**
89
+ * Normalize code for analysis by removing common obfuscation patterns
90
+ * IMPORTANT: This does NOT execute any code
91
+ *
92
+ * @param content - Source code to normalize
93
+ * @param language - Programming language
94
+ * @returns Normalized code
95
+ */
96
+ export function normalizeCode(
97
+ content: string,
98
+ language: SupportedLanguage
99
+ ): string {
100
+ let normalized = content;
101
+
102
+ // Remove comments based on language
103
+ normalized = removeComments(normalized, language);
104
+
105
+ // Normalize whitespace
106
+ normalized = normalizeWhitespace(normalized);
107
+
108
+ // Decode simple escape sequences (safe, no execution)
109
+ normalized = decodeEscapeSequences(normalized);
110
+
111
+ // Normalize string concatenations
112
+ normalized = normalizeStringConcatenation(normalized);
113
+
114
+ return normalized;
115
+ }
116
+
117
+ /**
118
+ * Remove comments from code based on language
119
+ */
120
+ function removeComments(content: string, language: SupportedLanguage): string {
121
+ let result = content;
122
+
123
+ switch (language) {
124
+ case SupportedLanguage.JAVASCRIPT:
125
+ case SupportedLanguage.TYPESCRIPT:
126
+ case SupportedLanguage.JAVA:
127
+ case SupportedLanguage.CSHARP:
128
+ case SupportedLanguage.C:
129
+ case SupportedLanguage.CPP:
130
+ // Remove single-line comments
131
+ result = result.replace(/\/\/.*$/gm, '');
132
+ // Remove multi-line comments
133
+ result = result.replace(/\/\*[\s\S]*?\*\//g, '');
134
+ break;
135
+
136
+ case SupportedLanguage.PYTHON:
137
+ case SupportedLanguage.RUBY:
138
+ // Remove single-line comments
139
+ result = result.replace(/#.*$/gm, '');
140
+ // Remove docstrings (Python)
141
+ result = result.replace(/"""[\s\S]*?"""/g, '');
142
+ result = result.replace(/'''[\s\S]*?'''/g, '');
143
+ break;
144
+
145
+ case SupportedLanguage.PHP:
146
+ // Remove single-line comments
147
+ result = result.replace(/\/\/.*$/gm, '');
148
+ result = result.replace(/#.*$/gm, '');
149
+ // Remove multi-line comments
150
+ result = result.replace(/\/\*[\s\S]*?\*\//g, '');
151
+ break;
152
+
153
+ case SupportedLanguage.SHELL:
154
+ case SupportedLanguage.POWERSHELL:
155
+ result = result.replace(/#.*$/gm, '');
156
+ break;
157
+ }
158
+
159
+ return result;
160
+ }
161
+
162
+ /**
163
+ * Normalize whitespace
164
+ */
165
+ function normalizeWhitespace(content: string): string {
166
+ return content
167
+ .replace(/\r\n/g, '\n')
168
+ .replace(/[ \t]+/g, ' ')
169
+ .replace(/\n{3,}/g, '\n\n');
170
+ }
171
+
172
+ /**
173
+ * Safely decode escape sequences without execution
174
+ */
175
+ function decodeEscapeSequences(content: string): string {
176
+ let result = content;
177
+
178
+ // Decode hex escapes (\x41 -> A)
179
+ result = result.replace(/\\x([0-9a-fA-F]{2})/g, (_, hex) => {
180
+ const charCode = parseInt(hex, 16);
181
+ if (charCode >= 32 && charCode < 127) {
182
+ return String.fromCharCode(charCode);
183
+ }
184
+ return _;
185
+ });
186
+
187
+ // Decode unicode escapes (\u0041 -> A)
188
+ result = result.replace(/\\u([0-9a-fA-F]{4})/g, (_, hex) => {
189
+ const charCode = parseInt(hex, 16);
190
+ if (charCode >= 32 && charCode < 127) {
191
+ return String.fromCharCode(charCode);
192
+ }
193
+ return _;
194
+ });
195
+
196
+ return result;
197
+ }
198
+
199
+ /**
200
+ * Normalize string concatenation
201
+ * "e" + "v" + "a" + "l" -> "eval"
202
+ */
203
+ function normalizeStringConcatenation(content: string): string {
204
+ // Match patterns like 'a' + 'b' + 'c'
205
+ return content.replace(
206
+ /(['"])(\w)\1\s*\+\s*(['"])(\w)\3(?:\s*\+\s*(['"])(\w)\5)*/g,
207
+ (match) => {
208
+ const chars = match.match(/['"](\w)['"]/g);
209
+ if (chars) {
210
+ const combined = chars.map(c => c[1]).join('');
211
+ return `"${combined}"`;
212
+ }
213
+ return match;
214
+ }
215
+ );
216
+ }
217
+
218
+ // ============================================================================
219
+ // OBFUSCATION DETECTION
220
+ // ============================================================================
221
+
222
+ /**
223
+ * Detect obfuscation level in code
224
+ *
225
+ * @param content - Source code to analyze
226
+ * @param language - Programming language
227
+ * @returns Obfuscation score (0-1)
228
+ */
229
+ export function detectObfuscationLevel(
230
+ content: string,
231
+ language: SupportedLanguage
232
+ ): number {
233
+ let score = 0;
234
+ let maxScore = 0;
235
+
236
+ // Check each obfuscation indicator
237
+ for (const [name, indicator] of Object.entries(OBFUSCATION_INDICATORS)) {
238
+ maxScore += (indicator as { weight: number }).weight;
239
+
240
+ if ('pattern' in indicator) {
241
+ const matches = content.match(indicator.pattern as RegExp);
242
+ if (matches && matches.length > 0) {
243
+ // Scale by match density
244
+ const density = Math.min(matches.length / (content.length / 100), 1);
245
+ score += indicator.weight * density;
246
+ }
247
+ } else if ('threshold' in indicator) {
248
+ if (name === 'LONG_LINES') {
249
+ const lines = content.split('\n');
250
+ const longLines = lines.filter(l => l.length > (indicator.threshold as number));
251
+ if (longLines.length / lines.length > 0.1) {
252
+ score += indicator.weight;
253
+ }
254
+ } else if (name === 'CHAR_DIVERSITY') {
255
+ const uniqueChars = new Set(content).size;
256
+ const diversity = uniqueChars / Math.min(content.length, 256);
257
+ if (diversity < (indicator.threshold as number)) {
258
+ score += indicator.weight;
259
+ }
260
+ }
261
+ }
262
+ }
263
+
264
+ // Check entropy
265
+ const entropy = calculateEntropy(content);
266
+ if (entropy > ENTROPY_THRESHOLDS.HIGH_OBFUSCATION) {
267
+ score += 0.3;
268
+ maxScore += 0.3;
269
+ } else if (entropy > ENTROPY_THRESHOLDS.SUSPICIOUS) {
270
+ score += 0.15;
271
+ maxScore += 0.15;
272
+ }
273
+
274
+ // Language-specific checks
275
+ score += detectLanguageSpecificObfuscation(content, language);
276
+ maxScore += 0.3;
277
+
278
+ return Math.min(score / maxScore, 1);
279
+ }
280
+
281
+ /**
282
+ * Language-specific obfuscation detection
283
+ */
284
+ function detectLanguageSpecificObfuscation(
285
+ content: string,
286
+ language: SupportedLanguage
287
+ ): number {
288
+ let score = 0;
289
+
290
+ switch (language) {
291
+ case SupportedLanguage.JAVASCRIPT:
292
+ case SupportedLanguage.TYPESCRIPT:
293
+ // JSFuck patterns
294
+ if (/\[\]!\+/.test(content)) score += 0.15;
295
+ // JavaScript packer
296
+ if (/eval\(function\(p,a,c,k,e,/.test(content)) score += 0.15;
297
+ // Obfuscator.io patterns
298
+ if (/_0x[a-f0-9]{4,}/gi.test(content)) score += 0.1;
299
+ break;
300
+
301
+ case SupportedLanguage.PHP:
302
+ // Base64 + eval/gzinflate
303
+ if (/eval\s*\(\s*(?:base64_decode|gzinflate|str_rot13)/i.test(content)) score += 0.15;
304
+ // Variable function calls
305
+ if (/\$[a-z]+\s*\(/gi.test(content)) score += 0.05;
306
+ break;
307
+
308
+ case SupportedLanguage.PYTHON:
309
+ // exec(compile(...))
310
+ if (/exec\s*\(\s*compile/i.test(content)) score += 0.15;
311
+ // __import__ obfuscation
312
+ if (/__import__\s*\([^)]+\)\s*\./gi.test(content)) score += 0.1;
313
+ break;
314
+ }
315
+
316
+ return score;
317
+ }
318
+
319
+ // ============================================================================
320
+ // ANTI-DEBUGGING DETECTION
321
+ // ============================================================================
322
+
323
+ /**
324
+ * Detect anti-debugging techniques
325
+ */
326
+ export function detectAntiDebugging(
327
+ content: string,
328
+ language: SupportedLanguage
329
+ ): { detected: boolean; techniques: string[] } {
330
+ const techniques: string[] = [];
331
+
332
+ // JavaScript anti-debugging
333
+ if (language === SupportedLanguage.JAVASCRIPT ||
334
+ language === SupportedLanguage.TYPESCRIPT) {
335
+
336
+ // Debugger statements
337
+ if (/\bdebugger\b/.test(content)) {
338
+ techniques.push('debugger-statement');
339
+ }
340
+
341
+ // Console detection
342
+ if (/console\.(log|warn|error)\s*=/.test(content)) {
343
+ techniques.push('console-override');
344
+ }
345
+
346
+ // DevTools detection
347
+ if (/devtools|firebug/i.test(content)) {
348
+ techniques.push('devtools-detection');
349
+ }
350
+
351
+ // Performance timing checks
352
+ if (/performance\.now\s*\(\s*\)|Date\.now\s*\(\s*\)/.test(content) &&
353
+ /setTimeout|setInterval/.test(content)) {
354
+ techniques.push('timing-check');
355
+ }
356
+
357
+ // Function.toString detection
358
+ if (/toString\s*\(\s*\)\s*\.(?:indexOf|includes|match)/.test(content)) {
359
+ techniques.push('toString-check');
360
+ }
361
+ }
362
+
363
+ // Python anti-debugging
364
+ if (language === SupportedLanguage.PYTHON) {
365
+ if (/sys\.(settrace|gettrace)/.test(content)) {
366
+ techniques.push('trace-detection');
367
+ }
368
+ if (/pydevd|pdb\.set_trace/.test(content)) {
369
+ techniques.push('debugger-detection');
370
+ }
371
+ }
372
+
373
+ return {
374
+ detected: techniques.length > 0,
375
+ techniques
376
+ };
377
+ }
378
+
379
+ // ============================================================================
380
+ // ENVIRONMENT CHECKS DETECTION
381
+ // ============================================================================
382
+
383
+ /**
384
+ * Detect environment-dependent activation (time bombs, sandbox evasion)
385
+ */
386
+ export function detectEnvironmentChecks(content: string): {
387
+ detected: boolean;
388
+ checks: string[];
389
+ } {
390
+ const checks: string[] = [];
391
+
392
+ // Time-based activation
393
+ if (/new Date\s*\(\s*\)|Date\.now\s*\(\s*\)/.test(content)) {
394
+ if (/getFullYear|getMonth|getDate|getHours/.test(content)) {
395
+ checks.push('time-based-activation');
396
+ }
397
+ }
398
+
399
+ // Environment variable checks
400
+ if (/process\.env|os\.environ|getenv|Environment\.GetEnvironmentVariable/.test(content)) {
401
+ checks.push('environment-variable-check');
402
+ }
403
+
404
+ // CI/CD detection
405
+ if (/CI|TRAVIS|JENKINS|GITHUB_ACTIONS|GITLAB_CI|CIRCLECI/.test(content)) {
406
+ checks.push('ci-cd-detection');
407
+ }
408
+
409
+ // Sandbox/VM detection
410
+ if (/vmware|virtualbox|sandbox|qemu|xen|hypervisor/i.test(content)) {
411
+ checks.push('sandbox-detection');
412
+ }
413
+
414
+ // Production environment checks
415
+ if (/NODE_ENV|RAILS_ENV|APP_ENV|ENVIRONMENT/.test(content) &&
416
+ /production|prod|live/i.test(content)) {
417
+ checks.push('production-check');
418
+ }
419
+
420
+ // User/hostname checks
421
+ if (/os\.getlogin|getpass\.getuser|socket\.gethostname|Environment\.UserName/.test(content)) {
422
+ checks.push('user-hostname-check');
423
+ }
424
+
425
+ return {
426
+ detected: checks.length > 0,
427
+ checks
428
+ };
429
+ }
430
+
431
+ // ============================================================================
432
+ // PATTERN MATCHING UTILITIES
433
+ // ============================================================================
434
+
435
+ /**
436
+ * Safe regex matching with timeout protection
437
+ */
438
+ export async function matchWithTimeout(
439
+ content: string,
440
+ pattern: RegExp,
441
+ timeout: number = LIMITS.REGEX_TIMEOUT
442
+ ): Promise<RegExpMatchArray | null> {
443
+ return new Promise((resolve) => {
444
+ const timer = setTimeout(() => {
445
+ resolve(null);
446
+ }, timeout);
447
+
448
+ try {
449
+ const result = content.match(pattern);
450
+ clearTimeout(timer);
451
+ resolve(result);
452
+ } catch {
453
+ clearTimeout(timer);
454
+ resolve(null);
455
+ }
456
+ });
457
+ }
458
+
459
+ /**
460
+ * Apply regex pattern with safety limits
461
+ */
462
+ export function safeRegexMatch(
463
+ content: string,
464
+ pattern: RegexPattern
465
+ ): PatternMatch[] {
466
+ const matches: PatternMatch[] = [];
467
+
468
+ try {
469
+ const regex = new RegExp(pattern.pattern, pattern.flags || 'g');
470
+ const maxMatches = pattern.maxMatches || LIMITS.MAX_MATCHES_PER_PATTERN;
471
+
472
+ let match: RegExpExecArray | null;
473
+ let count = 0;
474
+
475
+ while ((match = regex.exec(content)) !== null && count < maxMatches) {
476
+ const location = getLocationFromIndex(content, match.index, match[0].length);
477
+
478
+ matches.push({
479
+ pattern,
480
+ matchedText: match[0].substring(0, LIMITS.MAX_SNIPPET_LENGTH),
481
+ location,
482
+ captures: match.slice(1)
483
+ });
484
+
485
+ count++;
486
+
487
+ // Prevent infinite loops for zero-width matches
488
+ if (match[0].length === 0) {
489
+ regex.lastIndex++;
490
+ }
491
+ }
492
+ } catch (error) {
493
+ // Log error but don't throw - invalid regex should be handled gracefully
494
+ console.error(`Invalid regex pattern: ${pattern.pattern}`, error);
495
+ }
496
+
497
+ return matches;
498
+ }
499
+
500
+ /**
501
+ * Convert string index to line/column location
502
+ */
503
+ export function getLocationFromIndex(
504
+ content: string,
505
+ startIndex: number,
506
+ length: number
507
+ ): SourceLocation {
508
+ const lines = content.substring(0, startIndex).split('\n');
509
+ const startLine = lines.length;
510
+ const startColumn = lines[lines.length - 1].length;
511
+
512
+ const matchedContent = content.substring(startIndex, startIndex + length);
513
+ const matchedLines = matchedContent.split('\n');
514
+ const endLine = startLine + matchedLines.length - 1;
515
+ const endColumn = matchedLines.length === 1
516
+ ? startColumn + length
517
+ : matchedLines[matchedLines.length - 1].length;
518
+
519
+ return {
520
+ filePath: '', // Will be set by caller
521
+ startLine,
522
+ endLine,
523
+ startColumn,
524
+ endColumn
525
+ };
526
+ }
527
+
528
+ /**
529
+ * Extract code snippet with context
530
+ */
531
+ export function extractSnippet(
532
+ content: string,
533
+ location: SourceLocation,
534
+ contextLines: number = LIMITS.CONTEXT_LINES
535
+ ): string {
536
+ const lines = content.split('\n');
537
+ const startLine = Math.max(0, location.startLine - contextLines - 1);
538
+ const endLine = Math.min(lines.length, location.endLine + contextLines);
539
+
540
+ return lines
541
+ .slice(startLine, endLine)
542
+ .join('\n')
543
+ .substring(0, LIMITS.MAX_SNIPPET_LENGTH);
544
+ }
545
+
546
+ // ============================================================================
547
+ // BASE64 UTILITIES
548
+ // ============================================================================
549
+
550
+ /**
551
+ * Detect and analyze base64 encoded content
552
+ * Does NOT decode potentially malicious content
553
+ */
554
+ export function analyzeBase64Content(content: string): {
555
+ found: boolean;
556
+ count: number;
557
+ longestLength: number;
558
+ locations: SourceLocation[];
559
+ } {
560
+ const base64Pattern = /['"]([A-Za-z0-9+/]{50,}={0,2})['"]/g;
561
+ const locations: SourceLocation[] = [];
562
+ let longestLength = 0;
563
+ let count = 0;
564
+ let match;
565
+
566
+ while ((match = base64Pattern.exec(content)) !== null) {
567
+ count++;
568
+ longestLength = Math.max(longestLength, match[1].length);
569
+ locations.push(getLocationFromIndex(content, match.index, match[0].length));
570
+ }
571
+
572
+ return {
573
+ found: count > 0,
574
+ count,
575
+ longestLength,
576
+ locations
577
+ };
578
+ }
579
+
580
+ // ============================================================================
581
+ // STRING ANALYSIS
582
+ // ============================================================================
583
+
584
+ /**
585
+ * Extract suspicious strings from code
586
+ */
587
+ export function extractSuspiciousStrings(content: string): {
588
+ urls: string[];
589
+ ips: string[];
590
+ emails: string[];
591
+ paths: string[];
592
+ commands: string[];
593
+ } {
594
+ const urls: string[] = [];
595
+ const ips: string[] = [];
596
+ const emails: string[] = [];
597
+ const paths: string[] = [];
598
+ const commands: string[] = [];
599
+
600
+ // URLs
601
+ const urlPattern = /https?:\/\/[^\s'"<>]+/gi;
602
+ let match;
603
+ while ((match = urlPattern.exec(content)) !== null) {
604
+ urls.push(match[0]);
605
+ }
606
+
607
+ // IP addresses
608
+ const ipPattern = /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g;
609
+ while ((match = ipPattern.exec(content)) !== null) {
610
+ ips.push(match[0]);
611
+ }
612
+
613
+ // Email addresses
614
+ const emailPattern = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
615
+ while ((match = emailPattern.exec(content)) !== null) {
616
+ emails.push(match[0]);
617
+ }
618
+
619
+ // File paths
620
+ const pathPattern = /(?:\/[\w.-]+)+|(?:[A-Z]:\\[\w\\.-]+)/gi;
621
+ while ((match = pathPattern.exec(content)) !== null) {
622
+ paths.push(match[0]);
623
+ }
624
+
625
+ // Shell commands
626
+ const cmdPattern = /(?:(?:sh|bash|cmd|powershell)\s+-c\s+['"]?|`)[^'"`]+/gi;
627
+ while ((match = cmdPattern.exec(content)) !== null) {
628
+ commands.push(match[0]);
629
+ }
630
+
631
+ return { urls, ips, emails, paths, commands };
632
+ }
633
+
634
+ // ============================================================================
635
+ // EXPORTS
636
+ // ============================================================================
637
+
638
+ export {
639
+ removeComments,
640
+ normalizeWhitespace,
641
+ decodeEscapeSequences,
642
+ normalizeStringConcatenation
643
+ };