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,120 @@
1
+ "use strict";
2
+ /**
3
+ * Python Exception Handling Security Checks
4
+ * OWASP A10:2025 - Mishandling of Exceptional Conditions
5
+ *
6
+ * Detects improper exception handling that can lead to security vulnerabilities.
7
+ * This is a completely NEW category in OWASP 2025.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.checkExceptionHandling = checkExceptionHandling;
11
+ const createVulnerability_1 = require("../utils/createVulnerability");
12
+ /**
13
+ * Checks for exception handling security vulnerabilities in Python code
14
+ *
15
+ * Covers:
16
+ * - Check #1: Bare except clauses (HIGH)
17
+ * - Check #2: Exception details exposed in responses (HIGH)
18
+ * - Check #3: Silent exception suppression (MEDIUM)
19
+ * - Check #4: Resource cleanup missing in exceptions (MEDIUM)
20
+ * - Check #5: Incorrect exception handling patterns (MEDIUM)
21
+ *
22
+ * @param lines - Array of code lines
23
+ * @returns Array of security vulnerabilities found
24
+ */
25
+ function checkExceptionHandling(lines) {
26
+ const vulnerabilities = [];
27
+ let inMultiLineComment = false;
28
+ lines.forEach((line, index) => {
29
+ const trimmedLine = line.trim();
30
+ // CRITICAL: Track Python triple-quote comment blocks (""" ... """ or ''' ... ''')
31
+ const hasTripleQuote = trimmedLine.includes('"""') || trimmedLine.includes("'''");
32
+ if (hasTripleQuote) {
33
+ if (!inMultiLineComment) {
34
+ // Start of multi-line comment
35
+ inMultiLineComment = true;
36
+ // Check if it closes on the same line (single-line docstring)
37
+ const tripleQuoteCount = (trimmedLine.match(/"""/g) || []).length + (trimmedLine.match(/'''/g) || []).length;
38
+ if (tripleQuoteCount >= 2) {
39
+ // Opens and closes on same line, reset flag
40
+ inMultiLineComment = false;
41
+ }
42
+ return; // Skip this line
43
+ }
44
+ else {
45
+ // End of multi-line comment
46
+ inMultiLineComment = false;
47
+ return; // Skip this line
48
+ }
49
+ }
50
+ // CRITICAL: Skip all lines inside multi-line comments and single-line comments
51
+ if (!trimmedLine ||
52
+ inMultiLineComment ||
53
+ trimmedLine.startsWith('#')) {
54
+ return;
55
+ }
56
+ const lowerLine = trimmedLine.toLowerCase();
57
+ // Check #1: Bare except clauses
58
+ if (lowerLine.includes('except:') || lowerLine === 'except') {
59
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('bare-except-clause', 'Bare except clause catches all exceptions including system exits', 'Catch specific exception types instead of using bare except', index + 1, 'Bare except clauses can mask security-critical exceptions and prevent proper error handling', 'try:\n risky_operation()\nexcept:\n pass # catches SystemExit, KeyboardInterrupt, etc.', [
60
+ 'Security exceptions masked and ignored',
61
+ 'System exit and keyboard interrupt prevention',
62
+ 'Debugging difficulties from hidden errors',
63
+ 'Potential for silent security failures'
64
+ ], 'except:', 'except ValueError as e:', 'Bare except clauses catch all exceptions including system-level ones that should not be suppressed'));
65
+ }
66
+ // Check #2: Exception details exposed in HTTP responses
67
+ if ((lowerLine.includes('return') || lowerLine.includes('response') ||
68
+ lowerLine.includes('jsonify') || lowerLine.includes('render_template')) &&
69
+ (lowerLine.includes('str(e)') || lowerLine.includes('str(ex)') ||
70
+ lowerLine.includes('exception') || lowerLine.includes('traceback'))) {
71
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('exception-details-exposed', 'Exception details may be exposed in HTTP responses', 'Log detailed errors server-side, return generic messages to clients', index + 1, 'Exposing exception details reveals sensitive internal application information', 'return jsonify({"error": str(e)}) # exposes full exception details to client', [
72
+ 'Internal application structure exposure',
73
+ 'File paths and system information disclosure',
74
+ 'Database schema and connection details revelation',
75
+ 'Third-party service configuration exposure'
76
+ ], 'return str(exception)', 'logger.error("Operation failed", exc_info=True); return "Internal server error"', 'Exception details contain sensitive debugging information that should not be exposed to clients'));
77
+ }
78
+ // Check #3: Silent exception suppression with pass
79
+ if (lowerLine.includes('except') &&
80
+ lines.slice(index + 1, Math.min(index + 3, lines.length)).some(nextLine => nextLine.trim().toLowerCase() === 'pass')) {
81
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('silent-exception-suppression', 'Exception caught and silently ignored with pass statement', 'Add proper error handling, logging, or re-raise the exception', index + 1, 'Silent exception suppression can hide security vulnerabilities and cause unpredictable behavior', 'except Exception:\n pass # security errors completely ignored', [
82
+ 'Security vulnerabilities hidden from detection',
83
+ 'Authentication and authorization bypasses',
84
+ 'Data integrity issues from ignored validation errors',
85
+ 'Audit trail gaps from suppressed security events'
86
+ ], 'except Exception:\n pass', 'except Exception as e:\n logger.warning("Operation failed, using fallback", exc_info=True)\n return fallback_value', 'Silent exception suppression prevents visibility into potentially security-critical failures'));
87
+ }
88
+ // Check #4: Resource cleanup missing in exception scenarios
89
+ if ((lowerLine.includes('open(') || lowerLine.includes('connect(') ||
90
+ lowerLine.includes('socket(') || lowerLine.includes('urlopen(')) &&
91
+ !lines.slice(index, Math.min(index + 10, lines.length)).some(nextLine => nextLine.toLowerCase().includes('finally:') ||
92
+ nextLine.toLowerCase().includes('with ') ||
93
+ nextLine.toLowerCase().includes('.close()'))) {
94
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('missing-resource-cleanup', 'Resource may not be properly cleaned up in exception scenarios', 'Use with statements or try-finally blocks to ensure resource cleanup', index + 1, 'Improper resource cleanup during exceptions can lead to resource leaks and denial of service', 'file = open("sensitive.txt"); data = file.read() # no finally or with statement', [
95
+ 'Memory leaks from unclosed file handles',
96
+ 'Connection pool exhaustion',
97
+ 'Database connection leaks',
98
+ 'Denial of service from resource exhaustion'
99
+ ], 'file = open("data.txt")', 'with open("data.txt") as file:\n # operations here', 'Resources opened without guaranteed cleanup can cause leaks when exceptions occur'));
100
+ }
101
+ // Check #5: Incorrect exception handling patterns
102
+ if (lowerLine.includes('except') && lowerLine.includes(':')) {
103
+ // Check if continue or break appears in the next few lines (exception handler body)
104
+ const hasContinueOrBreak = lines.slice(index + 1, Math.min(index + 4, lines.length)).some(nextLine => {
105
+ const nextTrimmed = nextLine.trim().toLowerCase();
106
+ return nextTrimmed.startsWith('continue') || nextTrimmed.startsWith('break');
107
+ });
108
+ if (hasContinueOrBreak) {
109
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('incorrect-exception-pattern', 'Exception handling with continue/break may mask important errors', 'Handle exceptions appropriately instead of using flow control statements', index + 1, 'Using continue/break in exception handlers can mask security-critical errors', 'for item in items:\n try:\n process(item)\n except SecurityError:\n continue # security error ignored', [
110
+ 'Security exceptions bypassed in loops',
111
+ 'Incomplete processing of security-sensitive data',
112
+ 'Error accumulation leading to system instability',
113
+ 'Missing security validations in batch operations'
114
+ ], 'except Exception:\n continue', 'except Exception as e:\n logger.error("Item processing failed", exc_info=True)\n # decide appropriate action based on error type', 'Flow control in exception handlers can hide important security errors that require attention'));
115
+ }
116
+ }
117
+ });
118
+ return vulnerabilities;
119
+ }
120
+ //# sourceMappingURL=exception-handling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exception-handling.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/exception-handling.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAkBH,wDA+KC;AA9LD,sEAAiF;AAEjF;;;;;;;;;;;;GAYG;AACH,SAAgB,sBAAsB,CACpC,KAAe;IAEf,MAAM,eAAe,GAA4B,EAAE,CAAC;IACpD,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAE/B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAEhC,kFAAkF;QAClF,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAElF,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,8BAA8B;gBAC9B,kBAAkB,GAAG,IAAI,CAAC;gBAC1B,8DAA8D;gBAC9D,MAAM,gBAAgB,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBAC7G,IAAI,gBAAgB,IAAI,CAAC,EAAE,CAAC;oBAC1B,4CAA4C;oBAC5C,kBAAkB,GAAG,KAAK,CAAC;gBAC7B,CAAC;gBACD,OAAO,CAAC,iBAAiB;YAC3B,CAAC;iBAAM,CAAC;gBACN,4BAA4B;gBAC5B,kBAAkB,GAAG,KAAK,CAAC;gBAC3B,OAAO,CAAC,iBAAiB;YAC3B,CAAC;QACH,CAAC;QAED,+EAA+E;QAC/E,IAAI,CAAC,WAAW;YACZ,kBAAkB;YAClB,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;QAE5C,gCAAgC;QAChC,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC5D,eAAe,CAAC,IAAI,CAClB,IAAA,uDAAiC,EAC/B,oBAAoB,EACpB,kEAAkE,EAClE,6DAA6D,EAC7D,KAAK,GAAG,CAAC,EACT,6FAA6F,EAC7F,+FAA+F,EAC/F;gBACE,wCAAwC;gBACxC,+CAA+C;gBAC/C,2CAA2C;gBAC3C,wCAAwC;aACzC,EACD,SAAS,EACT,yBAAyB,EACzB,oGAAoG,CACrG,CACF,CAAC;QACJ,CAAC;QAED,wDAAwD;QACxD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC9D,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YACxE,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAC7D,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;YACzE,eAAe,CAAC,IAAI,CAClB,IAAA,uDAAiC,EAC/B,2BAA2B,EAC3B,oDAAoD,EACpD,qEAAqE,EACrE,KAAK,GAAG,CAAC,EACT,+EAA+E,EAC/E,8EAA8E,EAC9E;gBACE,yCAAyC;gBACzC,8CAA8C;gBAC9C,mDAAmD;gBACnD,4CAA4C;aAC7C,EACD,uBAAuB,EACvB,iFAAiF,EACjF,iGAAiG,CAClG,CACF,CAAC;QACJ,CAAC;QAED,mDAAmD;QACnD,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC5B,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CACxE,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC;YAChD,eAAe,CAAC,IAAI,CAClB,IAAA,uDAAiC,EAC/B,8BAA8B,EAC9B,2DAA2D,EAC3D,+DAA+D,EAC/D,KAAK,GAAG,CAAC,EACT,iGAAiG,EACjG,mEAAmE,EACnE;gBACE,gDAAgD;gBAChD,2CAA2C;gBAC3C,sDAAsD;gBACtD,kDAAkD;aACnD,EACD,6BAA6B,EAC7B,0HAA0H,EAC1H,8FAA8F,CAC/F,CACF,CAAC;QACJ,CAAC;QAED,4DAA4D;QAC5D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC7D,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACjE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CACtE,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC3C,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACxC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YACnD,eAAe,CAAC,IAAI,CAClB,IAAA,uDAAiC,EAC/B,0BAA0B,EAC1B,gEAAgE,EAChE,sEAAsE,EACtE,KAAK,GAAG,CAAC,EACT,8FAA8F,EAC9F,iFAAiF,EACjF;gBACE,yCAAyC;gBACzC,4BAA4B;gBAC5B,2BAA2B;gBAC3B,4CAA4C;aAC7C,EACD,yBAAyB,EACzB,uDAAuD,EACvD,mFAAmF,CACpF,CACF,CAAC;QACJ,CAAC;QAED,kDAAkD;QAClD,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5D,oFAAoF;YACpF,MAAM,kBAAkB,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;gBACnG,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAClD,OAAO,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC/E,CAAC,CAAC,CAAC;YAEH,IAAI,kBAAkB,EAAE,CAAC;gBACvB,eAAe,CAAC,IAAI,CAClB,IAAA,uDAAiC,EAC/B,6BAA6B,EAC7B,kEAAkE,EAClE,0EAA0E,EAC1E,KAAK,GAAG,CAAC,EACT,8EAA8E,EAC9E,4HAA4H,EAC5H;oBACE,uCAAuC;oBACvC,kDAAkD;oBACpD,kDAAkD;oBAClD,kDAAkD;iBACnD,EACD,iCAAiC,EACjC,wIAAwI,EACxI,8FAA8F,CAC/F,CACA,CAAC;YACJ,CAAC;QACH,CAAC;IAEH,CAAC,CAAC,CAAC;IAEH,OAAO,eAAe,CAAC;AACzB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Flask Framework Security Checks
3
+ * OWASP A01:2021 - Broken Access Control, A02:2021 - Cryptographic Failures, A03:2021 - Injection
4
+ *
5
+ * Detects Flask-specific security vulnerabilities including debug mode exposure,
6
+ * CSRF protection issues, template injection, and weak cryptographic keys.
7
+ */
8
+ import { SecurityVulnerability } from '../../types';
9
+ /**
10
+ * Checks for Flask framework security vulnerabilities
11
+ *
12
+ * Covers:
13
+ * - Check #28: Debug mode enabled (CRITICAL) - Remote code execution risk
14
+ * - Check #29: Missing CSRF protection (HIGH) - CSRF vulnerability
15
+ * - Check #30: render_template_string() with user input (CRITICAL) - SSTI
16
+ * - Markup() with user input (HIGH) - XSS vulnerability (data flow tracked)
17
+ * - Check #31: Weak SECRET_KEY (HIGH) - Session security weakness
18
+ *
19
+ * @param lines - Array of code lines
20
+ * @param userInputVariables - Map of variable names assigned from user input
21
+ * @returns Array of security vulnerabilities found
22
+ */
23
+ export declare function checkFlaskSecurity(lines: string[], userInputVariables: Map<string, number>): SecurityVulnerability[];
24
+ //# sourceMappingURL=flask-security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flask-security.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/flask-security.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,qBAAqB,EAAE,CA0LzB"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ /**
3
+ * Flask Framework Security Checks
4
+ * OWASP A01:2021 - Broken Access Control, A02:2021 - Cryptographic Failures, A03:2021 - Injection
5
+ *
6
+ * Detects Flask-specific security vulnerabilities including debug mode exposure,
7
+ * CSRF protection issues, template injection, and weak cryptographic keys.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.checkFlaskSecurity = checkFlaskSecurity;
11
+ const createVulnerability_1 = require("../utils/createVulnerability");
12
+ /**
13
+ * Checks for Flask framework security vulnerabilities
14
+ *
15
+ * Covers:
16
+ * - Check #28: Debug mode enabled (CRITICAL) - Remote code execution risk
17
+ * - Check #29: Missing CSRF protection (HIGH) - CSRF vulnerability
18
+ * - Check #30: render_template_string() with user input (CRITICAL) - SSTI
19
+ * - Markup() with user input (HIGH) - XSS vulnerability (data flow tracked)
20
+ * - Check #31: Weak SECRET_KEY (HIGH) - Session security weakness
21
+ *
22
+ * @param lines - Array of code lines
23
+ * @param userInputVariables - Map of variable names assigned from user input
24
+ * @returns Array of security vulnerabilities found
25
+ */
26
+ function checkFlaskSecurity(lines, userInputVariables) {
27
+ const vulnerabilities = [];
28
+ let inMultiLineComment = false;
29
+ lines.forEach((line, index) => {
30
+ const lineNumber = index + 1;
31
+ const trimmed = line.trim();
32
+ // CRITICAL: Track Python triple-quote comment blocks (""" ... """ or ''' ... ''')
33
+ const hasTripleQuote = trimmed.includes('"""') || trimmed.includes("'''");
34
+ if (hasTripleQuote) {
35
+ if (!inMultiLineComment) {
36
+ // Start of multi-line comment
37
+ inMultiLineComment = true;
38
+ // Check if it closes on the same line (single-line docstring)
39
+ const tripleQuoteCount = (trimmed.match(/"""/g) || []).length + (trimmed.match(/'''/g) || []).length;
40
+ if (tripleQuoteCount >= 2) {
41
+ // Opens and closes on same line, reset flag
42
+ inMultiLineComment = false;
43
+ }
44
+ return; // Skip this line
45
+ }
46
+ else {
47
+ // End of multi-line comment
48
+ inMultiLineComment = false;
49
+ return; // Skip this line
50
+ }
51
+ }
52
+ // CRITICAL: Skip all lines inside multi-line comments and single-line comments
53
+ if (!trimmed ||
54
+ inMultiLineComment ||
55
+ trimmed.startsWith('#')) {
56
+ return;
57
+ }
58
+ // 28. Flask Debug Mode - CRITICAL (remote code execution)
59
+ if (trimmed.match(/app\.run\s*\([^)]*debug\s*=\s*True/)) {
60
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('flask-debug-mode', 'Flask debug mode enabled allows remote code execution', 'Set debug=False in production or remove debug parameter', lineNumber, 'Running Flask with debug=True in production enables the interactive debugger, allowing anyone with access to error pages to execute arbitrary Python code on the server via the debug console.', 'app.run(debug=True) # Attacker gets interactive Python shell on any error page', [
61
+ 'Remote code execution (RCE)',
62
+ 'Full server compromise',
63
+ 'Information disclosure (source code, env vars)',
64
+ 'Arbitrary file read/write',
65
+ 'Critical security bypass'
66
+ ], 'app.run(debug=True, host="0.0.0.0")', 'import os\\nDEBUG = os.environ.get("FLASK_DEBUG", "False") == "True"\\napp.run(debug=DEBUG) # Or simply: app.run() (debug=False by default)', 'NEVER use debug=True in production. The Werkzeug debugger allows code execution'));
67
+ }
68
+ // 29. Flask Missing CSRF Protection - HIGH
69
+ // Only flag when Flask app is instantiated, not on import statement
70
+ if (trimmed.includes('Flask(__name__)') || trimmed.includes('app = Flask(')) {
71
+ // Check if CSRFProtect is imported/used in the file (skip comments)
72
+ const hasCSRF = lines.some(line => {
73
+ const lineTrimmed = line.trim();
74
+ return !lineTrimmed.startsWith('#') && (lineTrimmed.includes('CSRFProtect') || lineTrimmed.includes('flask_wtf') || lineTrimmed.includes('flask-wtf'));
75
+ });
76
+ if (!hasCSRF) {
77
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('flask-missing-csrf', 'Flask application missing CSRF protection', 'Install flask-wtf and enable CSRFProtect for all forms', lineNumber, 'Flask does not include CSRF protection by default. Without flask-wtf\'s CSRFProtect, forms are vulnerable to Cross-Site Request Forgery attacks.', 'app = Flask(__name__) # No CSRF protection → Forms vulnerable to CSRF', [
78
+ 'Cross-Site Request Forgery (CSRF)',
79
+ 'Unauthorized state changes',
80
+ 'Account takeover',
81
+ 'Data manipulation',
82
+ 'Form submission forgery'
83
+ ], 'from flask import Flask\\napp = Flask(__name__)', 'from flask import Flask\\nfrom flask_wtf.csrf import CSRFProtect\\n\\napp = Flask(__name__)\\napp.config["SECRET_KEY"] = os.environ.get("SECRET_KEY")\\ncsrf = CSRFProtect(app) # Enable CSRF protection', 'Always use flask-wtf CSRFProtect. Include {{ csrf_token() }} in all forms'));
84
+ }
85
+ }
86
+ // 30. Flask Unsafe Template Rendering - CRITICAL (SSTI)
87
+ if (trimmed.includes('render_template_string(') && (trimmed.includes('request.') || trimmed.includes('user_') || trimmed.includes('input'))) {
88
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('flask-ssti', 'render_template_string() with user input allows Server-Side Template Injection', 'Use render_template() with separate template files, never render user input', lineNumber, 'Flask\'s render_template_string() with user input allows Server-Side Template Injection (SSTI). Attackers can execute arbitrary Python code by injecting Jinja2 template expressions.', 'render_template_string(request.args.get("template")) # {{ config.__class__.__init__.__globals__[\'os\'].popen(\'ls\').read() }}', [
89
+ 'Server-Side Template Injection (SSTI)',
90
+ 'Remote code execution (RCE)',
91
+ 'Full server compromise',
92
+ 'Information disclosure',
93
+ 'File system access'
94
+ ], 'html = render_template_string(user_template)', 'from flask import render_template\\n# Use separate template files\\nhtml = render_template("page.html", user_data=user_input)\\n# Template: {{ user_data }} (auto-escaped)', 'Never use render_template_string() with user input. Use render_template() with files'));
95
+ }
96
+ // Flask Markup() XSS (with data flow analysis)
97
+ // PHASE 6 FIX (2025-11-22): Added data flow tracking for variables
98
+ if (trimmed.includes('Markup(')) {
99
+ // Check 1: Direct user input on same line
100
+ const hasDirectUserInput = trimmed.includes('request.') || trimmed.includes('user_') || trimmed.includes('input');
101
+ // Check 2: Using ANY tracked user input variable in the Markup() call
102
+ let usesUserInputVar = false;
103
+ for (const [varName] of userInputVariables) {
104
+ // Check if the variable name appears in the Markup() call (with word boundaries)
105
+ const varRegex = new RegExp(`\\b${varName}\\b`);
106
+ if (varRegex.test(trimmed)) {
107
+ usesUserInputVar = true;
108
+ break;
109
+ }
110
+ }
111
+ if (hasDirectUserInput || usesUserInputVar) {
112
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('flask-markup-xss', 'Markup() with user input bypasses XSS protection', 'Use Flask template auto-escaping instead of Markup()', lineNumber, 'Flask\'s Markup() function marks strings as safe HTML, bypassing auto-escaping. When used with user input, it allows XSS attacks.', 'html = Markup(f"<p>{comment}</p>") # Where comment = request.args.get("text") → XSS!', [
113
+ 'Cross-Site Scripting (XSS)',
114
+ 'Session hijacking',
115
+ 'Credential theft',
116
+ 'Malicious script injection',
117
+ 'Client-side code execution'
118
+ ], 'from markupsafe import Markup\\nhtml = Markup(user_input)', 'from markupsafe import escape\\n# Let Jinja2 auto-escape in templates\\nhtml = escape(user_input)\\n# Or in template: {{ user_input }} (auto-escaped)', 'Never use Markup() with user input. Use Jinja2 auto-escaping in templates'));
119
+ }
120
+ }
121
+ // 31. Flask Weak SECRET_KEY - HIGH (session security)
122
+ if (trimmed.match(/app\.config\[['"](SECRET_KEY|secret_key)['"]\]\s*=\s*['"]/)) {
123
+ const secretKeyMatch = trimmed.match(/app\.config\[['"](SECRET_KEY|secret_key)['"]\]\s*=\s*['"]([^'"]+)['"]/);
124
+ if (secretKeyMatch) {
125
+ const secretKey = secretKeyMatch[2];
126
+ const isWeak = secretKey.length < 32 ||
127
+ /^(secret|flask|12345|password|key|test|abc|demo)/i.test(secretKey) ||
128
+ secretKey === 'your-secret-key-here';
129
+ if (isWeak) {
130
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('flask-weak-secret-key', 'Flask SECRET_KEY is weak or hardcoded', 'Generate a strong random SECRET_KEY and store in environment variables', lineNumber, 'Flask\'s SECRET_KEY is used to cryptographically sign session cookies. A weak or hardcoded key allows attackers to forge session cookies and impersonate any user.', 'app.config["SECRET_KEY"] = "123" # Attacker can forge cookies to become admin', [
131
+ 'Session forgery',
132
+ 'Cookie tampering',
133
+ 'Authentication bypass',
134
+ 'Account takeover',
135
+ 'Privilege escalation'
136
+ ], 'app.config["SECRET_KEY"] = "flask-secret"', 'import os\\nimport secrets\\n\\nSECRET_KEY = os.environ.get("FLASK_SECRET_KEY")\\nif not SECRET_KEY:\\n raise ValueError("FLASK_SECRET_KEY environment variable not set")\\napp.config["SECRET_KEY"] = SECRET_KEY\\n# Generate with: python -c \'import secrets; print(secrets.token_hex(32))\'', 'Generate strong key: secrets.token_hex(32). Never hardcode. Use environment variables'));
137
+ }
138
+ }
139
+ }
140
+ });
141
+ return vulnerabilities;
142
+ }
143
+ //# sourceMappingURL=flask-security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flask-security.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/flask-security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Python Injection Attack Security Checks
3
+ * OWASP A03:2021 - Injection
4
+ *
5
+ * Detects code injection, SQL injection, and command injection vulnerabilities
6
+ * in Python code. These are among the most critical security risks.
7
+ */
8
+ import { SecurityVulnerability } from '../../types';
9
+ /**
10
+ * Checks for injection attack vulnerabilities in Python code
11
+ *
12
+ * Covers:
13
+ * - Check #1: eval() usage (CRITICAL)
14
+ * - Check #2: exec() usage (CRITICAL)
15
+ * - Check #3: compile() usage (HIGH)
16
+ * - Check #4: SQL Injection - Inline interpolation (CRITICAL)
17
+ * - Check #4b: SQL Injection - Data flow tracking (CRITICAL)
18
+ * - Check #5: Command Injection (CRITICAL)
19
+ * - Check #5b: subprocess.Popen without shell=False (HIGH)
20
+ * - Check #6: shell=True in subprocess (HIGH)
21
+ * - Check #6b: subprocess.Popen with shell=True (HIGH)
22
+ *
23
+ * @param lines - Array of code lines
24
+ * @param unsafeSqlVariables - Map of variable names with unsafe SQL string formatting
25
+ * @returns Array of security vulnerabilities found
26
+ */
27
+ export declare function checkInjectionAttacks(lines: string[], unsafeSqlVariables: Map<string, number>): SecurityVulnerability[];
28
+ //# sourceMappingURL=injection-attacks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection-attacks.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/injection-attacks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EAAE,EACf,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,qBAAqB,EAAE,CAmQzB"}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ /**
3
+ * Python Injection Attack Security Checks
4
+ * OWASP A03:2021 - Injection
5
+ *
6
+ * Detects code injection, SQL injection, and command injection vulnerabilities
7
+ * in Python code. These are among the most critical security risks.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.checkInjectionAttacks = checkInjectionAttacks;
11
+ const createVulnerability_1 = require("../utils/createVulnerability");
12
+ /**
13
+ * Checks for injection attack vulnerabilities in Python code
14
+ *
15
+ * Covers:
16
+ * - Check #1: eval() usage (CRITICAL)
17
+ * - Check #2: exec() usage (CRITICAL)
18
+ * - Check #3: compile() usage (HIGH)
19
+ * - Check #4: SQL Injection - Inline interpolation (CRITICAL)
20
+ * - Check #4b: SQL Injection - Data flow tracking (CRITICAL)
21
+ * - Check #5: Command Injection (CRITICAL)
22
+ * - Check #5b: subprocess.Popen without shell=False (HIGH)
23
+ * - Check #6: shell=True in subprocess (HIGH)
24
+ * - Check #6b: subprocess.Popen with shell=True (HIGH)
25
+ *
26
+ * @param lines - Array of code lines
27
+ * @param unsafeSqlVariables - Map of variable names with unsafe SQL string formatting
28
+ * @returns Array of security vulnerabilities found
29
+ */
30
+ function checkInjectionAttacks(lines, unsafeSqlVariables) {
31
+ const vulnerabilities = [];
32
+ let inMultiLineComment = false;
33
+ lines.forEach((line, index) => {
34
+ const lineNumber = index + 1;
35
+ const trimmed = line.trim();
36
+ // CRITICAL: Track Python triple-quote comment blocks (""" ... """ or ''' ... ''')
37
+ const hasTripleQuote = trimmed.includes('"""') || trimmed.includes("'''");
38
+ if (hasTripleQuote) {
39
+ if (!inMultiLineComment) {
40
+ inMultiLineComment = true;
41
+ const tripleQuoteCount = (trimmed.match(/"""/g) || []).length + (trimmed.match(/'''/g) || []).length;
42
+ if (tripleQuoteCount >= 2) {
43
+ inMultiLineComment = false;
44
+ }
45
+ return;
46
+ }
47
+ else {
48
+ inMultiLineComment = false;
49
+ return;
50
+ }
51
+ }
52
+ // CRITICAL: Skip all lines inside multi-line comments and single-line comments
53
+ if (!trimmed || inMultiLineComment || trimmed.startsWith('#')) {
54
+ return;
55
+ }
56
+ // OWASP A03:2021 - Injection
57
+ // 1. eval() - CRITICAL
58
+ if (trimmed.includes('eval(')) {
59
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('eval-usage', 'eval() allows arbitrary code execution', 'Use ast.literal_eval() for safe data or json.loads() for JSON', lineNumber, 'Python\'s eval() executes arbitrary Python expressions, allowing attackers to execute any code if user input reaches eval().', 'eval(user_input) where user_input = "__import__(\'os\').system(\'rm -rf /\')"', [
60
+ 'Remote Code Execution (RCE)',
61
+ 'Complete system compromise',
62
+ 'Data theft and exfiltration',
63
+ 'File system access'
64
+ ], 'result = eval(user_input)', 'import ast\nresult = ast.literal_eval(user_input) # Safe for literals only\n# Or: import json; result = json.loads(user_input)', 'Use ast.literal_eval() for Python literals or json.loads() for JSON. Never use eval() with untrusted input'));
65
+ }
66
+ // 2. exec() - CRITICAL
67
+ if (trimmed.includes('exec(')) {
68
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('eval-usage', 'exec() allows arbitrary code execution', 'Redesign code to avoid dynamic execution entirely', lineNumber, 'exec() executes arbitrary Python code, including statements and function definitions, making it even more dangerous than eval().', 'exec(user_code) where user_code = "import subprocess; subprocess.run([\'rm\', \'-rf\', \'/\'])"', [
69
+ 'Remote Code Execution (RCE)',
70
+ 'Full system access',
71
+ 'Data manipulation',
72
+ 'Privilege escalation'
73
+ ], 'exec(dynamic_code)', '# Refactor to avoid dynamic code execution\n# Use configuration files, function mappings, or plugins instead', 'exec() should never be used with untrusted input. Redesign architecture to eliminate need for dynamic code execution'));
74
+ }
75
+ // 3. compile() - HIGH
76
+ if (trimmed.includes('compile(')) {
77
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('eval-usage', 'compile() can execute arbitrary code', 'Avoid compile() with untrusted input, validate strictly if required', lineNumber, 'compile() creates code objects that can be executed with exec(), providing another vector for code injection.', 'code = compile(user_input, "<string>", "exec"); exec(code)', [
78
+ 'Code injection',
79
+ 'Remote code execution',
80
+ 'Bypass of security controls'
81
+ ], 'code_obj = compile(source, "<string>", "exec")', '# Avoid entirely or implement strict sandboxing\n# Consider using RestrictedPython for sandboxed execution', 'Avoid compile() with untrusted input. If absolutely necessary, use sandboxing libraries like RestrictedPython'));
82
+ }
83
+ // 4. SQL Injection - CRITICAL
84
+ // Pattern 1: Inline string interpolation in execute()
85
+ if (trimmed.match(/execute\s*\(\s*[f"'].*%.*[f"']/) ||
86
+ trimmed.match(/execute\s*\(\s*[f"'].*\+.*[f"']/) ||
87
+ trimmed.match(/execute\s*\(\s*f['"]/)) {
88
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('sql-injection', 'SQL Injection with string interpolation detected', 'Use parameterized queries with placeholders', lineNumber, 'String interpolation or concatenation in SQL queries allows attackers to inject malicious SQL code, bypassing authentication and accessing the entire database.', 'cursor.execute(f"SELECT * FROM users WHERE id = {user_id}") where user_id = "1 OR 1=1"', [
89
+ 'Full database access (read/write/delete)',
90
+ 'Authentication bypass',
91
+ 'Data exfiltration',
92
+ 'Data destruction',
93
+ 'Privilege escalation'
94
+ ], 'cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")', 'cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))\n# Or: cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))', 'Always use parameterized queries where user input is passed as separate parameters, never interpolated into the query string'));
95
+ }
96
+ // Pattern 2: Data flow - execute() with unsafe SQL variable (FIX #1)
97
+ // Detects: query = f"SELECT..."; cursor.execute(query)
98
+ if (trimmed.match(/execute\s*\(\s*(\w+)\s*[,)]/)) {
99
+ const executeVarMatch = trimmed.match(/execute\s*\(\s*(\w+)\s*[,)]/);
100
+ if (executeVarMatch) {
101
+ const varName = executeVarMatch[1];
102
+ if (unsafeSqlVariables.has(varName)) {
103
+ const unsafeVarLine = unsafeSqlVariables.get(varName);
104
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('sql-injection', `SQL Injection via unsafe variable '${varName}' (constructed on line ${unsafeVarLine})`, 'Use parameterized queries with placeholders', lineNumber, `Variable '${varName}' contains SQL query with string interpolation (line ${unsafeVarLine}), then passed to execute() without parameterization. This allows SQL injection attacks.`, `query = f"SELECT * FROM users WHERE id = {user_id}" # Line ${unsafeVarLine}\ncursor.execute(query) # Line ${lineNumber} - Vulnerable!`, [
105
+ 'Full database access (read/write/delete)',
106
+ 'Authentication bypass',
107
+ 'Data exfiltration',
108
+ 'Data destruction',
109
+ 'Privilege escalation'
110
+ ], `# Line ${unsafeVarLine}:\nquery = f"SELECT * FROM users WHERE id = {user_id}"\n# Line ${lineNumber}:\ncursor.execute(query)`, 'cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))\n# Or: cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))', 'Always use parameterized queries where user input is passed as separate parameters, never interpolated into the query string'));
111
+ }
112
+ }
113
+ }
114
+ // 5. Command Injection - CRITICAL
115
+ if ((trimmed.includes('os.system(') || trimmed.includes('subprocess.call(') ||
116
+ trimmed.includes('subprocess.run(') || trimmed.includes('subprocess.Popen(')) &&
117
+ (trimmed.includes('+') || trimmed.includes('f"') || trimmed.includes("f'"))) {
118
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('command-injection', 'Command Injection vulnerability detected', 'Use subprocess with shell=False and pass command as list', lineNumber, 'Concatenating user input into shell commands allows attackers to execute arbitrary system commands with the application\'s privileges.', 'os.system(f"ls {user_path}") where user_path = "; rm -rf /"', [
119
+ 'Remote Code Execution (RCE)',
120
+ 'Complete system compromise',
121
+ 'Data deletion',
122
+ 'Privilege escalation',
123
+ 'Backdoor installation'
124
+ ], 'os.system(f"ls {user_dir}")', 'import subprocess\nsubprocess.run(["ls", user_dir], shell=False) # Arguments as list, shell=False', 'Use subprocess with shell=False and pass command and arguments as a list. Never concatenate user input into shell commands'));
125
+ }
126
+ // 5b. subprocess.Popen without explicit shell=False - HIGH (Priority 1 Improvement)
127
+ // Detects subprocess.Popen calls that don't explicitly set shell=False
128
+ if (trimmed.includes('subprocess.Popen(') &&
129
+ !trimmed.includes('shell=False') &&
130
+ !trimmed.includes('shell = False')) {
131
+ // Check if there are signs of user input or variable usage
132
+ const hasVariables = trimmed.match(/Popen\([^)]*[a-zA-Z_][a-zA-Z0-9_]*[^)]*\)/) ||
133
+ trimmed.includes('.format(') ||
134
+ trimmed.includes('.join(');
135
+ if (hasVariables) {
136
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('command-injection', 'subprocess.Popen without explicit shell=False may be unsafe', 'Explicitly set shell=False and pass command as a list', lineNumber, 'subprocess.Popen without explicitly setting shell=False defaults to shell=False in Python 3, but for clarity and security, always explicitly set shell=False and pass commands as a list to prevent command injection.', 'subprocess.Popen(cmd) where cmd = ["sh", "-c", user_input]', [
137
+ 'Potential command injection',
138
+ 'Unclear security posture',
139
+ 'Shell interpretation if command contains special chars',
140
+ 'Difficult security audit'
141
+ ], 'subprocess.Popen(command)', 'subprocess.Popen(command, shell=False) # Explicit is better than implicit', 'Always explicitly set shell=False in subprocess.Popen() calls and pass the command as a list of strings to prevent shell interpretation'));
142
+ }
143
+ }
144
+ // 6. shell=True in subprocess - HIGH
145
+ if (trimmed.match(/subprocess\.\w+\(.*shell\s*=\s*True/)) {
146
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('command-injection', 'subprocess with shell=True enables command injection', 'Use shell=False (default) and pass command as list', lineNumber, 'shell=True invokes a shell interpreter, which interprets special characters and allows command injection if user input is present.', 'subprocess.run(cmd, shell=True) where cmd = "ls; rm -rf /"', [
147
+ 'Command injection',
148
+ 'Shell command execution',
149
+ 'System compromise',
150
+ 'Data loss'
151
+ ], 'subprocess.run(command, shell=True)', 'subprocess.run(["command", "arg1", "arg2"], shell=False) # Safe, no shell interpretation', 'Always use shell=False and pass commands as lists. Only use shell=True for trusted, hardcoded commands'));
152
+ }
153
+ // 6b. subprocess.Popen specifically (additional check for multi-line or standalone Popen calls)
154
+ // PRIORITY 1 FIX: Ensure subprocess.Popen with shell=True is always detected
155
+ if (trimmed.includes('subprocess.Popen(') && trimmed.includes('shell') && trimmed.includes('True')) {
156
+ // Check if this Popen call has shell=True
157
+ if (trimmed.match(/subprocess\.Popen\([^)]*shell\s*=\s*True/) ||
158
+ trimmed.match(/shell\s*=\s*True[^)]*subprocess\.Popen/)) {
159
+ // Skip if already reported by previous check
160
+ const alreadyReported = vulnerabilities.some(v => v.line === lineNumber && v.message.includes('shell=True'));
161
+ if (!alreadyReported) {
162
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('command-injection', 'subprocess.Popen with shell=True enables command injection', 'Use shell=False (default) and pass command as list', lineNumber, 'subprocess.Popen() with shell=True invokes a shell interpreter, which interprets special characters and allows command injection if user input is present.', 'subprocess.Popen(cmd, shell=True) where cmd = "ls; rm -rf /"', [
163
+ 'Command injection',
164
+ 'Shell command execution',
165
+ 'System compromise',
166
+ 'Data loss'
167
+ ], 'subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)', 'subprocess.Popen(["command", "arg1", "arg2"], shell=False, stdout=subprocess.PIPE) # Safe', 'Always use shell=False with Popen and pass commands as lists. Only use shell=True for trusted, hardcoded commands'));
168
+ }
169
+ }
170
+ }
171
+ });
172
+ return vulnerabilities;
173
+ }
174
+ //# sourceMappingURL=injection-attacks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection-attacks.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/injection-attacks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Python Insecure Design Security Checks
3
+ * OWASP A06:2025 - Insecure Design
4
+ *
5
+ * Detects design-level security flaws that cannot be fixed by implementation alone.
6
+ * This is a NEW category in OWASP 2025 focusing on missing security controls.
7
+ */
8
+ import { SecurityVulnerability } from '../../types';
9
+ /**
10
+ * Checks for insecure design vulnerabilities in Python code
11
+ *
12
+ * Covers:
13
+ * - Check #1: Missing rate limiting on sensitive endpoints (HIGH)
14
+ * - Check #2: Mass assignment vulnerabilities (HIGH)
15
+ *
16
+ * @param lines - Array of code lines
17
+ * @returns Array of security vulnerabilities found
18
+ */
19
+ export declare function checkInsecureDesign(lines: string[]): SecurityVulnerability[];
20
+ //# sourceMappingURL=insecure-design.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insecure-design.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/insecure-design.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EAAE,GACd,qBAAqB,EAAE,CAsMzB"}