codeslick-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (455) hide show
  1. package/README.md +458 -0
  2. package/__tests__/cli-reporter.test.ts +86 -0
  3. package/__tests__/config-loader.test.ts +247 -0
  4. package/__tests__/local-scanner.test.ts +245 -0
  5. package/bin/codeslick.cjs +153 -0
  6. package/dist/packages/cli/src/commands/auth.d.ts +36 -0
  7. package/dist/packages/cli/src/commands/auth.d.ts.map +1 -0
  8. package/dist/packages/cli/src/commands/auth.js +226 -0
  9. package/dist/packages/cli/src/commands/auth.js.map +1 -0
  10. package/dist/packages/cli/src/commands/config.d.ts +37 -0
  11. package/dist/packages/cli/src/commands/config.d.ts.map +1 -0
  12. package/dist/packages/cli/src/commands/config.js +196 -0
  13. package/dist/packages/cli/src/commands/config.js.map +1 -0
  14. package/dist/packages/cli/src/commands/init.d.ts +32 -0
  15. package/dist/packages/cli/src/commands/init.d.ts.map +1 -0
  16. package/dist/packages/cli/src/commands/init.js +171 -0
  17. package/dist/packages/cli/src/commands/init.js.map +1 -0
  18. package/dist/packages/cli/src/commands/scan.d.ts +40 -0
  19. package/dist/packages/cli/src/commands/scan.d.ts.map +1 -0
  20. package/dist/packages/cli/src/commands/scan.js +204 -0
  21. package/dist/packages/cli/src/commands/scan.js.map +1 -0
  22. package/dist/packages/cli/src/config/config-loader.d.ts +67 -0
  23. package/dist/packages/cli/src/config/config-loader.d.ts.map +1 -0
  24. package/dist/packages/cli/src/config/config-loader.js +146 -0
  25. package/dist/packages/cli/src/config/config-loader.js.map +1 -0
  26. package/dist/packages/cli/src/reporters/cli-reporter.d.ts +69 -0
  27. package/dist/packages/cli/src/reporters/cli-reporter.d.ts.map +1 -0
  28. package/dist/packages/cli/src/reporters/cli-reporter.js +244 -0
  29. package/dist/packages/cli/src/reporters/cli-reporter.js.map +1 -0
  30. package/dist/packages/cli/src/scanner/local-scanner.d.ts +92 -0
  31. package/dist/packages/cli/src/scanner/local-scanner.d.ts.map +1 -0
  32. package/dist/packages/cli/src/scanner/local-scanner.js +221 -0
  33. package/dist/packages/cli/src/scanner/local-scanner.js.map +1 -0
  34. package/dist/src/lib/analyzers/helpers/ai-code-detection-utils.d.ts +88 -0
  35. package/dist/src/lib/analyzers/helpers/ai-code-detection-utils.d.ts.map +1 -0
  36. package/dist/src/lib/analyzers/helpers/ai-code-detection-utils.js +371 -0
  37. package/dist/src/lib/analyzers/helpers/ai-code-detection-utils.js.map +1 -0
  38. package/dist/src/lib/analyzers/helpers/jsx-helpers.d.ts +63 -0
  39. package/dist/src/lib/analyzers/helpers/jsx-helpers.d.ts.map +1 -0
  40. package/dist/src/lib/analyzers/helpers/jsx-helpers.js +95 -0
  41. package/dist/src/lib/analyzers/helpers/jsx-helpers.js.map +1 -0
  42. package/dist/src/lib/analyzers/helpers/variable-tracker.d.ts +59 -0
  43. package/dist/src/lib/analyzers/helpers/variable-tracker.d.ts.map +1 -0
  44. package/dist/src/lib/analyzers/helpers/variable-tracker.js +231 -0
  45. package/dist/src/lib/analyzers/helpers/variable-tracker.js.map +1 -0
  46. package/dist/src/lib/analyzers/java/security-checks/access-control.d.ts +20 -0
  47. package/dist/src/lib/analyzers/java/security-checks/access-control.d.ts.map +1 -0
  48. package/dist/src/lib/analyzers/java/security-checks/access-control.js +129 -0
  49. package/dist/src/lib/analyzers/java/security-checks/access-control.js.map +1 -0
  50. package/dist/src/lib/analyzers/java/security-checks/ai-generated-code.d.ts +25 -0
  51. package/dist/src/lib/analyzers/java/security-checks/ai-generated-code.d.ts.map +1 -0
  52. package/dist/src/lib/analyzers/java/security-checks/ai-generated-code.js +221 -0
  53. package/dist/src/lib/analyzers/java/security-checks/ai-generated-code.js.map +1 -0
  54. package/dist/src/lib/analyzers/java/security-checks/code-quality.d.ts +18 -0
  55. package/dist/src/lib/analyzers/java/security-checks/code-quality.d.ts.map +1 -0
  56. package/dist/src/lib/analyzers/java/security-checks/code-quality.js +84 -0
  57. package/dist/src/lib/analyzers/java/security-checks/code-quality.js.map +1 -0
  58. package/dist/src/lib/analyzers/java/security-checks/crypto-validation.d.ts +18 -0
  59. package/dist/src/lib/analyzers/java/security-checks/crypto-validation.d.ts.map +1 -0
  60. package/dist/src/lib/analyzers/java/security-checks/crypto-validation.js +161 -0
  61. package/dist/src/lib/analyzers/java/security-checks/crypto-validation.js.map +1 -0
  62. package/dist/src/lib/analyzers/java/security-checks/deserialization-xxe.d.ts +20 -0
  63. package/dist/src/lib/analyzers/java/security-checks/deserialization-xxe.d.ts.map +1 -0
  64. package/dist/src/lib/analyzers/java/security-checks/deserialization-xxe.js +163 -0
  65. package/dist/src/lib/analyzers/java/security-checks/deserialization-xxe.js.map +1 -0
  66. package/dist/src/lib/analyzers/java/security-checks/enhanced-supply-chain.d.ts +24 -0
  67. package/dist/src/lib/analyzers/java/security-checks/enhanced-supply-chain.d.ts.map +1 -0
  68. package/dist/src/lib/analyzers/java/security-checks/enhanced-supply-chain.js +178 -0
  69. package/dist/src/lib/analyzers/java/security-checks/enhanced-supply-chain.js.map +1 -0
  70. package/dist/src/lib/analyzers/java/security-checks/exception-handling.d.ts +25 -0
  71. package/dist/src/lib/analyzers/java/security-checks/exception-handling.d.ts.map +1 -0
  72. package/dist/src/lib/analyzers/java/security-checks/exception-handling.js +179 -0
  73. package/dist/src/lib/analyzers/java/security-checks/exception-handling.js.map +1 -0
  74. package/dist/src/lib/analyzers/java/security-checks/file-operations.d.ts +17 -0
  75. package/dist/src/lib/analyzers/java/security-checks/file-operations.d.ts.map +1 -0
  76. package/dist/src/lib/analyzers/java/security-checks/file-operations.js +67 -0
  77. package/dist/src/lib/analyzers/java/security-checks/file-operations.js.map +1 -0
  78. package/dist/src/lib/analyzers/java/security-checks/framework-security.d.ts +25 -0
  79. package/dist/src/lib/analyzers/java/security-checks/framework-security.d.ts.map +1 -0
  80. package/dist/src/lib/analyzers/java/security-checks/framework-security.js +396 -0
  81. package/dist/src/lib/analyzers/java/security-checks/framework-security.js.map +1 -0
  82. package/dist/src/lib/analyzers/java/security-checks/hardcoded-credentials.d.ts +20 -0
  83. package/dist/src/lib/analyzers/java/security-checks/hardcoded-credentials.d.ts.map +1 -0
  84. package/dist/src/lib/analyzers/java/security-checks/hardcoded-credentials.js +123 -0
  85. package/dist/src/lib/analyzers/java/security-checks/hardcoded-credentials.js.map +1 -0
  86. package/dist/src/lib/analyzers/java/security-checks/injection-attacks.d.ts +23 -0
  87. package/dist/src/lib/analyzers/java/security-checks/injection-attacks.d.ts.map +1 -0
  88. package/dist/src/lib/analyzers/java/security-checks/injection-attacks.js +201 -0
  89. package/dist/src/lib/analyzers/java/security-checks/injection-attacks.js.map +1 -0
  90. package/dist/src/lib/analyzers/java/security-checks/insecure-design.d.ts +20 -0
  91. package/dist/src/lib/analyzers/java/security-checks/insecure-design.d.ts.map +1 -0
  92. package/dist/src/lib/analyzers/java/security-checks/insecure-design.js +121 -0
  93. package/dist/src/lib/analyzers/java/security-checks/insecure-design.js.map +1 -0
  94. package/dist/src/lib/analyzers/java/security-checks/logging-failures.d.ts +20 -0
  95. package/dist/src/lib/analyzers/java/security-checks/logging-failures.d.ts.map +1 -0
  96. package/dist/src/lib/analyzers/java/security-checks/logging-failures.js +89 -0
  97. package/dist/src/lib/analyzers/java/security-checks/logging-failures.js.map +1 -0
  98. package/dist/src/lib/analyzers/java/security-checks/security-misconfiguration.d.ts +26 -0
  99. package/dist/src/lib/analyzers/java/security-checks/security-misconfiguration.d.ts.map +1 -0
  100. package/dist/src/lib/analyzers/java/security-checks/security-misconfiguration.js +309 -0
  101. package/dist/src/lib/analyzers/java/security-checks/security-misconfiguration.js.map +1 -0
  102. package/dist/src/lib/analyzers/java/security-checks/unsafe-patterns.d.ts +18 -0
  103. package/dist/src/lib/analyzers/java/security-checks/unsafe-patterns.d.ts.map +1 -0
  104. package/dist/src/lib/analyzers/java/security-checks/unsafe-patterns.js +114 -0
  105. package/dist/src/lib/analyzers/java/security-checks/unsafe-patterns.js.map +1 -0
  106. package/dist/src/lib/analyzers/java/utils/createVulnerability.d.ts +58 -0
  107. package/dist/src/lib/analyzers/java/utils/createVulnerability.d.ts.map +1 -0
  108. package/dist/src/lib/analyzers/java/utils/createVulnerability.js +71 -0
  109. package/dist/src/lib/analyzers/java/utils/createVulnerability.js.map +1 -0
  110. package/dist/src/lib/analyzers/java-analyzer.d.ts +209 -0
  111. package/dist/src/lib/analyzers/java-analyzer.d.ts.map +1 -0
  112. package/dist/src/lib/analyzers/java-analyzer.js +1720 -0
  113. package/dist/src/lib/analyzers/java-analyzer.js.map +1 -0
  114. package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.d.ts +27 -0
  115. package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.d.ts.map +1 -0
  116. package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.js +123 -0
  117. package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.js.map +1 -0
  118. package/dist/src/lib/analyzers/javascript/quality-checks/async-patterns.d.ts +44 -0
  119. package/dist/src/lib/analyzers/javascript/quality-checks/async-patterns.d.ts.map +1 -0
  120. package/dist/src/lib/analyzers/javascript/quality-checks/async-patterns.js +224 -0
  121. package/dist/src/lib/analyzers/javascript/quality-checks/async-patterns.js.map +1 -0
  122. package/dist/src/lib/analyzers/javascript/quality-checks/code-patterns.d.ts +50 -0
  123. package/dist/src/lib/analyzers/javascript/quality-checks/code-patterns.d.ts.map +1 -0
  124. package/dist/src/lib/analyzers/javascript/quality-checks/code-patterns.js +284 -0
  125. package/dist/src/lib/analyzers/javascript/quality-checks/code-patterns.js.map +1 -0
  126. package/dist/src/lib/analyzers/javascript/quality-checks/comparison-issues.d.ts +27 -0
  127. package/dist/src/lib/analyzers/javascript/quality-checks/comparison-issues.d.ts.map +1 -0
  128. package/dist/src/lib/analyzers/javascript/quality-checks/comparison-issues.js +86 -0
  129. package/dist/src/lib/analyzers/javascript/quality-checks/comparison-issues.js.map +1 -0
  130. package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.d.ts +32 -0
  131. package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.d.ts.map +1 -0
  132. package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.js +44 -0
  133. package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.js.map +1 -0
  134. package/dist/src/lib/analyzers/javascript/security-checks/access-control.d.ts +22 -0
  135. package/dist/src/lib/analyzers/javascript/security-checks/access-control.d.ts.map +1 -0
  136. package/dist/src/lib/analyzers/javascript/security-checks/access-control.js +168 -0
  137. package/dist/src/lib/analyzers/javascript/security-checks/access-control.js.map +1 -0
  138. package/dist/src/lib/analyzers/javascript/security-checks/ai-generated-code.d.ts +25 -0
  139. package/dist/src/lib/analyzers/javascript/security-checks/ai-generated-code.d.ts.map +1 -0
  140. package/dist/src/lib/analyzers/javascript/security-checks/ai-generated-code.js +232 -0
  141. package/dist/src/lib/analyzers/javascript/security-checks/ai-generated-code.js.map +1 -0
  142. package/dist/src/lib/analyzers/javascript/security-checks/authentication-failures.d.ts +27 -0
  143. package/dist/src/lib/analyzers/javascript/security-checks/authentication-failures.d.ts.map +1 -0
  144. package/dist/src/lib/analyzers/javascript/security-checks/authentication-failures.js +222 -0
  145. package/dist/src/lib/analyzers/javascript/security-checks/authentication-failures.js.map +1 -0
  146. package/dist/src/lib/analyzers/javascript/security-checks/credential-crypto.d.ts +28 -0
  147. package/dist/src/lib/analyzers/javascript/security-checks/credential-crypto.d.ts.map +1 -0
  148. package/dist/src/lib/analyzers/javascript/security-checks/credential-crypto.js +176 -0
  149. package/dist/src/lib/analyzers/javascript/security-checks/credential-crypto.js.map +1 -0
  150. package/dist/src/lib/analyzers/javascript/security-checks/enhanced-supply-chain.d.ts +23 -0
  151. package/dist/src/lib/analyzers/javascript/security-checks/enhanced-supply-chain.d.ts.map +1 -0
  152. package/dist/src/lib/analyzers/javascript/security-checks/enhanced-supply-chain.js +113 -0
  153. package/dist/src/lib/analyzers/javascript/security-checks/enhanced-supply-chain.js.map +1 -0
  154. package/dist/src/lib/analyzers/javascript/security-checks/exception-handling.d.ts +28 -0
  155. package/dist/src/lib/analyzers/javascript/security-checks/exception-handling.d.ts.map +1 -0
  156. package/dist/src/lib/analyzers/javascript/security-checks/exception-handling.js +227 -0
  157. package/dist/src/lib/analyzers/javascript/security-checks/exception-handling.js.map +1 -0
  158. package/dist/src/lib/analyzers/javascript/security-checks/injection-attacks.d.ts +32 -0
  159. package/dist/src/lib/analyzers/javascript/security-checks/injection-attacks.d.ts.map +1 -0
  160. package/dist/src/lib/analyzers/javascript/security-checks/injection-attacks.js +260 -0
  161. package/dist/src/lib/analyzers/javascript/security-checks/injection-attacks.js.map +1 -0
  162. package/dist/src/lib/analyzers/javascript/security-checks/insecure-design.d.ts +26 -0
  163. package/dist/src/lib/analyzers/javascript/security-checks/insecure-design.d.ts.map +1 -0
  164. package/dist/src/lib/analyzers/javascript/security-checks/insecure-design.js +164 -0
  165. package/dist/src/lib/analyzers/javascript/security-checks/insecure-design.js.map +1 -0
  166. package/dist/src/lib/analyzers/javascript/security-checks/security-misconfiguration.d.ts +26 -0
  167. package/dist/src/lib/analyzers/javascript/security-checks/security-misconfiguration.d.ts.map +1 -0
  168. package/dist/src/lib/analyzers/javascript/security-checks/security-misconfiguration.js +775 -0
  169. package/dist/src/lib/analyzers/javascript/security-checks/security-misconfiguration.js.map +1 -0
  170. package/dist/src/lib/analyzers/javascript/security-checks/software-integrity.d.ts +25 -0
  171. package/dist/src/lib/analyzers/javascript/security-checks/software-integrity.d.ts.map +1 -0
  172. package/dist/src/lib/analyzers/javascript/security-checks/software-integrity.js +168 -0
  173. package/dist/src/lib/analyzers/javascript/security-checks/software-integrity.js.map +1 -0
  174. package/dist/src/lib/analyzers/javascript/security-checks/storage-security.d.ts +27 -0
  175. package/dist/src/lib/analyzers/javascript/security-checks/storage-security.d.ts.map +1 -0
  176. package/dist/src/lib/analyzers/javascript/security-checks/storage-security.js +108 -0
  177. package/dist/src/lib/analyzers/javascript/security-checks/storage-security.js.map +1 -0
  178. package/dist/src/lib/analyzers/javascript/security-checks/xss-dom-security.d.ts +28 -0
  179. package/dist/src/lib/analyzers/javascript/security-checks/xss-dom-security.d.ts.map +1 -0
  180. package/dist/src/lib/analyzers/javascript/security-checks/xss-dom-security.js +143 -0
  181. package/dist/src/lib/analyzers/javascript/security-checks/xss-dom-security.js.map +1 -0
  182. package/dist/src/lib/analyzers/javascript/syntax/syntax-helpers.d.ts +53 -0
  183. package/dist/src/lib/analyzers/javascript/syntax/syntax-helpers.d.ts.map +1 -0
  184. package/dist/src/lib/analyzers/javascript/syntax/syntax-helpers.js +144 -0
  185. package/dist/src/lib/analyzers/javascript/syntax/syntax-helpers.js.map +1 -0
  186. package/dist/src/lib/analyzers/javascript/syntax/typescript-syntax.d.ts +72 -0
  187. package/dist/src/lib/analyzers/javascript/syntax/typescript-syntax.d.ts.map +1 -0
  188. package/dist/src/lib/analyzers/javascript/syntax/typescript-syntax.js +314 -0
  189. package/dist/src/lib/analyzers/javascript/syntax/typescript-syntax.js.map +1 -0
  190. package/dist/src/lib/analyzers/javascript/utils/createVulnerability.d.ts +58 -0
  191. package/dist/src/lib/analyzers/javascript/utils/createVulnerability.d.ts.map +1 -0
  192. package/dist/src/lib/analyzers/javascript/utils/createVulnerability.js +71 -0
  193. package/dist/src/lib/analyzers/javascript/utils/createVulnerability.js.map +1 -0
  194. package/dist/src/lib/analyzers/javascript/utils/metrics-calculator.d.ts +36 -0
  195. package/dist/src/lib/analyzers/javascript/utils/metrics-calculator.d.ts.map +1 -0
  196. package/dist/src/lib/analyzers/javascript/utils/metrics-calculator.js +70 -0
  197. package/dist/src/lib/analyzers/javascript/utils/metrics-calculator.js.map +1 -0
  198. package/dist/src/lib/analyzers/javascript/utils/performance-analyzer.d.ts +29 -0
  199. package/dist/src/lib/analyzers/javascript/utils/performance-analyzer.d.ts.map +1 -0
  200. package/dist/src/lib/analyzers/javascript/utils/performance-analyzer.js +55 -0
  201. package/dist/src/lib/analyzers/javascript/utils/performance-analyzer.js.map +1 -0
  202. package/dist/src/lib/analyzers/javascript-analyzer.d.ts +95 -0
  203. package/dist/src/lib/analyzers/javascript-analyzer.d.ts.map +1 -0
  204. package/dist/src/lib/analyzers/javascript-analyzer.js +2141 -0
  205. package/dist/src/lib/analyzers/javascript-analyzer.js.map +1 -0
  206. package/dist/src/lib/analyzers/python/security-checks/access-control.d.ts +21 -0
  207. package/dist/src/lib/analyzers/python/security-checks/access-control.d.ts.map +1 -0
  208. package/dist/src/lib/analyzers/python/security-checks/access-control.js +305 -0
  209. package/dist/src/lib/analyzers/python/security-checks/access-control.js.map +1 -0
  210. package/dist/src/lib/analyzers/python/security-checks/ai-generated-code.d.ts +25 -0
  211. package/dist/src/lib/analyzers/python/security-checks/ai-generated-code.d.ts.map +1 -0
  212. package/dist/src/lib/analyzers/python/security-checks/ai-generated-code.js +242 -0
  213. package/dist/src/lib/analyzers/python/security-checks/ai-generated-code.js.map +1 -0
  214. package/dist/src/lib/analyzers/python/security-checks/authentication-flaws.d.ts +24 -0
  215. package/dist/src/lib/analyzers/python/security-checks/authentication-flaws.d.ts.map +1 -0
  216. package/dist/src/lib/analyzers/python/security-checks/authentication-flaws.js +207 -0
  217. package/dist/src/lib/analyzers/python/security-checks/authentication-flaws.js.map +1 -0
  218. package/dist/src/lib/analyzers/python/security-checks/code-quality.d.ts +27 -0
  219. package/dist/src/lib/analyzers/python/security-checks/code-quality.d.ts.map +1 -0
  220. package/dist/src/lib/analyzers/python/security-checks/code-quality.js +206 -0
  221. package/dist/src/lib/analyzers/python/security-checks/code-quality.js.map +1 -0
  222. package/dist/src/lib/analyzers/python/security-checks/credentials-crypto.d.ts +24 -0
  223. package/dist/src/lib/analyzers/python/security-checks/credentials-crypto.d.ts.map +1 -0
  224. package/dist/src/lib/analyzers/python/security-checks/credentials-crypto.js +113 -0
  225. package/dist/src/lib/analyzers/python/security-checks/credentials-crypto.js.map +1 -0
  226. package/dist/src/lib/analyzers/python/security-checks/crypto-failures.d.ts +20 -0
  227. package/dist/src/lib/analyzers/python/security-checks/crypto-failures.d.ts.map +1 -0
  228. package/dist/src/lib/analyzers/python/security-checks/crypto-failures.js +129 -0
  229. package/dist/src/lib/analyzers/python/security-checks/crypto-failures.js.map +1 -0
  230. package/dist/src/lib/analyzers/python/security-checks/data-integrity.d.ts +19 -0
  231. package/dist/src/lib/analyzers/python/security-checks/data-integrity.d.ts.map +1 -0
  232. package/dist/src/lib/analyzers/python/security-checks/data-integrity.js +90 -0
  233. package/dist/src/lib/analyzers/python/security-checks/data-integrity.js.map +1 -0
  234. package/dist/src/lib/analyzers/python/security-checks/deserialization.d.ts +20 -0
  235. package/dist/src/lib/analyzers/python/security-checks/deserialization.d.ts.map +1 -0
  236. package/dist/src/lib/analyzers/python/security-checks/deserialization.js +68 -0
  237. package/dist/src/lib/analyzers/python/security-checks/deserialization.js.map +1 -0
  238. package/dist/src/lib/analyzers/python/security-checks/django-security.d.ts +25 -0
  239. package/dist/src/lib/analyzers/python/security-checks/django-security.d.ts.map +1 -0
  240. package/dist/src/lib/analyzers/python/security-checks/django-security.js +180 -0
  241. package/dist/src/lib/analyzers/python/security-checks/django-security.js.map +1 -0
  242. package/dist/src/lib/analyzers/python/security-checks/enhanced-supply-chain.d.ts +23 -0
  243. package/dist/src/lib/analyzers/python/security-checks/enhanced-supply-chain.d.ts.map +1 -0
  244. package/dist/src/lib/analyzers/python/security-checks/enhanced-supply-chain.js +127 -0
  245. package/dist/src/lib/analyzers/python/security-checks/enhanced-supply-chain.js.map +1 -0
  246. package/dist/src/lib/analyzers/python/security-checks/exception-handling.d.ts +23 -0
  247. package/dist/src/lib/analyzers/python/security-checks/exception-handling.d.ts.map +1 -0
  248. package/dist/src/lib/analyzers/python/security-checks/exception-handling.js +120 -0
  249. package/dist/src/lib/analyzers/python/security-checks/exception-handling.js.map +1 -0
  250. package/dist/src/lib/analyzers/python/security-checks/flask-security.d.ts +24 -0
  251. package/dist/src/lib/analyzers/python/security-checks/flask-security.d.ts.map +1 -0
  252. package/dist/src/lib/analyzers/python/security-checks/flask-security.js +143 -0
  253. package/dist/src/lib/analyzers/python/security-checks/flask-security.js.map +1 -0
  254. package/dist/src/lib/analyzers/python/security-checks/injection-attacks.d.ts +28 -0
  255. package/dist/src/lib/analyzers/python/security-checks/injection-attacks.d.ts.map +1 -0
  256. package/dist/src/lib/analyzers/python/security-checks/injection-attacks.js +174 -0
  257. package/dist/src/lib/analyzers/python/security-checks/injection-attacks.js.map +1 -0
  258. package/dist/src/lib/analyzers/python/security-checks/insecure-design.d.ts +20 -0
  259. package/dist/src/lib/analyzers/python/security-checks/insecure-design.d.ts.map +1 -0
  260. package/dist/src/lib/analyzers/python/security-checks/insecure-design.js +160 -0
  261. package/dist/src/lib/analyzers/python/security-checks/insecure-design.js.map +1 -0
  262. package/dist/src/lib/analyzers/python/security-checks/logging-failures.d.ts +20 -0
  263. package/dist/src/lib/analyzers/python/security-checks/logging-failures.d.ts.map +1 -0
  264. package/dist/src/lib/analyzers/python/security-checks/logging-failures.js +121 -0
  265. package/dist/src/lib/analyzers/python/security-checks/logging-failures.js.map +1 -0
  266. package/dist/src/lib/analyzers/python/security-checks/nosql-injection.d.ts +26 -0
  267. package/dist/src/lib/analyzers/python/security-checks/nosql-injection.d.ts.map +1 -0
  268. package/dist/src/lib/analyzers/python/security-checks/nosql-injection.js +248 -0
  269. package/dist/src/lib/analyzers/python/security-checks/nosql-injection.js.map +1 -0
  270. package/dist/src/lib/analyzers/python/security-checks/security-misconfiguration.d.ts +26 -0
  271. package/dist/src/lib/analyzers/python/security-checks/security-misconfiguration.d.ts.map +1 -0
  272. package/dist/src/lib/analyzers/python/security-checks/security-misconfiguration.js +375 -0
  273. package/dist/src/lib/analyzers/python/security-checks/security-misconfiguration.js.map +1 -0
  274. package/dist/src/lib/analyzers/python/security-checks/ssrf-detection.d.ts +26 -0
  275. package/dist/src/lib/analyzers/python/security-checks/ssrf-detection.d.ts.map +1 -0
  276. package/dist/src/lib/analyzers/python/security-checks/ssrf-detection.js +160 -0
  277. package/dist/src/lib/analyzers/python/security-checks/ssrf-detection.js.map +1 -0
  278. package/dist/src/lib/analyzers/python/security-checks/web-security.d.ts +23 -0
  279. package/dist/src/lib/analyzers/python/security-checks/web-security.d.ts.map +1 -0
  280. package/dist/src/lib/analyzers/python/security-checks/web-security.js +117 -0
  281. package/dist/src/lib/analyzers/python/security-checks/web-security.js.map +1 -0
  282. package/dist/src/lib/analyzers/python/utils/createVulnerability.d.ts +58 -0
  283. package/dist/src/lib/analyzers/python/utils/createVulnerability.d.ts.map +1 -0
  284. package/dist/src/lib/analyzers/python/utils/createVulnerability.js +71 -0
  285. package/dist/src/lib/analyzers/python/utils/createVulnerability.js.map +1 -0
  286. package/dist/src/lib/analyzers/python-analyzer.d.ts +111 -0
  287. package/dist/src/lib/analyzers/python-analyzer.d.ts.map +1 -0
  288. package/dist/src/lib/analyzers/python-analyzer.js +1600 -0
  289. package/dist/src/lib/analyzers/python-analyzer.js.map +1 -0
  290. package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.d.ts +14 -0
  291. package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.d.ts.map +1 -0
  292. package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.js +47 -0
  293. package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.js.map +1 -0
  294. package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.d.ts +13 -0
  295. package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.d.ts.map +1 -0
  296. package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.js +36 -0
  297. package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.js.map +1 -0
  298. package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.d.ts +15 -0
  299. package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.d.ts.map +1 -0
  300. package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.js +68 -0
  301. package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.js.map +1 -0
  302. package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.d.ts +15 -0
  303. package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.d.ts.map +1 -0
  304. package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.js +68 -0
  305. package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.js.map +1 -0
  306. package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.d.ts +12 -0
  307. package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.d.ts.map +1 -0
  308. package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.js +45 -0
  309. package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.js.map +1 -0
  310. package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.d.ts +14 -0
  311. package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.d.ts.map +1 -0
  312. package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.js +47 -0
  313. package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.js.map +1 -0
  314. package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.d.ts +13 -0
  315. package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.d.ts.map +1 -0
  316. package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.js +36 -0
  317. package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.js.map +1 -0
  318. package/dist/src/lib/analyzers/secrets/patterns/api-keys.d.ts +15 -0
  319. package/dist/src/lib/analyzers/secrets/patterns/api-keys.d.ts.map +1 -0
  320. package/dist/src/lib/analyzers/secrets/patterns/api-keys.js +32 -0
  321. package/dist/src/lib/analyzers/secrets/patterns/api-keys.js.map +1 -0
  322. package/dist/src/lib/analyzers/secrets/patterns/credentials.d.ts +15 -0
  323. package/dist/src/lib/analyzers/secrets/patterns/credentials.d.ts.map +1 -0
  324. package/dist/src/lib/analyzers/secrets/patterns/credentials.js +68 -0
  325. package/dist/src/lib/analyzers/secrets/patterns/credentials.js.map +1 -0
  326. package/dist/src/lib/analyzers/secrets/patterns/private-keys.d.ts +16 -0
  327. package/dist/src/lib/analyzers/secrets/patterns/private-keys.d.ts.map +1 -0
  328. package/dist/src/lib/analyzers/secrets/patterns/private-keys.js +79 -0
  329. package/dist/src/lib/analyzers/secrets/patterns/private-keys.js.map +1 -0
  330. package/dist/src/lib/analyzers/secrets/patterns/tokens.d.ts +15 -0
  331. package/dist/src/lib/analyzers/secrets/patterns/tokens.d.ts.map +1 -0
  332. package/dist/src/lib/analyzers/secrets/patterns/tokens.js +58 -0
  333. package/dist/src/lib/analyzers/secrets/patterns/tokens.js.map +1 -0
  334. package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts +88 -0
  335. package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts.map +1 -0
  336. package/dist/src/lib/analyzers/secrets/secrets-analyzer.js +162 -0
  337. package/dist/src/lib/analyzers/secrets/secrets-analyzer.js.map +1 -0
  338. package/dist/src/lib/analyzers/secrets/validators/context-checker.d.ts +56 -0
  339. package/dist/src/lib/analyzers/secrets/validators/context-checker.d.ts.map +1 -0
  340. package/dist/src/lib/analyzers/secrets/validators/context-checker.js +199 -0
  341. package/dist/src/lib/analyzers/secrets/validators/context-checker.js.map +1 -0
  342. package/dist/src/lib/analyzers/secrets/validators/entropy-checker.d.ts +56 -0
  343. package/dist/src/lib/analyzers/secrets/validators/entropy-checker.d.ts.map +1 -0
  344. package/dist/src/lib/analyzers/secrets/validators/entropy-checker.js +102 -0
  345. package/dist/src/lib/analyzers/secrets/validators/entropy-checker.js.map +1 -0
  346. package/dist/src/lib/analyzers/security-checks/es6-security.d.ts +38 -0
  347. package/dist/src/lib/analyzers/security-checks/es6-security.d.ts.map +1 -0
  348. package/dist/src/lib/analyzers/security-checks/es6-security.js +125 -0
  349. package/dist/src/lib/analyzers/security-checks/es6-security.js.map +1 -0
  350. package/dist/src/lib/analyzers/security-checks/python-async-security.d.ts +46 -0
  351. package/dist/src/lib/analyzers/security-checks/python-async-security.d.ts.map +1 -0
  352. package/dist/src/lib/analyzers/security-checks/python-async-security.js +92 -0
  353. package/dist/src/lib/analyzers/security-checks/python-async-security.js.map +1 -0
  354. package/dist/src/lib/analyzers/security-checks/react-security.d.ts +49 -0
  355. package/dist/src/lib/analyzers/security-checks/react-security.d.ts.map +1 -0
  356. package/dist/src/lib/analyzers/security-checks/react-security.js +125 -0
  357. package/dist/src/lib/analyzers/security-checks/react-security.js.map +1 -0
  358. package/dist/src/lib/analyzers/types.d.ts +92 -0
  359. package/dist/src/lib/analyzers/types.d.ts.map +1 -0
  360. package/dist/src/lib/analyzers/types.js +3 -0
  361. package/dist/src/lib/analyzers/types.js.map +1 -0
  362. package/dist/src/lib/analyzers/typescript/security-checks/access-control.d.ts +19 -0
  363. package/dist/src/lib/analyzers/typescript/security-checks/access-control.d.ts.map +1 -0
  364. package/dist/src/lib/analyzers/typescript/security-checks/access-control.js +210 -0
  365. package/dist/src/lib/analyzers/typescript/security-checks/access-control.js.map +1 -0
  366. package/dist/src/lib/analyzers/typescript/security-checks/ai-generated-code.d.ts +25 -0
  367. package/dist/src/lib/analyzers/typescript/security-checks/ai-generated-code.d.ts.map +1 -0
  368. package/dist/src/lib/analyzers/typescript/security-checks/ai-generated-code.js +242 -0
  369. package/dist/src/lib/analyzers/typescript/security-checks/ai-generated-code.js.map +1 -0
  370. package/dist/src/lib/analyzers/typescript/security-checks/authentication.d.ts +28 -0
  371. package/dist/src/lib/analyzers/typescript/security-checks/authentication.d.ts.map +1 -0
  372. package/dist/src/lib/analyzers/typescript/security-checks/authentication.js +357 -0
  373. package/dist/src/lib/analyzers/typescript/security-checks/authentication.js.map +1 -0
  374. package/dist/src/lib/analyzers/typescript/security-checks/code-injection.d.ts +26 -0
  375. package/dist/src/lib/analyzers/typescript/security-checks/code-injection.d.ts.map +1 -0
  376. package/dist/src/lib/analyzers/typescript/security-checks/code-injection.js +380 -0
  377. package/dist/src/lib/analyzers/typescript/security-checks/code-injection.js.map +1 -0
  378. package/dist/src/lib/analyzers/typescript/security-checks/code-quality.d.ts +23 -0
  379. package/dist/src/lib/analyzers/typescript/security-checks/code-quality.d.ts.map +1 -0
  380. package/dist/src/lib/analyzers/typescript/security-checks/code-quality.js +109 -0
  381. package/dist/src/lib/analyzers/typescript/security-checks/code-quality.js.map +1 -0
  382. package/dist/src/lib/analyzers/typescript/security-checks/credentials-crypto.d.ts +21 -0
  383. package/dist/src/lib/analyzers/typescript/security-checks/credentials-crypto.d.ts.map +1 -0
  384. package/dist/src/lib/analyzers/typescript/security-checks/credentials-crypto.js +153 -0
  385. package/dist/src/lib/analyzers/typescript/security-checks/credentials-crypto.js.map +1 -0
  386. package/dist/src/lib/analyzers/typescript/security-checks/enhanced-supply-chain.d.ts +23 -0
  387. package/dist/src/lib/analyzers/typescript/security-checks/enhanced-supply-chain.d.ts.map +1 -0
  388. package/dist/src/lib/analyzers/typescript/security-checks/enhanced-supply-chain.js +146 -0
  389. package/dist/src/lib/analyzers/typescript/security-checks/enhanced-supply-chain.js.map +1 -0
  390. package/dist/src/lib/analyzers/typescript/security-checks/exception-handling.d.ts +23 -0
  391. package/dist/src/lib/analyzers/typescript/security-checks/exception-handling.d.ts.map +1 -0
  392. package/dist/src/lib/analyzers/typescript/security-checks/exception-handling.js +187 -0
  393. package/dist/src/lib/analyzers/typescript/security-checks/exception-handling.js.map +1 -0
  394. package/dist/src/lib/analyzers/typescript/security-checks/information-disclosure.d.ts +19 -0
  395. package/dist/src/lib/analyzers/typescript/security-checks/information-disclosure.d.ts.map +1 -0
  396. package/dist/src/lib/analyzers/typescript/security-checks/information-disclosure.js +97 -0
  397. package/dist/src/lib/analyzers/typescript/security-checks/information-disclosure.js.map +1 -0
  398. package/dist/src/lib/analyzers/typescript/security-checks/injection-attacks.d.ts +29 -0
  399. package/dist/src/lib/analyzers/typescript/security-checks/injection-attacks.d.ts.map +1 -0
  400. package/dist/src/lib/analyzers/typescript/security-checks/injection-attacks.js +319 -0
  401. package/dist/src/lib/analyzers/typescript/security-checks/injection-attacks.js.map +1 -0
  402. package/dist/src/lib/analyzers/typescript/security-checks/logging-failures.d.ts +21 -0
  403. package/dist/src/lib/analyzers/typescript/security-checks/logging-failures.d.ts.map +1 -0
  404. package/dist/src/lib/analyzers/typescript/security-checks/logging-failures.js +121 -0
  405. package/dist/src/lib/analyzers/typescript/security-checks/logging-failures.js.map +1 -0
  406. package/dist/src/lib/analyzers/typescript/security-checks/security-misconfiguration.d.ts +27 -0
  407. package/dist/src/lib/analyzers/typescript/security-checks/security-misconfiguration.d.ts.map +1 -0
  408. package/dist/src/lib/analyzers/typescript/security-checks/security-misconfiguration.js +213 -0
  409. package/dist/src/lib/analyzers/typescript/security-checks/security-misconfiguration.js.map +1 -0
  410. package/dist/src/lib/analyzers/typescript/security-checks/type-security.d.ts +19 -0
  411. package/dist/src/lib/analyzers/typescript/security-checks/type-security.d.ts.map +1 -0
  412. package/dist/src/lib/analyzers/typescript/security-checks/type-security.js +59 -0
  413. package/dist/src/lib/analyzers/typescript/security-checks/type-security.js.map +1 -0
  414. package/dist/src/lib/analyzers/typescript/type-checker.d.ts +17 -0
  415. package/dist/src/lib/analyzers/typescript/type-checker.d.ts.map +1 -0
  416. package/dist/src/lib/analyzers/typescript/type-checker.js +515 -0
  417. package/dist/src/lib/analyzers/typescript/type-checker.js.map +1 -0
  418. package/dist/src/lib/analyzers/typescript/utils/createVulnerability.d.ts +58 -0
  419. package/dist/src/lib/analyzers/typescript/utils/createVulnerability.d.ts.map +1 -0
  420. package/dist/src/lib/analyzers/typescript/utils/createVulnerability.js +71 -0
  421. package/dist/src/lib/analyzers/typescript/utils/createVulnerability.js.map +1 -0
  422. package/dist/src/lib/analyzers/typescript-analyzer.d.ts +116 -0
  423. package/dist/src/lib/analyzers/typescript-analyzer.d.ts.map +1 -0
  424. package/dist/src/lib/analyzers/typescript-analyzer.js +1660 -0
  425. package/dist/src/lib/analyzers/typescript-analyzer.js.map +1 -0
  426. package/dist/src/lib/security/compliance-mapping.d.ts +29 -0
  427. package/dist/src/lib/security/compliance-mapping.d.ts.map +1 -0
  428. package/dist/src/lib/security/compliance-mapping.js +1342 -0
  429. package/dist/src/lib/security/compliance-mapping.js.map +1 -0
  430. package/dist/src/lib/security/severity-scoring.d.ts +47 -0
  431. package/dist/src/lib/security/severity-scoring.d.ts.map +1 -0
  432. package/dist/src/lib/security/severity-scoring.js +965 -0
  433. package/dist/src/lib/security/severity-scoring.js.map +1 -0
  434. package/dist/src/lib/standards/references.d.ts +16 -0
  435. package/dist/src/lib/standards/references.d.ts.map +1 -0
  436. package/dist/src/lib/standards/references.js +1161 -0
  437. package/dist/src/lib/standards/references.js.map +1 -0
  438. package/dist/src/lib/types/index.d.ts +167 -0
  439. package/dist/src/lib/types/index.d.ts.map +1 -0
  440. package/dist/src/lib/types/index.js +3 -0
  441. package/dist/src/lib/types/index.js.map +1 -0
  442. package/dist/src/lib/utils/code-cleaner.d.ts +59 -0
  443. package/dist/src/lib/utils/code-cleaner.d.ts.map +1 -0
  444. package/dist/src/lib/utils/code-cleaner.js +283 -0
  445. package/dist/src/lib/utils/code-cleaner.js.map +1 -0
  446. package/package.json +51 -0
  447. package/src/commands/auth.ts +308 -0
  448. package/src/commands/config.ts +226 -0
  449. package/src/commands/init.ts +202 -0
  450. package/src/commands/scan.ts +238 -0
  451. package/src/config/config-loader.ts +175 -0
  452. package/src/reporters/cli-reporter.ts +282 -0
  453. package/src/scanner/local-scanner.ts +250 -0
  454. package/tsconfig.json +24 -0
  455. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ /**
3
+ * Python Async/Await Security Checks Module
4
+ *
5
+ * Security vulnerability detection for Python async/await patterns.
6
+ * Detects missing await keywords and asyncio.run() misuse.
7
+ *
8
+ * @module python-async-security
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.isAsyncFunctionStart = isAsyncFunctionStart;
12
+ exports.isAsyncFunctionEnd = isAsyncFunctionEnd;
13
+ exports.detectMissingAwait = detectMissingAwait;
14
+ exports.detectAsyncioRunMisuse = detectAsyncioRunMisuse;
15
+ /**
16
+ * Check if line starts an async function definition
17
+ *
18
+ * @param line - The code line to check
19
+ * @returns true if line starts async function
20
+ */
21
+ function isAsyncFunctionStart(line) {
22
+ return line.trim().match(/\basync\s+def\s+\w+/) !== null;
23
+ }
24
+ /**
25
+ * Check if line ends async function context (dedent back to module level)
26
+ *
27
+ * @param line - The code line to check
28
+ * @param prevIndent - Previous function body indent level
29
+ * @returns true if async context should end
30
+ */
31
+ function isAsyncFunctionEnd(line, prevIndent) {
32
+ const trimmed = line.trim();
33
+ if (!trimmed || trimmed.startsWith('#'))
34
+ return false;
35
+ const currentIndent = line.length - line.trimStart().length;
36
+ // CRITICAL FIX: Don't end on async def lines (they start a NEW async context)
37
+ if (trimmed.startsWith('async def'))
38
+ return false;
39
+ // End when we dedent back to module level (currentIndent < prevIndent)
40
+ // This includes regular 'def' at module level, class definitions, etc.
41
+ return currentIndent < prevIndent && trimmed.match(/^\w/) !== null;
42
+ }
43
+ /**
44
+ * Detect missing await on async function calls
45
+ *
46
+ * @param line - The code line to check
47
+ * @param lineNumber - The line number
48
+ * @param inAsyncContext - Whether we're inside an async function
49
+ * @param createVulnerability - Function to create vulnerability object
50
+ * @returns SecurityVulnerability if detected, null otherwise
51
+ */
52
+ function detectMissingAwait(line, lineNumber, inAsyncContext, createVulnerability) {
53
+ if (!inAsyncContext)
54
+ return null;
55
+ const trimmed = line.trim();
56
+ // Check for assignment from function call
57
+ const hasAsyncCall = trimmed.match(/=\s*(fetch_|get_|query_|save_|update_|delete_|create_|process_|send_|request_)\w*\s*\(/);
58
+ const hasAwait = trimmed.includes('await ');
59
+ const isFunctionDef = trimmed.includes('def ');
60
+ if (hasAsyncCall && !hasAwait && !isFunctionDef) {
61
+ return createVulnerability('async-await-missing', 'Missing await on potentially async function call', 'Add await keyword before async function calls', lineNumber, 'Calling an async function without await causes the function to return a coroutine object instead of the expected result, leading to silent failures where code appears to run but does nothing.', 'result = fetch_user_data() # Returns coroutine, not user data', [
62
+ 'Silent failures (no error, no result)',
63
+ 'Data not saved/updated',
64
+ 'Security checks bypassed',
65
+ 'Logic errors',
66
+ 'Hard to debug issues'
67
+ ], 'user = get_user_by_id(user_id)', 'user = await get_user_by_id(user_id)', 'Always use await with async functions - missing await causes silent failures');
68
+ }
69
+ return null;
70
+ }
71
+ /**
72
+ * Detect asyncio.run() called inside async function
73
+ *
74
+ * @param line - The code line to check
75
+ * @param lineNumber - The line number
76
+ * @param inAsyncContext - Whether we're inside an async function
77
+ * @param createVulnerability - Function to create vulnerability object
78
+ * @returns SecurityVulnerability if detected, null otherwise
79
+ */
80
+ function detectAsyncioRunMisuse(line, lineNumber, inAsyncContext, createVulnerability) {
81
+ const trimmed = line.trim();
82
+ if (trimmed.includes('asyncio.run(') && inAsyncContext) {
83
+ return createVulnerability('asyncio-run-misuse', 'asyncio.run() called inside async function', 'Use await directly or use asyncio.create_task()', lineNumber, 'asyncio.run() creates a new event loop and cannot be called from within an async function that is already running in an event loop. This causes a RuntimeError.', 'async def process(): asyncio.run(fetch_data()) # RuntimeError', [
84
+ 'RuntimeError crashes',
85
+ 'Application failure',
86
+ 'Event loop conflicts',
87
+ 'Deadlocks'
88
+ ], 'async def process_data():\n result = asyncio.run(fetch_data())', 'async def process_data():\n result = await fetch_data()', 'Inside async functions, use await - asyncio.run() is only for top-level entry points');
89
+ }
90
+ return null;
91
+ }
92
+ //# sourceMappingURL=python-async-security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-async-security.js","sourceRoot":"","sources":["../../../../../../../src/lib/analyzers/security-checks/python-async-security.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAuBH,oDAEC;AASD,gDAYC;AAWD,gDAqCC;AAWD,wDA6BC;AArHD;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,KAAK,IAAI,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,IAAY,EAAE,UAAkB;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAEtD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC;IAE5D,8EAA8E;IAC9E,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAElD,uEAAuE;IACvE,uEAAuE;IACvE,OAAO,aAAa,GAAG,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AACrE,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,kBAAkB,CAChC,IAAY,EACZ,UAAkB,EAClB,cAAuB,EACvB,mBAA0C;IAE1C,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,0CAA0C;IAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,wFAAwF,CAAC,CAAC;IAC7H,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE/C,IAAI,YAAY,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,EAAE,CAAC;QAChD,OAAO,mBAAmB,CACxB,qBAAqB,EACrB,kDAAkD,EAClD,+CAA+C,EAC/C,UAAU,EACV,iMAAiM,EACjM,gEAAgE,EAChE;YACE,uCAAuC;YACvC,wBAAwB;YACxB,0BAA0B;YAC1B,cAAc;YACd,sBAAsB;SACvB,EACD,gCAAgC,EAChC,sCAAsC,EACtC,8EAA8E,CAC/E,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,sBAAsB,CACpC,IAAY,EACZ,UAAkB,EAClB,cAAuB,EACvB,mBAA0C;IAE1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,EAAE,CAAC;QACvD,OAAO,mBAAmB,CACxB,oBAAoB,EACpB,4CAA4C,EAC5C,iDAAiD,EACjD,UAAU,EACV,iKAAiK,EACjK,gEAAgE,EAChE;YACE,sBAAsB;YACtB,qBAAqB;YACrB,sBAAsB;YACtB,WAAW;SACZ,EACD,mEAAmE,EACnE,4DAA4D,EAC5D,sFAAsF,CACvF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * React Security Checks Module
3
+ *
4
+ * Security vulnerability detection for React-specific patterns.
5
+ * Detects XSS vulnerabilities, performance issues, and state management problems.
6
+ *
7
+ * @module react-security
8
+ */
9
+ import { SecurityVulnerability } from '../types';
10
+ export type CreateVulnerabilityFn = (category: string, message: string, suggestion: string, line: number, description: string, exploitExample: string, realWorldImpact: string[], before: string, after: string, explanation: string) => SecurityVulnerability;
11
+ /**
12
+ * Detects dangerouslySetInnerHTML usage which can cause XSS
13
+ *
14
+ * @param line - The code line to check
15
+ * @param lineNumber - The line number
16
+ * @param createVulnerability - Function to create vulnerability object
17
+ * @returns SecurityVulnerability if detected, null otherwise
18
+ */
19
+ export declare function detectDangerouslySetInnerHTML(line: string, lineNumber: number, createVulnerability: CreateVulnerabilityFn): SecurityVulnerability | null;
20
+ /**
21
+ * Detects missing key prop in React list rendering
22
+ *
23
+ * @param line - The code line to check
24
+ * @param lineNumber - The line number
25
+ * @param lines - All code lines (for multi-line JSX check)
26
+ * @param index - Current line index
27
+ * @param createVulnerability - Function to create vulnerability object
28
+ * @returns SecurityVulnerability if detected, null otherwise
29
+ */
30
+ export declare function detectMissingKeyProp(line: string, lineNumber: number, lines: string[], index: number, createVulnerability: CreateVulnerabilityFn): SecurityVulnerability | null;
31
+ /**
32
+ * Detects unsafe href attributes with user input (XSS risk)
33
+ *
34
+ * @param line - The code line to check
35
+ * @param lineNumber - The line number
36
+ * @param createVulnerability - Function to create vulnerability object
37
+ * @returns SecurityVulnerability if detected, null otherwise
38
+ */
39
+ export declare function detectUnsafeHref(line: string, lineNumber: number, createVulnerability: CreateVulnerabilityFn): SecurityVulnerability | null;
40
+ /**
41
+ * Detects direct React state mutation (anti-pattern)
42
+ *
43
+ * @param line - The code line to check
44
+ * @param lineNumber - The line number
45
+ * @param createVulnerability - Function to create vulnerability object
46
+ * @returns SecurityVulnerability if detected, null otherwise
47
+ */
48
+ export declare function detectStateMutation(line: string, lineNumber: number, createVulnerability: CreateVulnerabilityFn): SecurityVulnerability | null;
49
+ //# sourceMappingURL=react-security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-security.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/analyzers/security-checks/react-security.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,MAAM,qBAAqB,GAAG,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EAAE,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,KAChB,qBAAqB,CAAC;AAE3B;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,mBAAmB,EAAE,qBAAqB,GACzC,qBAAqB,GAAG,IAAI,CAwB9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,MAAM,EACb,mBAAmB,EAAE,qBAAqB,GACzC,qBAAqB,GAAG,IAAI,CA+B9B;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,mBAAmB,EAAE,qBAAqB,GACzC,qBAAqB,GAAG,IAAI,CAmC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,mBAAmB,EAAE,qBAAqB,GACzC,qBAAqB,GAAG,IAAI,CAwC9B"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ /**
3
+ * React Security Checks Module
4
+ *
5
+ * Security vulnerability detection for React-specific patterns.
6
+ * Detects XSS vulnerabilities, performance issues, and state management problems.
7
+ *
8
+ * @module react-security
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.detectDangerouslySetInnerHTML = detectDangerouslySetInnerHTML;
12
+ exports.detectMissingKeyProp = detectMissingKeyProp;
13
+ exports.detectUnsafeHref = detectUnsafeHref;
14
+ exports.detectStateMutation = detectStateMutation;
15
+ /**
16
+ * Detects dangerouslySetInnerHTML usage which can cause XSS
17
+ *
18
+ * @param line - The code line to check
19
+ * @param lineNumber - The line number
20
+ * @param createVulnerability - Function to create vulnerability object
21
+ * @returns SecurityVulnerability if detected, null otherwise
22
+ */
23
+ function detectDangerouslySetInnerHTML(line, lineNumber, createVulnerability) {
24
+ const trimmed = line.trim();
25
+ if (trimmed.match(/dangerouslySetInnerHTML\s*=\s*{{/)) {
26
+ return createVulnerability('xss', 'React dangerouslySetInnerHTML can cause XSS', 'Sanitize with DOMPurify or use safer alternatives', lineNumber, 'React\'s dangerouslySetInnerHTML bypasses XSS protection and directly sets HTML, making it vulnerable if content is not sanitized.', '<div dangerouslySetInnerHTML={{__html: userComment}} /> where userComment = "<img src=x onerror=alert(document.cookie)>"', [
27
+ 'XSS attacks in React applications',
28
+ 'Session hijacking',
29
+ 'Credential theft',
30
+ 'DOM-based XSS'
31
+ ], '<div dangerouslySetInnerHTML={{__html: userContent}} />', 'import DOMPurify from "dompurify";\n<div dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(userContent)}} />', 'Always sanitize HTML with DOMPurify before using dangerouslySetInnerHTML, or avoid it entirely');
32
+ }
33
+ return null;
34
+ }
35
+ /**
36
+ * Detects missing key prop in React list rendering
37
+ *
38
+ * @param line - The code line to check
39
+ * @param lineNumber - The line number
40
+ * @param lines - All code lines (for multi-line JSX check)
41
+ * @param index - Current line index
42
+ * @param createVulnerability - Function to create vulnerability object
43
+ * @returns SecurityVulnerability if detected, null otherwise
44
+ */
45
+ function detectMissingKeyProp(line, lineNumber, lines, index, createVulnerability) {
46
+ const trimmed = line.trim();
47
+ // Only detect if map with JSX and no key= in the same line or next 2 lines
48
+ if (trimmed.match(/\.map\s*\(\s*\(?\w+\)?\s*=>\s*</) && !trimmed.includes('key=')) {
49
+ // Check next 2 lines for key prop (multi-line JSX)
50
+ const hasKeyInNextLines = (index + 1 < lines.length && lines[index + 1].includes('key=')) ||
51
+ (index + 2 < lines.length && lines[index + 2].includes('key='));
52
+ if (!hasKeyInNextLines) {
53
+ return createVulnerability('react-performance', 'Missing key prop in React list rendering', 'Add unique key prop to list items', lineNumber, 'React uses keys to identify elements in lists. Missing keys cause inefficient re-renders, potential bugs with component state, and poor performance.', '{items.map(item => <div>{item.name}</div>)} causes React to re-render all items when one changes', [
54
+ 'Performance degradation (full list re-render)',
55
+ 'Loss of component state',
56
+ 'Incorrect DOM updates',
57
+ 'Poor user experience'
58
+ ], '{items.map(item => <div>{item.name}</div>)}', '{items.map(item => <div key={item.id}>{item.name}</div>)}', 'Always use stable, unique keys (IDs) in React lists - never use array index as key');
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+ /**
64
+ * Detects unsafe href attributes with user input (XSS risk)
65
+ *
66
+ * @param line - The code line to check
67
+ * @param lineNumber - The line number
68
+ * @param createVulnerability - Function to create vulnerability object
69
+ * @returns SecurityVulnerability if detected, null otherwise
70
+ */
71
+ function detectUnsafeHref(line, lineNumber, createVulnerability) {
72
+ const trimmed = line.trim();
73
+ // Pattern 1: props., request., params., query., userInput
74
+ // Pattern 2: destructured props like {url}, {link}, {redirect}, {path}
75
+ const hasPropsPattern = trimmed.match(/href\s*=\s*{[^}]*\b(props\.|userInput|user\.|request\.|params\.|query\.)/);
76
+ const hasDestructuredParam = trimmed.match(/href\s*=\s*{\s*(url|link|redirect|path|src|href)\s*}/);
77
+ if (hasPropsPattern || hasDestructuredParam) {
78
+ // Exclude if using sanitization function or static string
79
+ const isSanitized = trimmed.match(/href\s*=\s*{\s*(sanitize|validate|safe)/i);
80
+ const isStaticUrl = trimmed.match(/href\s*=\s*"(https?:\/\/|\/)/);
81
+ if (!isSanitized && !isStaticUrl) {
82
+ return createVulnerability('xss', 'Unsafe href attribute can cause XSS via javascript: protocol', 'Sanitize URLs or use rel="noopener noreferrer"', lineNumber, 'User-controlled href attributes can execute JavaScript using javascript: or data: protocols, leading to XSS attacks.', '<a href={userInput}> where userInput = "javascript:alert(document.cookie)"', [
83
+ 'XSS via javascript: protocol',
84
+ 'Session hijacking',
85
+ 'Credential theft',
86
+ 'Phishing attacks'
87
+ ], '<a href={props.url}>Click here</a>', 'const sanitizeUrl = (url) => {\n if (url.startsWith("http://") || url.startsWith("https://")) return url;\n return "#";\n};\n<a href={sanitizeUrl(props.url)} rel="noopener noreferrer">Click here</a>', 'Validate URLs start with http:// or https://, or use a URL sanitization library');
88
+ }
89
+ }
90
+ return null;
91
+ }
92
+ /**
93
+ * Detects direct React state mutation (anti-pattern)
94
+ *
95
+ * @param line - The code line to check
96
+ * @param lineNumber - The line number
97
+ * @param createVulnerability - Function to create vulnerability object
98
+ * @returns SecurityVulnerability if detected, null otherwise
99
+ */
100
+ function detectStateMutation(line, lineNumber, createVulnerability) {
101
+ const trimmed = line.trim();
102
+ // Pattern 1: this.state.prop = value (assignment)
103
+ // Pattern 2: this.state.array.push() (mutation methods)
104
+ // Pattern 3: this.state.array[index] = value (array mutation)
105
+ const hasDirectAssignment = trimmed.match(/this\.state\.\w+\s*=(?!=)/) || trimmed.match(/\w+State\.\w+\s*=(?!=)/);
106
+ const hasMutationMethod = trimmed.match(/this\.state\.\w+\.(push|pop|shift|unshift|splice|sort|reverse)\s*\(/);
107
+ const hasArrayMutation = trimmed.match(/this\.state\.\w+\[\w+\]\s*=/);
108
+ const hasDirectMutation = hasDirectAssignment || hasMutationMethod || hasArrayMutation;
109
+ if (hasDirectMutation) {
110
+ // Exclude setState calls, comparisons, and function definitions
111
+ const isSetStateCall = trimmed.includes('setState(');
112
+ const isComparison = trimmed.includes('===') || trimmed.includes('!==');
113
+ const isFunctionDef = trimmed.includes('=>') || trimmed.match(/function\s+\w+\s*\(/);
114
+ if (!isSetStateCall && !isComparison && !isFunctionDef) {
115
+ return createVulnerability('react-state-mutation', 'Direct state mutation in React', 'Use setState() or state setter functions', lineNumber, 'Directly mutating state in React bypasses React\'s change detection, causing bugs where UI doesn\'t update even though state changed.', 'this.state.count = 5 does not trigger re-render', [
116
+ 'UI not updating (stale renders)',
117
+ 'Component state inconsistency',
118
+ 'Difficult to debug issues',
119
+ 'Broken React lifecycle'
120
+ ], 'this.state.count = this.state.count + 1;', 'this.setState({ count: this.state.count + 1 });', 'Never mutate state directly - always use setState() or state setter functions from useState()');
121
+ }
122
+ }
123
+ return null;
124
+ }
125
+ //# sourceMappingURL=react-security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-security.js","sourceRoot":"","sources":["../../../../../../../src/lib/analyzers/security-checks/react-security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import { SupportedLanguage, SecuritySeverity, ExploitLikelihood, SecurityImpact } from '../types';
2
+ export interface LineError {
3
+ line: number;
4
+ error: string;
5
+ suggestion: string;
6
+ severity: 'error' | 'warning' | 'info';
7
+ securityRelevant?: boolean;
8
+ references?: Array<{
9
+ title: string;
10
+ url: string;
11
+ description: string;
12
+ }>;
13
+ }
14
+ export interface QualityIssue {
15
+ type: 'error' | 'warning' | 'info';
16
+ message: string;
17
+ line?: number;
18
+ column?: number;
19
+ rule?: string;
20
+ severity: 'high' | 'medium' | 'low';
21
+ }
22
+ export interface SecurityVulnerability {
23
+ severity: SecuritySeverity;
24
+ message: string;
25
+ line?: number;
26
+ suggestion?: string;
27
+ category?: string;
28
+ securityRelevant?: boolean;
29
+ cvssScore?: number;
30
+ exploitLikelihood?: ExploitLikelihood;
31
+ impact?: SecurityImpact;
32
+ owasp?: string;
33
+ cwe?: string;
34
+ pciDss?: string;
35
+ attackVector?: {
36
+ description: string;
37
+ exploitExample: string;
38
+ realWorldImpact: string[];
39
+ };
40
+ remediation?: {
41
+ before: string;
42
+ after: string;
43
+ explanation: string;
44
+ };
45
+ }
46
+ export interface AnalysisMetrics {
47
+ complexity: number;
48
+ maintainability: number;
49
+ lines: number;
50
+ functions: number;
51
+ }
52
+ export interface AnalyzerResult {
53
+ syntax: {
54
+ valid: boolean;
55
+ errors: string[];
56
+ lineErrors: LineError[];
57
+ };
58
+ quality: {
59
+ score: number;
60
+ issues: QualityIssue[];
61
+ };
62
+ performance: {
63
+ score: number;
64
+ suggestions: string[];
65
+ };
66
+ security: {
67
+ vulnerabilities: SecurityVulnerability[];
68
+ };
69
+ metrics: AnalysisMetrics;
70
+ languageSpecific?: Record<string, unknown>;
71
+ }
72
+ export interface AnalyzerInput {
73
+ code: string;
74
+ filename?: string;
75
+ options?: Record<string, unknown>;
76
+ }
77
+ export interface ICodeAnalyzer {
78
+ language: SupportedLanguage;
79
+ analyze(input: AnalyzerInput): Promise<AnalyzerResult>;
80
+ validateSyntax(code: string): Promise<boolean>;
81
+ getLanguageInfo(): {
82
+ name: string;
83
+ extensions: string[];
84
+ description: string;
85
+ };
86
+ }
87
+ export interface AnalyzerFactory {
88
+ createAnalyzer(language: SupportedLanguage): ICodeAnalyzer;
89
+ getSupportedLanguages(): SupportedLanguage[];
90
+ isLanguageSupported(language: string): boolean;
91
+ }
92
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/analyzers/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../src/lib/analyzers/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * TypeScript Access Control Security Checks
3
+ * OWASP A01:2021 - Broken Access Control
4
+ *
5
+ * Detects Insecure Direct Object Reference (IDOR) vulnerabilities
6
+ * in TypeScript Express/Koa route handlers.
7
+ */
8
+ import { SecurityVulnerability } from '../../types';
9
+ /**
10
+ * Checks for broken access control vulnerabilities in TypeScript code
11
+ *
12
+ * Covers:
13
+ * - Check #85: IDOR in Express/Koa routes with :id parameters (HIGH)
14
+ *
15
+ * @param lines - Array of code lines
16
+ * @returns Array of security vulnerabilities found
17
+ */
18
+ export declare function checkAccessControl(lines: string[]): SecurityVulnerability[];
19
+ //# sourceMappingURL=access-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-control.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/typescript/security-checks/access-control.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,GACd,qBAAqB,EAAE,CAqQzB"}
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ /**
3
+ * TypeScript Access Control Security Checks
4
+ * OWASP A01:2021 - Broken Access Control
5
+ *
6
+ * Detects Insecure Direct Object Reference (IDOR) vulnerabilities
7
+ * in TypeScript Express/Koa route handlers.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.checkAccessControl = checkAccessControl;
11
+ const createVulnerability_1 = require("../utils/createVulnerability");
12
+ /**
13
+ * Checks for broken access control vulnerabilities in TypeScript code
14
+ *
15
+ * Covers:
16
+ * - Check #85: IDOR in Express/Koa routes with :id parameters (HIGH)
17
+ *
18
+ * @param lines - Array of code lines
19
+ * @returns Array of security vulnerabilities found
20
+ */
21
+ function checkAccessControl(lines) {
22
+ const vulnerabilities = [];
23
+ let inMultiLineComment = false;
24
+ lines.forEach((line, index) => {
25
+ const lineNumber = index + 1;
26
+ const trimmed = line.trim();
27
+ // Track multi-line comment blocks (/* ... */)
28
+ if (trimmed.includes('/*')) {
29
+ inMultiLineComment = true;
30
+ }
31
+ if (trimmed.includes('*/')) {
32
+ inMultiLineComment = false;
33
+ return;
34
+ }
35
+ // Skip comments and empty lines
36
+ if (!trimmed || inMultiLineComment || trimmed.startsWith('//') || trimmed.startsWith('*'))
37
+ return;
38
+ // OWASP A01:2021 - Broken Access Control
39
+ // Check #85: IDOR in route handlers - HIGH
40
+ // Pattern: app.get("/users/:id", ...) or app.post("/accounts/:accountId", ...)
41
+ // with :id, :userId, :accountId, :profileId, :orderId, :documentId parameters
42
+ const routeWithIdPattern = /(app|router)\.(get|post|put|delete|patch)\s*\(\s*["'][^"']*:(id|userId|accountId|profileId|orderId|documentId|fileId|recordId)[^"']*["']/i;
43
+ if (trimmed.match(routeWithIdPattern)) {
44
+ // Check next 15 lines for authorization checks
45
+ const nextLines = lines.slice(index, Math.min(index + 15, lines.length));
46
+ // Look for authorization patterns:
47
+ // - req.session.userId, req.user.id, req.session, req.user
48
+ // - Authorization header checks
49
+ // - Permission/role checks
50
+ // - Ownership validation (comparing req.session.userId with req.params.id)
51
+ const hasAuthCheck = nextLines.some(l => {
52
+ const lowerLine = l.toLowerCase();
53
+ return (
54
+ // Session checks
55
+ lowerLine.includes('req.session') ||
56
+ lowerLine.includes('req.user') ||
57
+ // Authorization header
58
+ lowerLine.includes('authorization') ||
59
+ lowerLine.includes('req.headers.authorization') ||
60
+ // Permission/role checks
61
+ lowerLine.includes('permission') ||
62
+ lowerLine.includes('isauthorized') ||
63
+ lowerLine.includes('hasaccess') ||
64
+ lowerLine.includes('checkaccess') ||
65
+ lowerLine.includes('role') ||
66
+ // Status code 403 (Forbidden) indicates auth check
67
+ lowerLine.includes('403') ||
68
+ lowerLine.includes('forbidden'));
69
+ });
70
+ if (!hasAuthCheck) {
71
+ vulnerabilities.push((0, createVulnerability_1.createTypeScriptSecurityVulnerability)('idor-no-authorization', 'Route accesses user-specific data without authorization check (Insecure Direct Object Reference)', 'Add authorization check: if (req.session.userId !== req.params.id) return res.status(403).json({error: "Forbidden"});', lineNumber, 'Attacker can access other users\' data by changing the ID in the URL. No ownership validation is performed, allowing any authenticated user to access any resource by guessing or iterating through IDs.', 'GET /users/123 returns user data for ID 123. Attacker changes to /users/456 and accesses another user\'s data without authorization.', [
72
+ 'Unauthorized access to sensitive user data (emails, addresses, financial info)',
73
+ 'Privacy violations and data leakage',
74
+ 'Account takeover via profile manipulation',
75
+ 'Horizontal privilege escalation (user accessing other users\' data)',
76
+ 'Compliance violations (GDPR, HIPAA, PCI-DSS)'
77
+ ], 'app.get("/users/:id", async (req, res) => {\n const user = await db.query("SELECT * FROM users WHERE id = ?", [req.params.id]);\n res.json(user); // No auth check\n});', 'app.get("/users/:id", async (req, res) => {\n if (req.session.userId !== req.params.id) {\n return res.status(403).json({ error: "Forbidden" });\n }\n const user = await db.query("SELECT * FROM users WHERE id = ?", [req.params.id]);\n res.json(user);\n});', 'Add ownership validation by comparing the authenticated user\'s ID (from session/JWT) with the requested resource ID. Return 403 Forbidden if they don\'t match.'));
78
+ }
79
+ }
80
+ // OWASP A01:2021 - Broken Access Control / A10:2025 - Mishandling Exceptional Conditions
81
+ // Check #91: Fail-Open Authentication - CRITICAL
82
+ // Pattern: if (authorized) res.send(X); else res.send(X);
83
+ // Pattern: if (isAdmin) return data; else return data;
84
+ // Detects identical responses for authorized and unauthorized paths (fail-open design)
85
+ // Look for if/else statements with authorization-related conditions
86
+ const ifStatementPattern = /if\s*\(\s*([a-zA-Z_$][a-zA-Z0-9_$]*)\s*\)/;
87
+ const ifMatch = trimmed.match(ifStatementPattern);
88
+ if (ifMatch) {
89
+ const conditionVar = ifMatch[1];
90
+ // Check if variable name suggests authorization
91
+ const authVariablePattern = /(auth|authorized|isAdmin|hasPermission|canAccess|allowed|granted|authenticated)/i;
92
+ if (conditionVar.match(authVariablePattern)) {
93
+ let ifBranch = '';
94
+ let elseBranch = '';
95
+ // Try to extract if/else branches - handle both single-line and multi-line
96
+ // Pattern 1: Single line if/else: if (x) statement; else statement;
97
+ const singleLinePattern = /if\s*\([^)]+\)\s*(.+?);\s*else\s*(.+?);/;
98
+ const singleLineMatch = trimmed.match(singleLinePattern);
99
+ if (singleLineMatch) {
100
+ ifBranch = singleLineMatch[1].trim();
101
+ elseBranch = singleLineMatch[2].trim();
102
+ }
103
+ else {
104
+ // Pattern 2: Multi-line if/else across separate lines
105
+ // Check if the if statement has its body on the same line
106
+ const ifBodyPattern = /if\s*\([^)]+\)\s*(.+)/;
107
+ const ifBodyMatch = trimmed.match(ifBodyPattern);
108
+ if (ifBodyMatch) {
109
+ ifBranch = ifBodyMatch[1].trim().replace(/;$/, '');
110
+ }
111
+ // Look for else in next few lines
112
+ const nextLines = lines.slice(index + 1, Math.min(index + 5, lines.length));
113
+ for (const nextLine of nextLines) {
114
+ const nextTrimmed = nextLine.trim();
115
+ if (nextTrimmed.startsWith('else')) {
116
+ const elseBodyPattern = /else\s+(.+)/;
117
+ const elseBodyMatch = nextTrimmed.match(elseBodyPattern);
118
+ if (elseBodyMatch) {
119
+ elseBranch = elseBodyMatch[1].trim().replace(/;$/, '');
120
+ }
121
+ break;
122
+ }
123
+ }
124
+ }
125
+ // Check if both branches are identical (fail-open)
126
+ if (ifBranch && elseBranch && ifBranch === elseBranch) {
127
+ vulnerabilities.push((0, createVulnerability_1.createTypeScriptSecurityVulnerability)('fail-open-authentication', 'Fail-open authentication - identical response for authorized and unauthorized users (complete access control bypass)', 'Fix access control logic: authorized users should get different response than unauthorized. Use early return for unauthorized: if (!authorized) return res.status(403).send("Forbidden");', lineNumber, 'Authorization check has identical code in both if and else branches, making the check completely ineffective. This is a fail-open design where authentication/authorization failures do not change behavior, allowing unauthorized access.', 'if (authorized) res.send("Dashboard"); else res.send("Dashboard"); → Any user (authorized or not) gets Dashboard → complete access control bypass', [
128
+ 'Complete access control bypass',
129
+ 'Unauthorized access to protected resources',
130
+ 'Admin panel accessible without authentication',
131
+ 'Privilege escalation',
132
+ 'Data breach (unauthorized data access)',
133
+ 'Compliance violations (SOC 2, ISO 27001, GDPR Article 32)',
134
+ 'Authorization logic rendered completely ineffective'
135
+ ], 'let authorized = false;\ntry {\n authorized = JSON.parse(req.headers.auth).role === "admin";\n} catch { }\n\nif (authorized) res.send("Dashboard");\nelse res.send("Dashboard");', 'let authorized = false;\ntry {\n authorized = JSON.parse(req.headers.auth).role === "admin";\n} catch { }\n\nif (!authorized) {\n return res.status(403).send("Forbidden");\n}\n\nres.send("Dashboard");', 'Ensure authorized and unauthorized paths have different behavior. Use early returns for unauthorized access. Fail securely: if authorization fails, deny access by default.'));
136
+ }
137
+ }
138
+ }
139
+ // OWASP A01:2025 - Broken Access Control - Phase 7B Day 11
140
+ // Check #92: Missing authentication middleware - HIGH
141
+ // Pattern: app.get/post/put/delete/patch routes without authentication
142
+ const routePattern = /(app|router)\.(get|post|put|delete|patch)\s*\(\s*['"`]\/api\//i;
143
+ const nextApiPattern = /export\s+default\s+(?:async\s+)?function\s+handler\s*\(/i;
144
+ if (trimmed.match(routePattern) || trimmed.match(nextApiPattern)) {
145
+ // Check if route has authentication middleware
146
+ const hasMiddleware = trimmed.includes('authenticate') ||
147
+ trimmed.includes('authMiddleware') ||
148
+ trimmed.includes('requireAuth') ||
149
+ trimmed.includes('isAuthenticated') ||
150
+ trimmed.includes('verifyToken') ||
151
+ trimmed.includes('checkAuth');
152
+ // Check next 15 lines for inline authentication check
153
+ const nextLines = lines.slice(index, Math.min(index + 15, lines.length));
154
+ const hasInlineAuthCheck = nextLines.some(l => {
155
+ const lowerLine = l.toLowerCase();
156
+ return (
157
+ // Check for !req.user or !req.session with 401/unauthorized
158
+ ((lowerLine.includes('!req.user') || lowerLine.includes('!req.session')) &&
159
+ (lowerLine.includes('401') || lowerLine.includes('unauthorized'))) ||
160
+ // Check for req.headers.authorization
161
+ lowerLine.includes('req.headers.authorization') ||
162
+ // Check for JWT verification
163
+ lowerLine.includes('verifytoken') ||
164
+ lowerLine.includes('jwt.verify') ||
165
+ // Check for req.user or req.session existence checks
166
+ (lowerLine.includes('if') && (lowerLine.includes('req.user') || lowerLine.includes('req.session'))));
167
+ });
168
+ if (!hasMiddleware && !hasInlineAuthCheck) {
169
+ vulnerabilities.push((0, createVulnerability_1.createTypeScriptSecurityVulnerability)('missing-authentication-middleware', 'API route missing authentication - allows unauthenticated access to protected resources', 'Add authentication middleware: app.get("/api/users", authenticate, handler) or check req.user in handler', lineNumber, 'API endpoints without authentication allow any user (including attackers) to access protected resources. This is a critical access control failure.', 'app.get("/api/users", (req, res) => res.json(users)); → Anyone can access /api/users without logging in', [
170
+ 'Unauthorized access to sensitive data',
171
+ 'Data breach from unauthenticated API access',
172
+ 'Account enumeration and information disclosure',
173
+ 'Business logic bypass',
174
+ 'Compliance violations (SOC 2, ISO 27001, GDPR)'
175
+ ], 'app.get("/api/users", (req, res) => {\n res.json(users); // No auth\n});', 'app.get("/api/users", authenticate, (req, res) => {\n res.json(users); // Protected\n});', 'All API routes accessing sensitive data must require authentication via middleware or inline checks'));
176
+ }
177
+ }
178
+ // OWASP A01:2025 - Broken Access Control - Phase 7B Day 11
179
+ // Check #93: Client-side only authorization - HIGH
180
+ // Pattern: Authorization checks in client-side TypeScript (browser code)
181
+ const clientSideAuthPattern = /(if|&&|\|\|)\s*\(\s*(userRole|user\.role|user\.isAdmin|isAdmin|currentUser\.role)/i;
182
+ const uiTogglePattern = /\.style\.display\s*=|\.hidden\s*=|\.classList\.(add|remove|toggle)/i;
183
+ if (trimmed.match(clientSideAuthPattern)) {
184
+ // Check if this is followed by API call or UI toggle (client-side behavior)
185
+ const nextLines = lines.slice(index, Math.min(index + 5, lines.length));
186
+ const hasClientSideBehavior = nextLines.some(l => l.includes('fetch(') ||
187
+ l.includes('axios.') ||
188
+ l.match(uiTogglePattern) ||
189
+ l.includes('getElementById') ||
190
+ l.includes('querySelector'));
191
+ // Make sure this is NOT a server-side check (no req.user or res.status)
192
+ const isServerSide = nextLines.some(l => l.includes('req.user') ||
193
+ l.includes('res.status(403)') ||
194
+ l.includes('res.status(401)') ||
195
+ l.includes('return res.'));
196
+ if (hasClientSideBehavior && !isServerSide) {
197
+ vulnerabilities.push((0, createVulnerability_1.createTypeScriptSecurityVulnerability)('client-side-authorization', 'Authorization enforced only on client-side - can be bypassed by manipulating JavaScript', 'Move authorization logic to server-side: Validate user role in API endpoint, not in browser code', lineNumber, 'Client-side authorization can be easily bypassed by modifying JavaScript in browser DevTools or using direct API calls. Attackers can access admin features by changing local variables.', 'if (userRole === "admin") fetch("/api/admin/delete") → Attacker opens DevTools, sets userRole="admin", bypasses check', [
198
+ 'Complete authorization bypass via DevTools manipulation',
199
+ 'Privilege escalation (user → admin)',
200
+ 'Unauthorized access to admin features',
201
+ 'Data manipulation and deletion',
202
+ 'Business logic bypass',
203
+ 'False sense of security (UI hiding is not access control)'
204
+ ], 'if (userRole === "admin") {\n fetch("/api/admin/delete", { method: "POST" });\n}', 'fetch("/api/admin/delete", { method: "POST" }); // Server validates role\n\n// Server-side:\napp.post("/api/admin/delete", (req, res) => {\n if (req.user.role !== "admin") return res.status(403).send("Forbidden");\n // Perform delete\n});', 'Never rely on client-side checks for authorization. Always validate user permissions on the server before performing sensitive operations.'));
205
+ }
206
+ }
207
+ });
208
+ return vulnerabilities;
209
+ }
210
+ //# sourceMappingURL=access-control.js.map