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,709 @@
1
+ /**
2
+ * @fileoverview Vulnerability Detection Module - Utility Functions
3
+ * @module rules/vulnerabilities/utils
4
+ *
5
+ * Utility functions for vulnerability detection including safe regex matching,
6
+ * snippet extraction, taint analysis helpers, and code normalization.
7
+ */
8
+
9
+ import {
10
+ SupportedLanguage,
11
+ PatternMatch,
12
+ SourceLocation,
13
+ VulnerabilityPattern,
14
+ RegexPattern,
15
+ PatternType,
16
+ TaintSource,
17
+ TaintSink,
18
+ TaintSanitizer,
19
+ VulnerabilityType,
20
+ ConfidenceLevel
21
+ } from '../types';
22
+ import { LIMITS } from '../constants';
23
+
24
+ // ============================================================================
25
+ // SAFE REGEX MATCHING
26
+ // ============================================================================
27
+
28
+ /**
29
+ * Execute regex with timeout protection (ReDoS prevention)
30
+ *
31
+ * @param code - Source code to match against
32
+ * @param pattern - Regex pattern to match
33
+ * @returns Array of pattern matches
34
+ */
35
+ export function safeRegexMatch(
36
+ code: string,
37
+ pattern: RegexPattern
38
+ ): PatternMatch[] {
39
+ const matches: PatternMatch[] = [];
40
+ const timeout = pattern.timeout ?? LIMITS.REGEX_TIMEOUT;
41
+ const maxMatches = pattern.maxMatches ?? LIMITS.MAX_MATCHES_PER_PATTERN;
42
+
43
+ try {
44
+ const regex = new RegExp(pattern.pattern, pattern.flags ?? 'g');
45
+ const startTime = Date.now();
46
+ let match: RegExpExecArray | null;
47
+
48
+ while ((match = regex.exec(code)) !== null) {
49
+ // Check timeout
50
+ if (Date.now() - startTime > timeout) {
51
+ console.warn(`Regex timeout for pattern: ${pattern.patternId || pattern.pattern.substring(0, 50)}`);
52
+ break;
53
+ }
54
+
55
+ // Check max matches
56
+ if (matches.length >= maxMatches) {
57
+ break;
58
+ }
59
+
60
+ const line = getLineNumber(code, match.index);
61
+ const column = getColumnNumber(code, match.index);
62
+
63
+ matches.push({
64
+ pattern,
65
+ matchedText: match[0],
66
+ location: {
67
+ filePath: '',
68
+ startLine: line,
69
+ endLine: line,
70
+ startColumn: column,
71
+ endColumn: column + match[0].length
72
+ },
73
+ captures: match.slice(1)
74
+ });
75
+
76
+ // Prevent infinite loops for zero-length matches
77
+ if (match.index === regex.lastIndex) {
78
+ regex.lastIndex++;
79
+ }
80
+ }
81
+ } catch (error) {
82
+ console.error(`Regex error for pattern ${pattern.patternId}:`, error);
83
+ }
84
+
85
+ return matches;
86
+ }
87
+
88
+ /**
89
+ * Execute regex match with promise-based timeout
90
+ *
91
+ * @param code - Source code to match against
92
+ * @param pattern - Regex pattern to match
93
+ * @param timeout - Timeout in milliseconds
94
+ * @returns Promise of pattern matches
95
+ */
96
+ export async function safeRegexMatchAsync(
97
+ code: string,
98
+ pattern: RegexPattern,
99
+ timeout: number = LIMITS.REGEX_TIMEOUT
100
+ ): Promise<PatternMatch[]> {
101
+ return new Promise((resolve) => {
102
+ const timeoutId = setTimeout(() => {
103
+ resolve([]);
104
+ }, timeout);
105
+
106
+ try {
107
+ const results = safeRegexMatch(code, pattern);
108
+ clearTimeout(timeoutId);
109
+ resolve(results);
110
+ } catch {
111
+ clearTimeout(timeoutId);
112
+ resolve([]);
113
+ }
114
+ });
115
+ }
116
+
117
+ // ============================================================================
118
+ // LINE AND COLUMN UTILITIES
119
+ // ============================================================================
120
+
121
+ /**
122
+ * Get line number from character index (1-based)
123
+ *
124
+ * @param code - Source code
125
+ * @param index - Character index
126
+ * @returns Line number (1-based)
127
+ */
128
+ export function getLineNumber(code: string, index: number): number {
129
+ return code.substring(0, index).split('\n').length;
130
+ }
131
+
132
+ /**
133
+ * Get column number from character index (0-based)
134
+ *
135
+ * @param code - Source code
136
+ * @param index - Character index
137
+ * @returns Column number (0-based)
138
+ */
139
+ export function getColumnNumber(code: string, index: number): number {
140
+ const lastNewline = code.lastIndexOf('\n', index - 1);
141
+ return index - lastNewline - 1;
142
+ }
143
+
144
+ /**
145
+ * Get character index from line and column
146
+ *
147
+ * @param code - Source code
148
+ * @param line - Line number (1-based)
149
+ * @param column - Column number (0-based)
150
+ * @returns Character index
151
+ */
152
+ export function getCharacterIndex(code: string, line: number, column: number): number {
153
+ const lines = code.split('\n');
154
+ let index = 0;
155
+
156
+ for (let i = 0; i < line - 1 && i < lines.length; i++) {
157
+ index += lines[i].length + 1; // +1 for newline
158
+ }
159
+
160
+ return index + column;
161
+ }
162
+
163
+ // ============================================================================
164
+ // SNIPPET EXTRACTION
165
+ // ============================================================================
166
+
167
+ /**
168
+ * Extract code snippet with context
169
+ *
170
+ * @param code - Full source code
171
+ * @param location - Source location
172
+ * @param contextLines - Number of context lines before/after
173
+ * @returns Code snippet with context
174
+ */
175
+ export function extractSnippet(
176
+ code: string,
177
+ location: SourceLocation,
178
+ contextLines: number = 3
179
+ ): { snippet: string; highlightStart: number; highlightEnd: number } {
180
+ const lines = code.split('\n');
181
+
182
+ const startLine = Math.max(1, location.startLine - contextLines);
183
+ const endLine = Math.min(lines.length, location.endLine + contextLines);
184
+
185
+ const snippetLines = lines.slice(startLine - 1, endLine);
186
+ const snippet = snippetLines.join('\n');
187
+
188
+ // Calculate highlight positions
189
+ let highlightStart = 0;
190
+ for (let i = startLine; i < location.startLine; i++) {
191
+ highlightStart += lines[i - 1].length + 1;
192
+ }
193
+ highlightStart += location.startColumn ?? 0;
194
+
195
+ let highlightEnd = highlightStart;
196
+ for (let i = location.startLine; i <= location.endLine; i++) {
197
+ if (i === location.endLine) {
198
+ highlightEnd += (location.endColumn ?? lines[i - 1].length) - (i === location.startLine ? (location.startColumn ?? 0) : 0);
199
+ } else {
200
+ highlightEnd += lines[i - 1].length + 1 - (i === location.startLine ? (location.startColumn ?? 0) : 0);
201
+ }
202
+ }
203
+
204
+ return { snippet, highlightStart, highlightEnd };
205
+ }
206
+
207
+ /**
208
+ * Extract the specific line of code
209
+ *
210
+ * @param code - Full source code
211
+ * @param lineNumber - Line number (1-based)
212
+ * @returns The line content
213
+ */
214
+ export function extractLine(code: string, lineNumber: number): string {
215
+ const lines = code.split('\n');
216
+ if (lineNumber < 1 || lineNumber > lines.length) {
217
+ return '';
218
+ }
219
+ return lines[lineNumber - 1];
220
+ }
221
+
222
+ /**
223
+ * Format snippet for display with line numbers
224
+ *
225
+ * @param snippet - Code snippet
226
+ * @param startLine - Starting line number
227
+ * @returns Formatted snippet with line numbers
228
+ */
229
+ export function formatSnippetWithLineNumbers(snippet: string, startLine: number): string {
230
+ const lines = snippet.split('\n');
231
+ const maxLineNumWidth = String(startLine + lines.length - 1).length;
232
+
233
+ return lines.map((line, i) => {
234
+ const lineNum = String(startLine + i).padStart(maxLineNumWidth, ' ');
235
+ return `${lineNum} | ${line}`;
236
+ }).join('\n');
237
+ }
238
+
239
+ // ============================================================================
240
+ // CODE NORMALIZATION
241
+ // ============================================================================
242
+
243
+ /**
244
+ * Normalize code for consistent analysis
245
+ *
246
+ * @param code - Source code
247
+ * @param language - Programming language
248
+ * @returns Normalized code
249
+ */
250
+ export function normalizeCode(code: string, language: SupportedLanguage): string {
251
+ let normalized = code;
252
+
253
+ // Normalize line endings
254
+ normalized = normalized.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
255
+
256
+ // Truncate very long lines
257
+ const lines = normalized.split('\n');
258
+ normalized = lines.map(line => {
259
+ if (line.length > LIMITS.MAX_LINE_LENGTH) {
260
+ return line.substring(0, LIMITS.MAX_LINE_LENGTH) + '/* ... truncated */';
261
+ }
262
+ return line;
263
+ }).join('\n');
264
+
265
+ return normalized;
266
+ }
267
+
268
+ /**
269
+ * Remove comments from code (approximate)
270
+ *
271
+ * @param code - Source code
272
+ * @param language - Programming language
273
+ * @returns Code without comments
274
+ */
275
+ export function removeComments(code: string, language: SupportedLanguage): string {
276
+ let result = code;
277
+
278
+ switch (language) {
279
+ case SupportedLanguage.JAVASCRIPT:
280
+ case SupportedLanguage.TYPESCRIPT:
281
+ case SupportedLanguage.JAVA:
282
+ case SupportedLanguage.CSHARP:
283
+ case SupportedLanguage.CPP:
284
+ case SupportedLanguage.C:
285
+ // Remove single-line comments
286
+ result = result.replace(/\/\/[^\n]*/g, '');
287
+ // Remove multi-line comments (non-greedy)
288
+ result = result.replace(/\/\*[\s\S]*?\*\//g, '');
289
+ break;
290
+
291
+ case SupportedLanguage.PYTHON:
292
+ case SupportedLanguage.RUBY:
293
+ case SupportedLanguage.SHELL:
294
+ case SupportedLanguage.YAML:
295
+ // Remove hash comments
296
+ result = result.replace(/#[^\n]*/g, '');
297
+ // Remove docstrings (Python)
298
+ result = result.replace(/'''[\s\S]*?'''/g, '');
299
+ result = result.replace(/"""[\s\S]*?"""/g, '');
300
+ break;
301
+
302
+ case SupportedLanguage.PHP:
303
+ // Remove single-line comments (// and #)
304
+ result = result.replace(/(?:\/\/|#)[^\n]*/g, '');
305
+ // Remove multi-line comments
306
+ result = result.replace(/\/\*[\s\S]*?\*\//g, '');
307
+ break;
308
+ }
309
+
310
+ return result;
311
+ }
312
+
313
+ // ============================================================================
314
+ // STRING ANALYSIS
315
+ // ============================================================================
316
+
317
+ /**
318
+ * Check if a string appears to be a SQL query
319
+ *
320
+ * @param text - Text to check
321
+ * @returns True if text looks like SQL
322
+ */
323
+ export function looksLikeSql(text: string): boolean {
324
+ const sqlKeywords = /\b(SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|TRUNCATE|EXEC|EXECUTE|UNION|WHERE|FROM|INTO|VALUES|SET)\b/i;
325
+ return sqlKeywords.test(text);
326
+ }
327
+
328
+ /**
329
+ * Check if a string appears to be a shell command
330
+ *
331
+ * @param text - Text to check
332
+ * @returns True if text looks like a shell command
333
+ */
334
+ export function looksLikeCommand(text: string): boolean {
335
+ const commandPatterns = /\b(bash|sh|cmd|powershell|ls|dir|cat|rm|del|wget|curl|nc|netcat|chmod|chown|sudo|su)\b|\||\&\&|\|\|/i;
336
+ return commandPatterns.test(text);
337
+ }
338
+
339
+ /**
340
+ * Check if a string appears to be HTML
341
+ *
342
+ * @param text - Text to check
343
+ * @returns True if text looks like HTML
344
+ */
345
+ export function looksLikeHtml(text: string): boolean {
346
+ const htmlPatterns = /<\s*(?:script|img|iframe|a|div|span|input|form|button|svg|object|embed|link|style)[^>]*>/i;
347
+ return htmlPatterns.test(text);
348
+ }
349
+
350
+ /**
351
+ * Check if text contains user-controlled input indicators
352
+ *
353
+ * @param text - Text to check
354
+ * @param language - Programming language
355
+ * @returns True if text contains user input patterns
356
+ */
357
+ export function containsUserInput(text: string, language: SupportedLanguage): boolean {
358
+ const patterns: Record<string, RegExp[]> = {
359
+ javascript: [
360
+ /req\.(body|query|params|headers|cookies)/,
361
+ /\$\.(get|post|ajax)/,
362
+ /location\.(search|hash|href)/,
363
+ /document\.(cookie|referrer)/
364
+ ],
365
+ typescript: [
366
+ /req\.(body|query|params|headers|cookies)/,
367
+ /location\.(search|hash|href)/
368
+ ],
369
+ python: [
370
+ /request\.(args|form|data|json|headers|cookies)/,
371
+ /\binput\s*\(/,
372
+ /sys\.argv/
373
+ ],
374
+ php: [
375
+ /\$_(GET|POST|REQUEST|COOKIE|SERVER|FILES)\s*\[/
376
+ ],
377
+ java: [
378
+ /getParameter|getHeader|getCookies|getInputStream|@RequestBody|@PathVariable/
379
+ ],
380
+ csharp: [
381
+ /Request\.(Form|QueryString|Headers|Cookies)|FromBody|FromQuery|FromRoute/
382
+ ]
383
+ };
384
+
385
+ const langPatterns = patterns[language] || [];
386
+ return langPatterns.some(p => p.test(text));
387
+ }
388
+
389
+ // ============================================================================
390
+ // TAINT ANALYSIS HELPERS
391
+ // ============================================================================
392
+
393
+ /**
394
+ * Find taint sources in code
395
+ *
396
+ * @param code - Source code
397
+ * @param sources - Taint source definitions
398
+ * @param language - Programming language
399
+ * @returns Array of found sources with locations
400
+ */
401
+ export function findTaintSources(
402
+ code: string,
403
+ sources: TaintSource[],
404
+ language: SupportedLanguage
405
+ ): Array<{ source: TaintSource; location: SourceLocation; matchedText: string }> {
406
+ const results: Array<{ source: TaintSource; location: SourceLocation; matchedText: string }> = [];
407
+
408
+ for (const source of sources) {
409
+ // Check language compatibility
410
+ if (source.languages && !source.languages.includes(language)) {
411
+ continue;
412
+ }
413
+
414
+ const pattern = typeof source.pattern === 'string'
415
+ ? new RegExp(source.pattern, 'g')
416
+ : source.pattern;
417
+
418
+ let match: RegExpExecArray | null;
419
+ const regex = new RegExp(pattern.source, pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g');
420
+
421
+ while ((match = regex.exec(code)) !== null) {
422
+ const line = getLineNumber(code, match.index);
423
+ const column = getColumnNumber(code, match.index);
424
+
425
+ results.push({
426
+ source,
427
+ location: {
428
+ filePath: '',
429
+ startLine: line,
430
+ endLine: line,
431
+ startColumn: column,
432
+ endColumn: column + match[0].length
433
+ },
434
+ matchedText: match[0]
435
+ });
436
+
437
+ if (results.length >= LIMITS.MAX_MATCHES_PER_PATTERN) {
438
+ break;
439
+ }
440
+ }
441
+ }
442
+
443
+ return results;
444
+ }
445
+
446
+ /**
447
+ * Find taint sinks in code
448
+ *
449
+ * @param code - Source code
450
+ * @param sinks - Taint sink definitions
451
+ * @param language - Programming language
452
+ * @returns Array of found sinks with locations
453
+ */
454
+ export function findTaintSinks(
455
+ code: string,
456
+ sinks: TaintSink[],
457
+ language: SupportedLanguage
458
+ ): Array<{ sink: TaintSink; location: SourceLocation; matchedText: string }> {
459
+ const results: Array<{ sink: TaintSink; location: SourceLocation; matchedText: string }> = [];
460
+
461
+ for (const sink of sinks) {
462
+ // Check language compatibility
463
+ if (sink.languages && !sink.languages.includes(language)) {
464
+ continue;
465
+ }
466
+
467
+ const pattern = typeof sink.pattern === 'string'
468
+ ? new RegExp(sink.pattern, 'g')
469
+ : sink.pattern;
470
+
471
+ let match: RegExpExecArray | null;
472
+ const regex = new RegExp(pattern.source, pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g');
473
+
474
+ while ((match = regex.exec(code)) !== null) {
475
+ const line = getLineNumber(code, match.index);
476
+ const column = getColumnNumber(code, match.index);
477
+
478
+ results.push({
479
+ sink,
480
+ location: {
481
+ filePath: '',
482
+ startLine: line,
483
+ endLine: line,
484
+ startColumn: column,
485
+ endColumn: column + match[0].length
486
+ },
487
+ matchedText: match[0]
488
+ });
489
+
490
+ if (results.length >= LIMITS.MAX_MATCHES_PER_PATTERN) {
491
+ break;
492
+ }
493
+ }
494
+ }
495
+
496
+ return results;
497
+ }
498
+
499
+ /**
500
+ * Check if sanitization is present between source and sink
501
+ *
502
+ * @param code - Source code
503
+ * @param sourceLocation - Source location
504
+ * @param sinkLocation - Sink location
505
+ * @param sanitizers - Sanitizer definitions
506
+ * @returns Found sanitizers between source and sink
507
+ */
508
+ export function findSanitizers(
509
+ code: string,
510
+ sourceLocation: SourceLocation,
511
+ sinkLocation: SourceLocation,
512
+ sanitizers: TaintSanitizer[]
513
+ ): TaintSanitizer[] {
514
+ const found: TaintSanitizer[] = [];
515
+
516
+ // Get code between source and sink
517
+ const sourceIndex = getCharacterIndex(code, sourceLocation.startLine, sourceLocation.startColumn ?? 0);
518
+ const sinkIndex = getCharacterIndex(code, sinkLocation.startLine, sinkLocation.startColumn ?? 0);
519
+
520
+ // Handle both directions
521
+ const start = Math.min(sourceIndex, sinkIndex);
522
+ const end = Math.max(sourceIndex, sinkIndex);
523
+ const codeBetween = code.substring(start, end);
524
+
525
+ for (const sanitizer of sanitizers) {
526
+ const pattern = typeof sanitizer.pattern === 'string'
527
+ ? new RegExp(sanitizer.pattern, 'gi')
528
+ : sanitizer.pattern;
529
+
530
+ if (pattern.test(codeBetween)) {
531
+ found.push(sanitizer);
532
+ }
533
+ }
534
+
535
+ return found;
536
+ }
537
+
538
+ // ============================================================================
539
+ // CONTEXT DETECTION
540
+ // ============================================================================
541
+
542
+ /**
543
+ * Check if code location is inside a test file
544
+ *
545
+ * @param filePath - File path
546
+ * @returns True if file is a test file
547
+ */
548
+ export function isTestFile(filePath: string): boolean {
549
+ const testPatterns = [
550
+ /\.test\.[jt]sx?$/,
551
+ /\.spec\.[jt]sx?$/,
552
+ /_test\.[jt]sx?$/,
553
+ /_spec\.[jt]sx?$/,
554
+ /test_.*\.(py|js|ts)$/,
555
+ /.*_test\.(py|js|ts)$/,
556
+ /tests?\//i,
557
+ /__tests__\//,
558
+ /spec\//i
559
+ ];
560
+
561
+ return testPatterns.some(p => p.test(filePath));
562
+ }
563
+
564
+ /**
565
+ * Check if code location is inside vendor/node_modules
566
+ *
567
+ * @param filePath - File path
568
+ * @returns True if file is vendor code
569
+ */
570
+ export function isVendorCode(filePath: string): boolean {
571
+ const vendorPatterns = [
572
+ /node_modules\//,
573
+ /vendor\//,
574
+ /bower_components\//,
575
+ /third_party\//,
576
+ /external\//,
577
+ /\.min\.js$/,
578
+ /\.bundle\.js$/
579
+ ];
580
+
581
+ return vendorPatterns.some(p => p.test(filePath));
582
+ }
583
+
584
+ /**
585
+ * Detect the programming language from file extension
586
+ *
587
+ * @param filePath - File path
588
+ * @returns Detected language or null
589
+ */
590
+ export function detectLanguage(filePath: string): SupportedLanguage | null {
591
+ const extension = filePath.split('.').pop()?.toLowerCase();
592
+
593
+ const extensionMap: Record<string, SupportedLanguage> = {
594
+ 'js': SupportedLanguage.JAVASCRIPT,
595
+ 'jsx': SupportedLanguage.JAVASCRIPT,
596
+ 'mjs': SupportedLanguage.JAVASCRIPT,
597
+ 'cjs': SupportedLanguage.JAVASCRIPT,
598
+ 'ts': SupportedLanguage.TYPESCRIPT,
599
+ 'tsx': SupportedLanguage.TYPESCRIPT,
600
+ 'py': SupportedLanguage.PYTHON,
601
+ 'php': SupportedLanguage.PHP,
602
+ 'java': SupportedLanguage.JAVA,
603
+ 'c': SupportedLanguage.C,
604
+ 'h': SupportedLanguage.C,
605
+ 'cpp': SupportedLanguage.CPP,
606
+ 'cc': SupportedLanguage.CPP,
607
+ 'cxx': SupportedLanguage.CPP,
608
+ 'hpp': SupportedLanguage.CPP,
609
+ 'cs': SupportedLanguage.CSHARP,
610
+ 'rb': SupportedLanguage.RUBY,
611
+ 'go': SupportedLanguage.GO,
612
+ 'rs': SupportedLanguage.RUST,
613
+ 'sh': SupportedLanguage.SHELL,
614
+ 'bash': SupportedLanguage.SHELL,
615
+ 'ps1': SupportedLanguage.POWERSHELL,
616
+ 'dockerfile': SupportedLanguage.DOCKERFILE,
617
+ 'yaml': SupportedLanguage.YAML,
618
+ 'yml': SupportedLanguage.YAML,
619
+ 'tf': SupportedLanguage.TERRAFORM
620
+ };
621
+
622
+ return extensionMap[extension ?? ''] ?? null;
623
+ }
624
+
625
+ // ============================================================================
626
+ // CONFIDENCE CALCULATION
627
+ // ============================================================================
628
+
629
+ /**
630
+ * Calculate confidence based on multiple factors
631
+ *
632
+ * @param factors - Array of confidence factors (0-1)
633
+ * @returns Combined confidence level
634
+ */
635
+ export function calculateConfidence(factors: number[]): ConfidenceLevel {
636
+ if (factors.length === 0) return ConfidenceLevel.TENTATIVE;
637
+
638
+ const average = factors.reduce((sum, f) => sum + f, 0) / factors.length;
639
+
640
+ if (average >= 0.95) return ConfidenceLevel.CONFIRMED;
641
+ if (average >= 0.80) return ConfidenceLevel.HIGH;
642
+ if (average >= 0.60) return ConfidenceLevel.MEDIUM;
643
+ if (average >= 0.40) return ConfidenceLevel.LOW;
644
+ return ConfidenceLevel.TENTATIVE;
645
+ }
646
+
647
+ /**
648
+ * Boost confidence when taint flow is confirmed
649
+ *
650
+ * @param baseConfidence - Base confidence level
651
+ * @param hasTaintFlow - Whether taint flow was detected
652
+ * @returns Adjusted confidence level
653
+ */
654
+ export function adjustConfidenceForTaintFlow(
655
+ baseConfidence: ConfidenceLevel,
656
+ hasTaintFlow: boolean
657
+ ): ConfidenceLevel {
658
+ if (!hasTaintFlow) return baseConfidence;
659
+
660
+ const levels: ConfidenceLevel[] = [
661
+ ConfidenceLevel.TENTATIVE,
662
+ ConfidenceLevel.LOW,
663
+ ConfidenceLevel.MEDIUM,
664
+ ConfidenceLevel.HIGH,
665
+ ConfidenceLevel.CONFIRMED
666
+ ];
667
+
668
+ const currentIndex = levels.indexOf(baseConfidence);
669
+ const newIndex = Math.min(currentIndex + 1, levels.length - 1);
670
+
671
+ return levels[newIndex];
672
+ }
673
+
674
+ // ============================================================================
675
+ // UNIQUE ID GENERATION
676
+ // ============================================================================
677
+
678
+ /**
679
+ * Generate unique finding ID
680
+ *
681
+ * @param ruleId - Rule ID
682
+ * @param filePath - File path
683
+ * @param line - Line number
684
+ * @returns Unique finding ID
685
+ */
686
+ export function generateFindingId(
687
+ ruleId: string,
688
+ filePath: string,
689
+ line: number
690
+ ): string {
691
+ const hash = simpleHash(`${ruleId}:${filePath}:${line}`);
692
+ return `${ruleId}-${hash}`;
693
+ }
694
+
695
+ /**
696
+ * Simple string hash function
697
+ *
698
+ * @param str - String to hash
699
+ * @returns Hash string
700
+ */
701
+ function simpleHash(str: string): string {
702
+ let hash = 0;
703
+ for (let i = 0; i < str.length; i++) {
704
+ const char = str.charCodeAt(i);
705
+ hash = ((hash << 5) - hash) + char;
706
+ hash = hash & hash; // Convert to 32-bit integer
707
+ }
708
+ return Math.abs(hash).toString(16).substring(0, 8);
709
+ }