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,831 @@
1
+ /**
2
+ * @fileoverview Vulnerability Rule Engine - Core Detection Engine
3
+ * @module rules/vulnerabilities/engine
4
+ *
5
+ * Orchestrates vulnerability detection across all rule categories:
6
+ * - Multi-pattern matching with timeout protection
7
+ * - Taint analysis integration
8
+ * - AST-aware analysis
9
+ * - Dynamic scoring
10
+ * - Rule correlation
11
+ * - Finding aggregation and deduplication
12
+ */
13
+
14
+ import {
15
+ VulnerabilityRule,
16
+ VulnerabilityFinding,
17
+ VulnerabilityPattern,
18
+ VulnerabilityScore,
19
+ AnalysisContext,
20
+ AnalysisOptions,
21
+ IVulnerabilityRuleEngine,
22
+ IPatternMatcher,
23
+ PatternMatch,
24
+ PatternType,
25
+ VulnerabilitySeverity,
26
+ ConfidenceLevel,
27
+ SourceLocation,
28
+ SupportedLanguage,
29
+ RegexPattern,
30
+ TaintFlow,
31
+ DataFlowTrace,
32
+ SecurityStandards
33
+ } from '../types';
34
+
35
+ import {
36
+ safeRegexMatch,
37
+ safeRegexMatchAsync,
38
+ extractSnippet,
39
+ formatSnippetWithLineNumbers,
40
+ normalizeCode,
41
+ generateFindingId,
42
+ isTestFile,
43
+ isVendorCode,
44
+ getLineNumber,
45
+ getColumnNumber,
46
+ findTaintSources,
47
+ findTaintSinks,
48
+ findSanitizers,
49
+ adjustConfidenceForTaintFlow
50
+ } from '../utils';
51
+
52
+ import { VulnerabilityScoreCalculator } from '../scoring';
53
+ import { LIMITS } from '../constants';
54
+
55
+ // ============================================================================
56
+ // PATTERN MATCHER IMPLEMENTATION
57
+ // ============================================================================
58
+
59
+ /**
60
+ * Pattern matcher with timeout protection
61
+ */
62
+ export class PatternMatcher implements IPatternMatcher {
63
+ private timeoutMs: number;
64
+ private maxMatches: number;
65
+
66
+ constructor(options?: { timeoutMs?: number; maxMatches?: number }) {
67
+ this.timeoutMs = options?.timeoutMs ?? LIMITS.REGEX_TIMEOUT;
68
+ this.maxMatches = options?.maxMatches ?? LIMITS.MAX_MATCHES_PER_PATTERN;
69
+ }
70
+
71
+ /**
72
+ * Match patterns against content
73
+ */
74
+ match(
75
+ content: string,
76
+ patterns: VulnerabilityPattern[],
77
+ language: SupportedLanguage
78
+ ): PatternMatch[] {
79
+ const allMatches: PatternMatch[] = [];
80
+
81
+ for (const pattern of patterns) {
82
+ // Check language compatibility
83
+ if (pattern.languages && !pattern.languages.includes(language)) {
84
+ continue;
85
+ }
86
+
87
+ const matches = this.matchSinglePattern(pattern, content, language);
88
+ allMatches.push(...matches);
89
+
90
+ if (allMatches.length >= this.maxMatches) {
91
+ break;
92
+ }
93
+ }
94
+
95
+ return allMatches;
96
+ }
97
+
98
+ /**
99
+ * Match with timeout protection
100
+ */
101
+ async matchWithTimeout(
102
+ content: string,
103
+ patterns: VulnerabilityPattern[],
104
+ language: SupportedLanguage,
105
+ timeout: number
106
+ ): Promise<PatternMatch[]> {
107
+ return new Promise((resolve) => {
108
+ const timeoutId = setTimeout(() => {
109
+ resolve([]);
110
+ }, timeout);
111
+
112
+ try {
113
+ const results = this.match(content, patterns, language);
114
+ clearTimeout(timeoutId);
115
+ resolve(results);
116
+ } catch {
117
+ clearTimeout(timeoutId);
118
+ resolve([]);
119
+ }
120
+ });
121
+ }
122
+
123
+ /**
124
+ * Match a single pattern against code
125
+ */
126
+ private matchSinglePattern(
127
+ pattern: VulnerabilityPattern,
128
+ code: string,
129
+ language: SupportedLanguage
130
+ ): PatternMatch[] {
131
+ try {
132
+ switch (pattern.type) {
133
+ case PatternType.REGEX:
134
+ return safeRegexMatch(code, pattern as RegexPattern);
135
+
136
+ case PatternType.LITERAL:
137
+ return this.matchLiteralPattern(pattern, code);
138
+
139
+ case PatternType.AST:
140
+ // AST patterns require external AST parser
141
+ return [];
142
+
143
+ case PatternType.TAINT:
144
+ // Taint patterns are handled separately
145
+ return [];
146
+
147
+ case PatternType.SEMANTIC:
148
+ // Semantic patterns require deeper analysis
149
+ return [];
150
+
151
+ case PatternType.CFG:
152
+ // CFG patterns require control flow analysis
153
+ return [];
154
+
155
+ default:
156
+ return [];
157
+ }
158
+ } catch (error) {
159
+ console.error(`Pattern matching error for ${pattern.patternId}:`, error);
160
+ return [];
161
+ }
162
+ }
163
+
164
+ /**
165
+ * Match literal string pattern
166
+ */
167
+ private matchLiteralPattern(
168
+ pattern: VulnerabilityPattern,
169
+ code: string
170
+ ): PatternMatch[] {
171
+ const matches: PatternMatch[] = [];
172
+
173
+ if (pattern.type !== PatternType.LITERAL) return matches;
174
+
175
+ const literalPattern = pattern as { type: PatternType.LITERAL; value: string; caseSensitive?: boolean };
176
+ const searchString = literalPattern.value || '';
177
+ const searchCode = literalPattern.caseSensitive === false ? code.toLowerCase() : code;
178
+ const searchFor = literalPattern.caseSensitive === false ? searchString.toLowerCase() : searchString;
179
+
180
+ let index = 0;
181
+
182
+ while (index < searchCode.length && matches.length < this.maxMatches) {
183
+ index = searchCode.indexOf(searchFor, index);
184
+ if (index === -1) break;
185
+
186
+ const line = getLineNumber(code, index);
187
+ const column = getColumnNumber(code, index);
188
+
189
+ matches.push({
190
+ pattern,
191
+ matchedText: code.substring(index, index + searchString.length),
192
+ location: {
193
+ filePath: '',
194
+ startLine: line,
195
+ endLine: line,
196
+ startColumn: column,
197
+ endColumn: column + searchString.length
198
+ }
199
+ });
200
+
201
+ index += searchString.length;
202
+ }
203
+
204
+ return matches;
205
+ }
206
+ }
207
+
208
+ // ============================================================================
209
+ // SIMPLE TAINT ANALYZER
210
+ // ============================================================================
211
+
212
+ /**
213
+ * Simple taint analyzer for detecting data flows
214
+ */
215
+ export class SimpleTaintAnalyzer {
216
+ /**
217
+ * Analyze taint flows in code
218
+ */
219
+ analyze(
220
+ context: AnalysisContext,
221
+ rule: VulnerabilityRule
222
+ ): TaintFlow[] {
223
+ const flows: TaintFlow[] = [];
224
+
225
+ if (!rule.taintSources || !rule.taintSinks) {
226
+ return flows;
227
+ }
228
+
229
+ // Find all sources
230
+ const sources = findTaintSources(
231
+ context.content,
232
+ rule.taintSources,
233
+ context.language
234
+ );
235
+
236
+ // Find all sinks
237
+ const sinks = findTaintSinks(
238
+ context.content,
239
+ rule.taintSinks,
240
+ context.language
241
+ );
242
+
243
+ // For each source-sink pair, check if there's a potential flow
244
+ for (const sourceMatch of sources) {
245
+ for (const sinkMatch of sinks) {
246
+ // Simple heuristic: if source appears before sink in the same file
247
+ if (sourceMatch.location.startLine <= sinkMatch.location.startLine) {
248
+ // Check for sanitizers between source and sink
249
+ const sanitizers = rule.taintSanitizers
250
+ ? findSanitizers(
251
+ context.content,
252
+ sourceMatch.location,
253
+ sinkMatch.location,
254
+ rule.taintSanitizers
255
+ )
256
+ : [];
257
+
258
+ const isExploitable = sanitizers.length === 0;
259
+
260
+ flows.push({
261
+ source: sourceMatch.source,
262
+ sink: sinkMatch.sink,
263
+ path: [
264
+ {
265
+ name: sourceMatch.matchedText,
266
+ location: sourceMatch.location,
267
+ operation: 'source'
268
+ },
269
+ {
270
+ name: sinkMatch.matchedText,
271
+ location: sinkMatch.location,
272
+ operation: 'sink'
273
+ }
274
+ ],
275
+ sanitizers,
276
+ isExploitable,
277
+ confidence: isExploitable ? ConfidenceLevel.HIGH : ConfidenceLevel.MEDIUM
278
+ });
279
+ }
280
+ }
281
+ }
282
+
283
+ return flows;
284
+ }
285
+
286
+ /**
287
+ * Convert taint flow to data flow trace for reporting
288
+ */
289
+ createDataFlowTrace(
290
+ flow: TaintFlow,
291
+ code: string
292
+ ): DataFlowTrace {
293
+ const sourceSnippet = extractSnippet(code, flow.path[0].location, 1);
294
+ const sinkSnippet = extractSnippet(code, flow.path[flow.path.length - 1].location, 1);
295
+
296
+ return {
297
+ source: {
298
+ name: flow.source.name,
299
+ location: flow.path[0].location,
300
+ codeSnippet: sourceSnippet.snippet
301
+ },
302
+ propagation: flow.path.slice(1, -1).map(node => ({
303
+ variable: node.name,
304
+ location: node.location,
305
+ operation: node.operation || 'propagate',
306
+ codeSnippet: extractSnippet(code, node.location, 0).snippet
307
+ })),
308
+ sink: {
309
+ name: flow.sink.name,
310
+ location: flow.path[flow.path.length - 1].location,
311
+ codeSnippet: sinkSnippet.snippet
312
+ },
313
+ sanitized: flow.sanitizers.length > 0,
314
+ sanitizationDetails: flow.sanitizers.length > 0 ? {
315
+ sanitizer: flow.sanitizers[0].name,
316
+ location: flow.path[0].location, // Approximate
317
+ effectiveness: flow.sanitizers[0].effectiveness ?? 80
318
+ } : undefined
319
+ };
320
+ }
321
+ }
322
+
323
+ // ============================================================================
324
+ // ENGINE OPTIONS
325
+ // ============================================================================
326
+
327
+ export interface EngineOptions {
328
+ enableTaintAnalysis: boolean;
329
+ enableAstAnalysis: boolean;
330
+ enableCfgAnalysis: boolean;
331
+ timeoutMs: number;
332
+ maxFindings: number;
333
+ minConfidence: ConfidenceLevel;
334
+ includeInfo: boolean;
335
+ excludeTestFiles: boolean;
336
+ excludeVendorCode: boolean;
337
+ language?: SupportedLanguage;
338
+ }
339
+
340
+ const DEFAULT_OPTIONS: EngineOptions = {
341
+ enableTaintAnalysis: true,
342
+ enableAstAnalysis: false,
343
+ enableCfgAnalysis: false,
344
+ timeoutMs: LIMITS.RULE_TIMEOUT,
345
+ maxFindings: LIMITS.MAX_FINDINGS_PER_FILE,
346
+ minConfidence: ConfidenceLevel.LOW,
347
+ includeInfo: false,
348
+ excludeTestFiles: false,
349
+ excludeVendorCode: true
350
+ };
351
+
352
+ // ============================================================================
353
+ // VULNERABILITY RULE ENGINE
354
+ // ============================================================================
355
+
356
+ /**
357
+ * Main vulnerability detection engine
358
+ */
359
+ export class VulnerabilityRuleEngine implements IVulnerabilityRuleEngine {
360
+ private rules: Map<string, VulnerabilityRule>;
361
+ private patternMatcher: PatternMatcher;
362
+ private taintAnalyzer: SimpleTaintAnalyzer;
363
+ private scoreCalculator: VulnerabilityScoreCalculator;
364
+ private engineOptions: EngineOptions;
365
+
366
+ constructor(
367
+ rules: VulnerabilityRule[],
368
+ options?: Partial<EngineOptions>
369
+ ) {
370
+ this.rules = new Map(rules.map(rule => [rule.id, rule]));
371
+ this.patternMatcher = new PatternMatcher();
372
+ this.taintAnalyzer = new SimpleTaintAnalyzer();
373
+ this.scoreCalculator = new VulnerabilityScoreCalculator();
374
+ this.engineOptions = { ...DEFAULT_OPTIONS, ...options };
375
+ }
376
+
377
+ /**
378
+ * Analyze code against all enabled rules
379
+ */
380
+ async analyze(
381
+ context: AnalysisContext,
382
+ options?: AnalysisOptions
383
+ ): Promise<VulnerabilityFinding[]> {
384
+ const mergedOptions = { ...this.engineOptions, ...options };
385
+
386
+ // Check exclusions
387
+ if (mergedOptions.excludeTestFiles && isTestFile(context.filePath)) {
388
+ return [];
389
+ }
390
+ if (mergedOptions.excludeVendorCode && isVendorCode(context.filePath)) {
391
+ return [];
392
+ }
393
+
394
+ // Normalize code
395
+ const normalizedCode = normalizeCode(context.content, context.language);
396
+ const normalizedContext = { ...context, content: normalizedCode };
397
+
398
+ // Get applicable rules
399
+ const applicableRules = this.getApplicableRules(context.language);
400
+
401
+ const findings: VulnerabilityFinding[] = [];
402
+
403
+ for (const rule of applicableRules) {
404
+ try {
405
+ const ruleFindings = await this.analyzeWithRule(
406
+ normalizedContext,
407
+ rule,
408
+ mergedOptions
409
+ );
410
+ findings.push(...ruleFindings);
411
+
412
+ if (findings.length >= mergedOptions.maxFindings) {
413
+ break;
414
+ }
415
+ } catch (error) {
416
+ console.error(`Error analyzing with rule ${rule.id}:`, error);
417
+ }
418
+ }
419
+
420
+ // Sort by severity and score
421
+ findings.sort((a, b) => {
422
+ const severityOrder = {
423
+ [VulnerabilitySeverity.CRITICAL]: 0,
424
+ [VulnerabilitySeverity.HIGH]: 1,
425
+ [VulnerabilitySeverity.MEDIUM]: 2,
426
+ [VulnerabilitySeverity.LOW]: 3,
427
+ [VulnerabilitySeverity.INFO]: 4
428
+ };
429
+
430
+ const severityDiff = severityOrder[a.severity] - severityOrder[b.severity];
431
+ if (severityDiff !== 0) return severityDiff;
432
+
433
+ return b.score.score - a.score.score;
434
+ });
435
+
436
+ // Deduplicate
437
+ return this.deduplicateFindings(findings);
438
+ }
439
+
440
+ /**
441
+ * Analyze code with a specific rule
442
+ */
443
+ private async analyzeWithRule(
444
+ context: AnalysisContext,
445
+ rule: VulnerabilityRule,
446
+ options: EngineOptions
447
+ ): Promise<VulnerabilityFinding[]> {
448
+ const findings: VulnerabilityFinding[] = [];
449
+
450
+ // Pattern matching
451
+ const matches = await this.patternMatcher.matchWithTimeout(
452
+ context.content,
453
+ rule.patterns,
454
+ context.language,
455
+ options.timeoutMs
456
+ );
457
+
458
+ if (matches.length === 0) {
459
+ return findings;
460
+ }
461
+
462
+ // Taint analysis if enabled
463
+ let taintFlows: TaintFlow[] = [];
464
+ if (options.enableTaintAnalysis && (rule.taintSources || rule.taintSinks)) {
465
+ taintFlows = this.taintAnalyzer.analyze(context, rule);
466
+ }
467
+
468
+ // Group matches by location to avoid duplicate findings
469
+ const locationGroups = this.groupMatchesByLocation(matches);
470
+
471
+ for (const [locationKey, groupMatches] of locationGroups) {
472
+ // Find relevant taint flow for this location
473
+ const relevantFlow = taintFlows.find(flow =>
474
+ flow.path.some(node =>
475
+ this.locationsOverlap(node.location, groupMatches[0].location)
476
+ )
477
+ );
478
+
479
+ // Calculate score
480
+ const score = this.scoreCalculator.calculateScore(
481
+ rule,
482
+ groupMatches,
483
+ context,
484
+ relevantFlow
485
+ );
486
+
487
+ // Check minimum confidence
488
+ const confidence = relevantFlow
489
+ ? adjustConfidenceForTaintFlow(rule.confidence, true)
490
+ : rule.confidence;
491
+
492
+ if (!this.meetsMinConfidence(confidence, options.minConfidence)) {
493
+ continue;
494
+ }
495
+
496
+ // Filter out INFO if not requested
497
+ if (!options.includeInfo && score.calculatedSeverity === VulnerabilitySeverity.INFO) {
498
+ continue;
499
+ }
500
+
501
+ // Create finding
502
+ const finding = this.createFinding(
503
+ rule,
504
+ groupMatches,
505
+ context,
506
+ score,
507
+ relevantFlow
508
+ );
509
+
510
+ findings.push(finding);
511
+ }
512
+
513
+ return findings;
514
+ }
515
+
516
+ /**
517
+ * Create a vulnerability finding
518
+ */
519
+ private createFinding(
520
+ rule: VulnerabilityRule,
521
+ matches: PatternMatch[],
522
+ context: AnalysisContext,
523
+ score: VulnerabilityScore,
524
+ taintFlow?: TaintFlow
525
+ ): VulnerabilityFinding {
526
+ const primaryMatch = matches[0];
527
+ const location: SourceLocation = {
528
+ filePath: context.filePath,
529
+ startLine: primaryMatch.location.startLine,
530
+ endLine: primaryMatch.location.endLine,
531
+ startColumn: primaryMatch.location.startColumn,
532
+ endColumn: primaryMatch.location.endColumn
533
+ };
534
+
535
+ const { snippet } = extractSnippet(context.content, location, 3);
536
+
537
+ // Build data flow trace if taint flow exists
538
+ let dataFlowTrace: DataFlowTrace | undefined;
539
+ if (taintFlow) {
540
+ dataFlowTrace = this.taintAnalyzer.createDataFlowTrace(
541
+ taintFlow,
542
+ context.content
543
+ );
544
+ }
545
+
546
+ // Determine final confidence
547
+ const confidence = taintFlow
548
+ ? adjustConfidenceForTaintFlow(rule.confidence, true)
549
+ : rule.confidence;
550
+
551
+ return {
552
+ id: generateFindingId(rule.id, context.filePath, location.startLine),
553
+ ruleId: rule.id,
554
+ ruleName: rule.name,
555
+ location,
556
+ codeSnippet: snippet,
557
+ highlightedCode: primaryMatch.matchedText,
558
+ vulnerabilityType: rule.vulnerabilityType,
559
+ category: rule.category,
560
+ severity: score.calculatedSeverity,
561
+ confidence,
562
+ score,
563
+ patternMatches: matches,
564
+ taintFlow,
565
+ dataFlowTrace,
566
+ message: this.generateMessage(rule, matches, taintFlow),
567
+ auditAnalysis: this.generateAuditAnalysis(rule, matches, taintFlow, score),
568
+ developerExplanation: this.generateDeveloperExplanation(rule, matches),
569
+ remediation: rule.remediation,
570
+ standards: rule.standards,
571
+ detectedAt: new Date().toISOString(),
572
+ language: context.language,
573
+ isTestCode: context.isTestFile,
574
+ isVendorCode: context.isVendorCode
575
+ };
576
+ }
577
+
578
+ /**
579
+ * Generate finding message
580
+ */
581
+ private generateMessage(
582
+ rule: VulnerabilityRule,
583
+ matches: PatternMatch[],
584
+ taintFlow?: TaintFlow
585
+ ): string {
586
+ let message = `${rule.name}: ${rule.description}`;
587
+
588
+ if (taintFlow && taintFlow.isExploitable) {
589
+ message += ` Confirmed data flow from '${taintFlow.source.name}' to '${taintFlow.sink.name}'.`;
590
+ }
591
+
592
+ return message;
593
+ }
594
+
595
+ /**
596
+ * Generate detailed audit analysis
597
+ */
598
+ private generateAuditAnalysis(
599
+ rule: VulnerabilityRule,
600
+ matches: PatternMatch[],
601
+ taintFlow: TaintFlow | undefined,
602
+ score: VulnerabilityScore
603
+ ): string {
604
+ const parts: string[] = [];
605
+
606
+ parts.push(`## Vulnerability Analysis: ${rule.name}`);
607
+ parts.push('');
608
+ parts.push(`**Vulnerability Type:** ${rule.vulnerabilityType}`);
609
+ parts.push(`**Category:** ${rule.category}`);
610
+ parts.push(`**Severity:** ${score.calculatedSeverity.toUpperCase()}`);
611
+ parts.push(`**Risk Score:** ${score.score}/100`);
612
+ parts.push('');
613
+
614
+ // Standards mapping
615
+ parts.push('### Security Standards');
616
+ if (rule.standards.owasp?.length) {
617
+ parts.push(`**OWASP:** ${rule.standards.owasp.map(o => o.id).join(', ')}`);
618
+ }
619
+ if (rule.standards.cwe?.length) {
620
+ parts.push(`**CWE:** ${rule.standards.cwe.map(c => c.id).join(', ')}`);
621
+ }
622
+ parts.push('');
623
+
624
+ // Detection details
625
+ parts.push('### Detection Details');
626
+ parts.push(`**Pattern Matches:** ${matches.length}`);
627
+
628
+ if (taintFlow) {
629
+ parts.push('');
630
+ parts.push('### Data Flow Analysis');
631
+ parts.push(`**Source:** ${taintFlow.source.name}`);
632
+ parts.push(`**Sink:** ${taintFlow.sink.name}`);
633
+ parts.push(`**Exploitable:** ${taintFlow.isExploitable ? 'Yes' : 'No'}`);
634
+ if (taintFlow.sanitizers.length > 0) {
635
+ parts.push(`**Sanitizers Applied:** ${taintFlow.sanitizers.map(s => s.name).join(', ')}`);
636
+ }
637
+ }
638
+
639
+ parts.push('');
640
+ parts.push('### Impact Assessment');
641
+ if (rule.impact) {
642
+ parts.push(`**Confidentiality:** ${rule.impact.confidentiality}`);
643
+ parts.push(`**Integrity:** ${rule.impact.integrity}`);
644
+ parts.push(`**Availability:** ${rule.impact.availability}`);
645
+ parts.push(`**Technical Impact:** ${rule.impact.technicalImpact}`);
646
+ parts.push(`**Business Impact:** ${rule.impact.businessImpact}`);
647
+ }
648
+
649
+ parts.push('');
650
+ parts.push('### Score Breakdown');
651
+ parts.push('```');
652
+ parts.push(score.explanation);
653
+ parts.push('```');
654
+
655
+ return parts.join('\n');
656
+ }
657
+
658
+ /**
659
+ * Generate developer-friendly explanation
660
+ */
661
+ private generateDeveloperExplanation(
662
+ rule: VulnerabilityRule,
663
+ matches: PatternMatch[]
664
+ ): string {
665
+ const parts: string[] = [];
666
+
667
+ parts.push(`**What's the problem?**`);
668
+ parts.push(rule.description);
669
+ parts.push('');
670
+
671
+ parts.push(`**Why is this dangerous?**`);
672
+ if (rule.impact) {
673
+ parts.push(rule.impact.technicalImpact);
674
+ }
675
+ parts.push('');
676
+
677
+ parts.push(`**How to fix it:**`);
678
+ parts.push(rule.remediation.summary);
679
+ if (rule.remediation.steps?.length) {
680
+ rule.remediation.steps.forEach((step, i) => {
681
+ parts.push(`${i + 1}. ${step}`);
682
+ });
683
+ }
684
+
685
+ if (rule.remediation.secureCodeExample) {
686
+ parts.push('');
687
+ parts.push('**Secure code example:**');
688
+ parts.push('```');
689
+ parts.push(rule.remediation.secureCodeExample);
690
+ parts.push('```');
691
+ }
692
+
693
+ return parts.join('\n');
694
+ }
695
+
696
+ /**
697
+ * Get rules applicable to a language
698
+ */
699
+ private getApplicableRules(language: SupportedLanguage): VulnerabilityRule[] {
700
+ return Array.from(this.rules.values()).filter(rule =>
701
+ rule.enabled && rule.languages.includes(language)
702
+ );
703
+ }
704
+
705
+ /**
706
+ * Get all registered rules
707
+ */
708
+ getRules(): VulnerabilityRule[] {
709
+ return Array.from(this.rules.values());
710
+ }
711
+
712
+ /**
713
+ * Get rule by ID
714
+ */
715
+ getRule(id: string): VulnerabilityRule | undefined {
716
+ return this.rules.get(id);
717
+ }
718
+
719
+ /**
720
+ * Enable/disable a rule
721
+ */
722
+ setRuleEnabled(id: string, enabled: boolean): void {
723
+ const rule = this.rules.get(id);
724
+ if (rule) {
725
+ rule.enabled = enabled;
726
+ }
727
+ }
728
+
729
+ /**
730
+ * Add a custom rule
731
+ */
732
+ addRule(rule: VulnerabilityRule): void {
733
+ this.rules.set(rule.id, rule);
734
+ }
735
+
736
+ /**
737
+ * Group matches by location
738
+ */
739
+ private groupMatchesByLocation(
740
+ matches: PatternMatch[]
741
+ ): Map<string, PatternMatch[]> {
742
+ const groups = new Map<string, PatternMatch[]>();
743
+
744
+ for (const match of matches) {
745
+ const key = `${match.location.startLine}:${match.location.startColumn}`;
746
+ const existing = groups.get(key) || [];
747
+ existing.push(match);
748
+ groups.set(key, existing);
749
+ }
750
+
751
+ return groups;
752
+ }
753
+
754
+ /**
755
+ * Check if two locations overlap
756
+ */
757
+ private locationsOverlap(a: SourceLocation, b: SourceLocation): boolean {
758
+ return a.startLine <= b.endLine && b.startLine <= a.endLine;
759
+ }
760
+
761
+ /**
762
+ * Check if confidence meets minimum
763
+ */
764
+ private meetsMinConfidence(
765
+ confidence: ConfidenceLevel,
766
+ minConfidence: ConfidenceLevel
767
+ ): boolean {
768
+ const levels = [
769
+ ConfidenceLevel.TENTATIVE,
770
+ ConfidenceLevel.LOW,
771
+ ConfidenceLevel.MEDIUM,
772
+ ConfidenceLevel.HIGH,
773
+ ConfidenceLevel.CONFIRMED
774
+ ];
775
+ return levels.indexOf(confidence) >= levels.indexOf(minConfidence);
776
+ }
777
+
778
+ /**
779
+ * Deduplicate findings
780
+ */
781
+ private deduplicateFindings(
782
+ findings: VulnerabilityFinding[]
783
+ ): VulnerabilityFinding[] {
784
+ const seen = new Set<string>();
785
+ return findings.filter(finding => {
786
+ const key = `${finding.ruleId}:${finding.location.filePath}:${finding.location.startLine}`;
787
+ if (seen.has(key)) {
788
+ return false;
789
+ }
790
+ seen.add(key);
791
+ return true;
792
+ });
793
+ }
794
+ }
795
+
796
+ // ============================================================================
797
+ // FACTORY FUNCTIONS
798
+ // ============================================================================
799
+
800
+ /**
801
+ * Create default vulnerability engine
802
+ */
803
+ export function createDefaultEngine(
804
+ rules: VulnerabilityRule[],
805
+ options?: Partial<EngineOptions>
806
+ ): VulnerabilityRuleEngine {
807
+ return new VulnerabilityRuleEngine(rules, options);
808
+ }
809
+
810
+ /**
811
+ * Quick scan function for simple usage
812
+ */
813
+ export async function quickScan(
814
+ code: string,
815
+ filePath: string,
816
+ language: SupportedLanguage,
817
+ rules: VulnerabilityRule[],
818
+ options?: Partial<EngineOptions>
819
+ ): Promise<VulnerabilityFinding[]> {
820
+ const engine = createDefaultEngine(rules, options);
821
+
822
+ const context: AnalysisContext = {
823
+ filePath,
824
+ content: code,
825
+ language,
826
+ isTestFile: isTestFile(filePath),
827
+ isVendorCode: isVendorCode(filePath)
828
+ };
829
+
830
+ return engine.analyze(context);
831
+ }