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,714 @@
1
+ /**
2
+ * AI Analyzer Module
3
+ * Uses AI/ML for advanced threat detection and analysis
4
+ */
5
+
6
+ import { AIConfig, Finding, ScannedFile, Severity, ThreatType, FindingCategory } from '../types';
7
+ import { logger } from '../utils/logger';
8
+ import { generateId } from '../utils';
9
+ import { getStandardsForThreat } from '../rules/standards';
10
+
11
+ /**
12
+ * AI Analysis Result
13
+ */
14
+ interface AIAnalysisResult {
15
+ findings: Finding[];
16
+ explanation?: string;
17
+ suggestedFixes?: string[];
18
+ riskAssessment?: string;
19
+ }
20
+
21
+ /**
22
+ * Detected AI Provider
23
+ */
24
+ type DetectedProvider = 'openai' | 'anthropic' | 'google' | 'local';
25
+
26
+ /**
27
+ * AI Analyzer Class
28
+ * Provides AI-powered security analysis
29
+ */
30
+ export class AIAnalyzer {
31
+ private config: AIConfig;
32
+ private initialized: boolean = false;
33
+ private detectedProvider: DetectedProvider = 'openai';
34
+
35
+ constructor(config: AIConfig) {
36
+ this.config = config;
37
+ // Auto-detect provider from API key if set to 'auto' or not specified correctly
38
+ this.detectedProvider = this.detectProvider();
39
+ }
40
+
41
+ /**
42
+ * Auto-detect AI provider from API key format
43
+ */
44
+ private detectProvider(): DetectedProvider {
45
+ const apiKey = this.config.apiKey || '';
46
+ const provider = this.config.provider;
47
+
48
+ // If explicitly set to local, use local
49
+ if (provider === 'local') {
50
+ return 'local';
51
+ }
52
+
53
+ // Auto-detect from API key format
54
+ if (apiKey.startsWith('sk-ant-') || apiKey.startsWith('sk-ant')) {
55
+ logger.debug('🔍 Detected Anthropic API key');
56
+ return 'anthropic';
57
+ }
58
+
59
+ if (apiKey.startsWith('AIzaSy') || apiKey.startsWith('AIza')) {
60
+ logger.debug('🔍 Detected Google AI API key');
61
+ return 'google';
62
+ }
63
+
64
+ if (apiKey.startsWith('sk-') || apiKey.startsWith('sk-proj-')) {
65
+ logger.debug('🔍 Detected OpenAI API key');
66
+ return 'openai';
67
+ }
68
+
69
+ // Fallback to configured provider or openai
70
+ if (provider === 'google' || provider === 'gemini') {
71
+ return 'google';
72
+ }
73
+ if (provider === 'anthropic') {
74
+ return 'anthropic';
75
+ }
76
+ if (provider === 'openai') {
77
+ return 'openai';
78
+ }
79
+
80
+ // Default to openai if we can't detect
81
+ return 'openai';
82
+ }
83
+
84
+ /**
85
+ * Initialize AI analyzer
86
+ */
87
+ async initialize(): Promise<void> {
88
+ if (!this.config.apiKey && this.detectedProvider !== 'local') {
89
+ logger.warn('⚠️ AI API key not provided. AI analysis will be limited.');
90
+ return;
91
+ }
92
+
93
+ const providerName = this.detectedProvider === 'google' ? 'Google AI (Gemini)' :
94
+ this.detectedProvider === 'anthropic' ? 'Anthropic (Claude)' :
95
+ this.detectedProvider === 'openai' ? 'OpenAI (GPT)' : 'Local';
96
+
97
+ logger.info(`🤖 Initializing AI analyzer with ${providerName}...`);
98
+ this.initialized = true;
99
+ }
100
+
101
+ /**
102
+ * Analyze code with AI
103
+ */
104
+ async analyze(file: ScannedFile): Promise<AIAnalysisResult> {
105
+ if (!this.initialized) {
106
+ return { findings: [] };
107
+ }
108
+
109
+ try {
110
+ switch (this.detectedProvider) {
111
+ case 'openai':
112
+ return await this.analyzeWithOpenAI(file);
113
+ case 'anthropic':
114
+ return await this.analyzeWithAnthropic(file);
115
+ case 'google':
116
+ return await this.analyzeWithGoogle(file);
117
+ case 'local':
118
+ return await this.analyzeWithLocal(file);
119
+ default:
120
+ return { findings: [] };
121
+ }
122
+ } catch (error) {
123
+ logger.debug(`AI analysis error: ${error}`);
124
+ return { findings: [] };
125
+ }
126
+ }
127
+
128
+ /**
129
+ * Get the best model for the provider
130
+ */
131
+ private getModel(): string {
132
+ if (this.config.model) {
133
+ return this.config.model;
134
+ }
135
+
136
+ // Default models per provider
137
+ switch (this.detectedProvider) {
138
+ case 'openai':
139
+ return 'gpt-4o'; // Latest and most capable
140
+ case 'anthropic':
141
+ return 'claude-3-sonnet-20240229';
142
+ case 'google':
143
+ return 'gemini-pro'; // Stable model for v1beta API
144
+ default:
145
+ return 'gpt-4';
146
+ }
147
+ }
148
+
149
+ /**
150
+ * Analyze with OpenAI (supports all GPT models)
151
+ */
152
+ private async analyzeWithOpenAI(file: ScannedFile): Promise<AIAnalysisResult> {
153
+ // Dynamic import to avoid issues if package not installed
154
+ const OpenAI = (await import('openai')).default;
155
+
156
+ const client = new OpenAI({
157
+ apiKey: this.config.apiKey
158
+ });
159
+
160
+ const prompt = this.buildAnalysisPrompt(file);
161
+ const model = this.getModel();
162
+
163
+ logger.debug(`Using OpenAI model: ${model}`);
164
+
165
+ try {
166
+ const response = await client.chat.completions.create({
167
+ model: model,
168
+ messages: [
169
+ {
170
+ role: 'system',
171
+ content: this.getSystemPrompt()
172
+ },
173
+ {
174
+ role: 'user',
175
+ content: prompt
176
+ }
177
+ ],
178
+ max_tokens: this.config.maxTokens || 2000,
179
+ temperature: this.config.temperature || 0.1
180
+ });
181
+
182
+ const content = response.choices[0]?.message?.content;
183
+ if (!content) {
184
+ return { findings: [] };
185
+ }
186
+
187
+ return this.parseAIResponse(content, file);
188
+ } catch (error: any) {
189
+ if (error?.status === 429) {
190
+ logger.warn('⚠️ OpenAI: Cuota excedida. Verifica tu plan en https://platform.openai.com/account/billing');
191
+ } else if (error?.status === 401) {
192
+ logger.warn('⚠️ OpenAI: API key inválida');
193
+ } else {
194
+ logger.debug(`OpenAI error: ${error.message || error}`);
195
+ }
196
+ return { findings: [] };
197
+ }
198
+ }
199
+
200
+ /**
201
+ * Analyze with Anthropic Claude
202
+ */
203
+ private async analyzeWithAnthropic(file: ScannedFile): Promise<AIAnalysisResult> {
204
+ try {
205
+ const Anthropic = (await import('@anthropic-ai/sdk')).default;
206
+
207
+ const client = new Anthropic({
208
+ apiKey: this.config.apiKey
209
+ });
210
+
211
+ const prompt = this.buildAnalysisPrompt(file);
212
+ const model = this.getModel();
213
+
214
+ logger.debug(`Using Anthropic model: ${model}`);
215
+
216
+ const response = await client.messages.create({
217
+ model: model,
218
+ max_tokens: this.config.maxTokens || 2000,
219
+ system: this.getSystemPrompt(),
220
+ messages: [
221
+ {
222
+ role: 'user',
223
+ content: prompt
224
+ }
225
+ ]
226
+ });
227
+
228
+ const content = response.content[0];
229
+ if (!content || content.type !== 'text') {
230
+ return { findings: [] };
231
+ }
232
+
233
+ return this.parseAIResponse(content.text, file);
234
+ } catch (error) {
235
+ logger.debug(`Anthropic analysis error: ${error}`);
236
+ return { findings: [] };
237
+ }
238
+ }
239
+
240
+ /**
241
+ * Analyze with Google AI (Gemini)
242
+ */
243
+ private async analyzeWithGoogle(file: ScannedFile): Promise<AIAnalysisResult> {
244
+ try {
245
+ const prompt = this.buildAnalysisPrompt(file);
246
+ const model = this.getModel();
247
+
248
+ logger.debug(`Using Google AI model: ${model}`);
249
+
250
+ // Use Google AI REST API directly
251
+ const apiKey = this.config.apiKey;
252
+
253
+ // Try v1 API first, fallback to v1beta
254
+ const apis = [
255
+ `https://generativelanguage.googleapis.com/v1/models/${model}:generateContent?key=${apiKey}`,
256
+ `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${apiKey}`
257
+ ];
258
+
259
+ let lastError: any = null;
260
+
261
+ for (const url of apis) {
262
+ try {
263
+ const response = await fetch(url, {
264
+ method: 'POST',
265
+ headers: {
266
+ 'Content-Type': 'application/json'
267
+ },
268
+ body: JSON.stringify({
269
+ contents: [
270
+ {
271
+ parts: [
272
+ {
273
+ text: `${this.getSystemPrompt()}\n\n${prompt}`
274
+ }
275
+ ]
276
+ }
277
+ ],
278
+ generationConfig: {
279
+ temperature: this.config.temperature || 0.1,
280
+ maxOutputTokens: this.config.maxTokens || 2000
281
+ }
282
+ })
283
+ });
284
+
285
+ const data = await response.json() as any;
286
+
287
+ if (!response.ok) {
288
+ lastError = data.error;
289
+ continue; // Try next API version
290
+ }
291
+
292
+ const content = data.candidates?.[0]?.content?.parts?.[0]?.text;
293
+
294
+ if (!content) {
295
+ return { findings: [] };
296
+ }
297
+
298
+ return this.parseAIResponse(content, file);
299
+ } catch (e) {
300
+ lastError = e;
301
+ continue;
302
+ }
303
+ }
304
+
305
+ // If all APIs failed, show helpful message
306
+ if (lastError) {
307
+ if (lastError.code === 404) {
308
+ logger.warn(`⚠️ Google AI: Modelo "${model}" no disponible. Intenta con: gemini-pro`);
309
+ } else if (lastError.code === 403) {
310
+ logger.warn('⚠️ Google AI: API key sin permisos. Habilita la API en Google Cloud Console.');
311
+ } else if (lastError.code === 429) {
312
+ logger.warn('⚠️ Google AI: Cuota excedida. Espera un momento o verifica tu plan.');
313
+ } else {
314
+ logger.debug(`Google AI error: ${JSON.stringify(lastError)}`);
315
+ }
316
+ }
317
+
318
+ return { findings: [] };
319
+ } catch (error) {
320
+ logger.debug(`Google AI analysis error: ${error}`);
321
+ return { findings: [] };
322
+ }
323
+ }
324
+
325
+ // Cache for local AI results
326
+ private analysisCache: Map<string, AIAnalysisResult> = new Map();
327
+
328
+ /**
329
+ * Analyze with local model (Ollama compatible) - Optimized for performance
330
+ */
331
+ private async analyzeWithLocal(file: ScannedFile): Promise<AIAnalysisResult> {
332
+ if (!this.config.endpoint) {
333
+ logger.warn('Local AI endpoint not configured');
334
+ return { findings: [] };
335
+ }
336
+
337
+ // Check cache first
338
+ const perf = this.config.performance || {};
339
+ if (perf.enableCache) {
340
+ const cacheKey = `${file.hash}-${this.config.model}`;
341
+ const cached = this.analysisCache.get(cacheKey);
342
+ if (cached) {
343
+ logger.debug(`⚡ Cache hit for ${file.relativePath}`);
344
+ return cached;
345
+ }
346
+ }
347
+
348
+ const prompt = this.buildAnalysisPrompt(file);
349
+ const model = this.config.model || 'codellama:7b-instruct';
350
+
351
+ try {
352
+ logger.debug(`🤖 Usando modelo local: ${model}`);
353
+
354
+ // Build Ollama options with performance tuning
355
+ const ollamaOptions: Record<string, any> = {
356
+ num_predict: this.config.maxTokens || 2000,
357
+ temperature: this.config.temperature || 0.1,
358
+ };
359
+
360
+ // Apply performance settings
361
+ if (perf.numGpuLayers !== undefined) {
362
+ ollamaOptions.num_gpu = perf.numGpuLayers;
363
+ }
364
+ if (perf.numThreads !== undefined) {
365
+ ollamaOptions.num_thread = perf.numThreads;
366
+ }
367
+ if (perf.contextSize !== undefined) {
368
+ ollamaOptions.num_ctx = perf.contextSize;
369
+ }
370
+ if (perf.batchSize !== undefined) {
371
+ ollamaOptions.num_batch = perf.batchSize;
372
+ }
373
+ if (perf.useMmap !== undefined) {
374
+ ollamaOptions.use_mmap = perf.useMmap;
375
+ }
376
+ if (perf.useMlock !== undefined) {
377
+ ollamaOptions.use_mlock = perf.useMlock;
378
+ }
379
+
380
+ // Use AbortController for timeout
381
+ const controller = new AbortController();
382
+ const timeout = perf.timeout || 120000; // 2 minutes default
383
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
384
+
385
+ const response = await fetch(this.config.endpoint, {
386
+ method: 'POST',
387
+ headers: {
388
+ 'Content-Type': 'application/json'
389
+ },
390
+ body: JSON.stringify({
391
+ model: model,
392
+ prompt: `${this.getSystemPrompt()}\n\n${prompt}`,
393
+ stream: false,
394
+ options: ollamaOptions
395
+ }),
396
+ signal: controller.signal
397
+ });
398
+
399
+ clearTimeout(timeoutId);
400
+
401
+ if (!response.ok) {
402
+ const errorText = await response.text();
403
+ logger.warn(`⚠️ Error del modelo local (${response.status}): ${errorText}`);
404
+ return { findings: [] };
405
+ }
406
+
407
+ const data = await response.json() as { response?: string; content?: string; message?: { content?: string } };
408
+ const content = data.response || data.content || data.message?.content || '';
409
+
410
+ if (!content) {
411
+ logger.debug('El modelo local no devolvió respuesta');
412
+ return { findings: [] };
413
+ }
414
+
415
+ const result = this.parseAIResponse(content, file);
416
+
417
+ // Store in cache
418
+ if (perf.enableCache) {
419
+ const cacheKey = `${file.hash}-${this.config.model}`;
420
+ this.analysisCache.set(cacheKey, result);
421
+ }
422
+
423
+ return result;
424
+ } catch (error: any) {
425
+ if (error.name === 'AbortError') {
426
+ logger.warn(`⚠️ Timeout analizando ${file.relativePath}`);
427
+ } else if (error.code === 'ECONNREFUSED') {
428
+ logger.warn('⚠️ No se puede conectar al servidor local. ¿Está Ollama ejecutándose?');
429
+ logger.info('💡 Inicia Ollama con: ollama serve');
430
+ } else {
431
+ logger.debug(`Local AI error: ${error.message || error}`);
432
+ }
433
+ return { findings: [] };
434
+ }
435
+ }
436
+
437
+ /**
438
+ * Analyze multiple files in parallel (for local models)
439
+ */
440
+ async analyzeParallel(files: ScannedFile[]): Promise<Map<string, AIAnalysisResult>> {
441
+ const results = new Map<string, AIAnalysisResult>();
442
+ const parallelRequests = this.config.performance?.parallelRequests || 1;
443
+
444
+ // Process in batches
445
+ for (let i = 0; i < files.length; i += parallelRequests) {
446
+ const batch = files.slice(i, i + parallelRequests);
447
+ const batchPromises = batch.map(async (file) => {
448
+ const result = await this.analyze(file);
449
+ return { path: file.relativePath, result };
450
+ });
451
+
452
+ const batchResults = await Promise.all(batchPromises);
453
+ for (const { path, result } of batchResults) {
454
+ results.set(path, result);
455
+ }
456
+ }
457
+
458
+ return results;
459
+ }
460
+
461
+ /**
462
+ * Clear the analysis cache
463
+ */
464
+ clearCache(): void {
465
+ this.analysisCache.clear();
466
+ logger.debug('🗑️ AI analysis cache cleared');
467
+ }
468
+
469
+ /**
470
+ * Get system prompt for AI
471
+ */
472
+ private getSystemPrompt(): string {
473
+ return `You are an expert security analyst specializing in static code analysis (SAST).
474
+ Your task is to analyze code for:
475
+ 1. Security vulnerabilities (SQL injection, XSS, command injection, etc.)
476
+ 2. Malicious code patterns (backdoors, keyloggers, data exfiltration)
477
+ 3. Insecure configurations
478
+ 4. Hardcoded credentials
479
+
480
+ For each finding, provide:
481
+ - Title: Brief description
482
+ - Severity: critical, high, medium, low, or info
483
+ - Type: vulnerability type (sql_injection, xss, backdoor, etc.)
484
+ - Line: approximate line number
485
+ - Description: detailed explanation
486
+ - Remediation: how to fix
487
+
488
+ Respond in JSON format:
489
+ {
490
+ "findings": [
491
+ {
492
+ "title": "...",
493
+ "severity": "...",
494
+ "type": "...",
495
+ "line": 123,
496
+ "description": "...",
497
+ "remediation": "..."
498
+ }
499
+ ],
500
+ "riskAssessment": "Overall risk assessment",
501
+ "explanation": "Summary of analysis"
502
+ }
503
+
504
+ Be precise and avoid false positives. Focus on real security issues.`;
505
+ }
506
+
507
+ /**
508
+ * Build analysis prompt
509
+ */
510
+ private buildAnalysisPrompt(file: ScannedFile): string {
511
+ // Truncate large files
512
+ const maxLength = 8000;
513
+ const content = file.content.length > maxLength
514
+ ? file.content.substring(0, maxLength) + '\n... (truncated)'
515
+ : file.content;
516
+
517
+ return `Analyze this ${file.language || 'unknown'} code file for security issues:
518
+
519
+ File: ${file.relativePath}
520
+ Language: ${file.language || 'unknown'}
521
+
522
+ \`\`\`
523
+ ${content}
524
+ \`\`\`
525
+
526
+ Identify all security vulnerabilities and malicious code patterns.`;
527
+ }
528
+
529
+ /**
530
+ * Parse AI response into findings
531
+ */
532
+ private parseAIResponse(response: string, file: ScannedFile): AIAnalysisResult {
533
+ try {
534
+ // Extract JSON from response
535
+ const jsonMatch = response.match(/\{[\s\S]*\}/);
536
+ if (!jsonMatch) {
537
+ return { findings: [] };
538
+ }
539
+
540
+ const parsed = JSON.parse(jsonMatch[0]);
541
+ const findings: Finding[] = [];
542
+
543
+ for (const item of parsed.findings || []) {
544
+ const finding = this.convertToFinding(item, file);
545
+ if (finding) {
546
+ findings.push(finding);
547
+ }
548
+ }
549
+
550
+ return {
551
+ findings,
552
+ explanation: parsed.explanation,
553
+ riskAssessment: parsed.riskAssessment
554
+ };
555
+ } catch (error) {
556
+ logger.debug(`Failed to parse AI response: ${error}`);
557
+ return { findings: [] };
558
+ }
559
+ }
560
+
561
+ /**
562
+ * Convert AI finding to Finding type
563
+ */
564
+ private convertToFinding(item: any, file: ScannedFile): Finding | null {
565
+ if (!item.title || !item.severity) {
566
+ return null;
567
+ }
568
+
569
+ const severity = this.parseSeverity(item.severity);
570
+ const threatType = this.parseThreatType(item.type);
571
+ const lineNum = parseInt(item.line) || 1;
572
+
573
+ // Extract code context
574
+ const lines = file.content.split('\n');
575
+ const code = lines[lineNum - 1] || '';
576
+ const contextBefore = lines.slice(Math.max(0, lineNum - 3), lineNum - 1).join('\n');
577
+ const contextAfter = lines.slice(lineNum, Math.min(lines.length, lineNum + 2)).join('\n');
578
+
579
+ return {
580
+ id: generateId(),
581
+ title: item.title,
582
+ description: item.description || item.title,
583
+ severity,
584
+ threatType,
585
+ category: this.ismalwareType(threatType) ? FindingCategory.MALWARE : FindingCategory.VULNERABILITY,
586
+ location: {
587
+ file: file.relativePath,
588
+ startLine: lineNum,
589
+ endLine: lineNum
590
+ },
591
+ snippet: {
592
+ code,
593
+ contextBefore,
594
+ contextAfter
595
+ },
596
+ standards: getStandardsForThreat(threatType),
597
+ remediation: item.remediation || 'Review and fix the identified issue.',
598
+ confidence: 70,
599
+ analyzer: 'AI Analyzer',
600
+ timestamp: new Date(),
601
+ tags: ['ai-detected'],
602
+ aiExplanation: item.description,
603
+ suggestedFix: item.remediation
604
+ };
605
+ }
606
+
607
+ /**
608
+ * Parse severity string
609
+ */
610
+ private parseSeverity(severity: string): Severity {
611
+ const lower = severity.toLowerCase();
612
+ if (lower.includes('critical')) return Severity.CRITICAL;
613
+ if (lower.includes('high')) return Severity.HIGH;
614
+ if (lower.includes('medium')) return Severity.MEDIUM;
615
+ if (lower.includes('low')) return Severity.LOW;
616
+ return Severity.INFO;
617
+ }
618
+
619
+ /**
620
+ * Parse threat type string
621
+ */
622
+ private parseThreatType(type: string): ThreatType {
623
+ const lower = (type || '').toLowerCase().replace(/[_-]/g, '');
624
+
625
+ const typeMap: Record<string, ThreatType> = {
626
+ 'sqlinjection': ThreatType.SQL_INJECTION,
627
+ 'sqli': ThreatType.SQL_INJECTION,
628
+ 'commandinjection': ThreatType.COMMAND_INJECTION,
629
+ 'cmdi': ThreatType.COMMAND_INJECTION,
630
+ 'xss': ThreatType.XSS,
631
+ 'crosssitescripting': ThreatType.XSS,
632
+ 'csrf': ThreatType.CSRF,
633
+ 'deserialization': ThreatType.INSECURE_DESERIALIZATION,
634
+ 'hardcodedcredentials': ThreatType.HARDCODED_CREDENTIALS,
635
+ 'credentials': ThreatType.HARDCODED_CREDENTIALS,
636
+ 'pathtraversal': ThreatType.PATH_TRAVERSAL,
637
+ 'lfi': ThreatType.PATH_TRAVERSAL,
638
+ 'backdoor': ThreatType.BACKDOOR,
639
+ 'keylogger': ThreatType.KEYLOGGER,
640
+ 'cryptominer': ThreatType.CRYPTOMINER,
641
+ 'obfuscation': ThreatType.OBFUSCATED_CODE,
642
+ 'exfiltration': ThreatType.DATA_EXFILTRATION
643
+ };
644
+
645
+ return typeMap[lower] || ThreatType.DANGEROUS_FUNCTION;
646
+ }
647
+
648
+ /**
649
+ * Check if threat type is malware
650
+ */
651
+ private ismalwareType(type: ThreatType): boolean {
652
+ const malwareTypes = [
653
+ ThreatType.BACKDOOR,
654
+ ThreatType.KEYLOGGER,
655
+ ThreatType.CRYPTOMINER,
656
+ ThreatType.OBFUSCATED_CODE,
657
+ ThreatType.EMBEDDED_PAYLOAD,
658
+ ThreatType.REVERSE_SHELL,
659
+ ThreatType.DATA_EXFILTRATION,
660
+ ThreatType.MALICIOUS_LOADER
661
+ ];
662
+ return malwareTypes.includes(type);
663
+ }
664
+
665
+ /**
666
+ * Enhance finding with AI explanation
667
+ */
668
+ async enhanceFinding(finding: Finding): Promise<Finding> {
669
+ if (!this.initialized || !this.config.apiKey) {
670
+ return finding;
671
+ }
672
+
673
+ try {
674
+ const OpenAI = (await import('openai')).default;
675
+ const client = new OpenAI({ apiKey: this.config.apiKey });
676
+
677
+ const response = await client.chat.completions.create({
678
+ model: this.config.model || 'gpt-4',
679
+ messages: [
680
+ {
681
+ role: 'system',
682
+ content: 'You are a security expert. Provide a clear, technical explanation of the security issue and a specific code fix.'
683
+ },
684
+ {
685
+ role: 'user',
686
+ content: `Explain this security finding and provide a fix:
687
+
688
+ Title: ${finding.title}
689
+ Type: ${finding.threatType}
690
+ Code:
691
+ \`\`\`
692
+ ${finding.snippet.code}
693
+ \`\`\`
694
+
695
+ Provide a 2-3 sentence explanation and a corrected code example.`
696
+ }
697
+ ],
698
+ max_tokens: 500,
699
+ temperature: 0.2
700
+ });
701
+
702
+ const content = response.choices[0]?.message?.content;
703
+ if (content) {
704
+ finding.aiExplanation = content;
705
+ }
706
+ } catch (error) {
707
+ logger.debug(`Failed to enhance finding: ${error}`);
708
+ }
709
+
710
+ return finding;
711
+ }
712
+ }
713
+
714
+ export default AIAnalyzer;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * AI Module Exports
3
+ */
4
+
5
+ export * from './aiAnalyzer';