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,90 @@
1
+ "use strict";
2
+ /**
3
+ * Python Data Integrity Failures Security Checks
4
+ * OWASP A08:2025 - Software and Data Integrity Failures
5
+ *
6
+ * Detects insecure deserialization with pickle module.
7
+ * Updated for OWASP 2025 with enhanced detection patterns.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.checkDataIntegrity = checkDataIntegrity;
11
+ const createVulnerability_1 = require("../utils/createVulnerability");
12
+ /**
13
+ * Checks for data integrity vulnerabilities in Python code
14
+ *
15
+ * Covers:
16
+ * - Check #1: Insecure deserialization with pickle (CRITICAL)
17
+ *
18
+ * @param lines - Array of code lines
19
+ * @returns Array of security vulnerabilities found
20
+ */
21
+ function checkDataIntegrity(lines) {
22
+ const vulnerabilities = [];
23
+ let inMultiLineComment = false;
24
+ lines.forEach((line, index) => {
25
+ const trimmedLine = line.trim();
26
+ // CRITICAL: Track Python triple-quote comment blocks (""" ... """ or ''' ... ''')
27
+ const hasTripleQuote = trimmedLine.includes('"""') || trimmedLine.includes("'''");
28
+ if (hasTripleQuote) {
29
+ if (!inMultiLineComment) {
30
+ // Start of multi-line comment
31
+ inMultiLineComment = true;
32
+ // Check if it closes on the same line (single-line docstring)
33
+ const tripleQuoteCount = (trimmedLine.match(/"""/g) || []).length + (trimmedLine.match(/'''/g) || []).length;
34
+ if (tripleQuoteCount >= 2) {
35
+ // Opens and closes on same line, reset flag
36
+ inMultiLineComment = false;
37
+ }
38
+ return; // Skip this line
39
+ }
40
+ else {
41
+ // End of multi-line comment
42
+ inMultiLineComment = false;
43
+ return; // Skip this line
44
+ }
45
+ }
46
+ // CRITICAL: Skip all lines inside multi-line comments and single-line comments
47
+ if (!trimmedLine ||
48
+ inMultiLineComment ||
49
+ trimmedLine.startsWith('#')) {
50
+ return;
51
+ }
52
+ const lowerLine = trimmedLine.toLowerCase();
53
+ // Check #1: Insecure deserialization with pickle
54
+ // Detect pickle module usage (all variants)
55
+ const hasPickleUsage =
56
+ // Standard pickle operations
57
+ lowerLine.includes('pickle.load(') ||
58
+ lowerLine.includes('pickle.loads(') ||
59
+ lowerLine.includes('pickle.dump(') ||
60
+ lowerLine.includes('pickle.dumps(') ||
61
+ lowerLine.includes('pickle.unpickler(') ||
62
+ // Import variants
63
+ /from\s+pickle\s+import\s+(load|loads|dump|dumps|unpickler)/i.test(trimmedLine) ||
64
+ // Direct usage after import
65
+ (/\b(load|loads|dump|dumps|unpickler)\s*\(/.test(lowerLine) &&
66
+ // Make sure we have imported pickle earlier
67
+ lines.slice(0, index).some(l => /from\s+pickle\s+import/i.test(l.trim()))) ||
68
+ // cPickle (Python 2)
69
+ lowerLine.includes('cpickle.load(') ||
70
+ lowerLine.includes('cpickle.loads(') ||
71
+ lowerLine.includes('cpickle.dump(') ||
72
+ lowerLine.includes('cpickle.dumps(') ||
73
+ // _pickle (internal module)
74
+ lowerLine.includes('_pickle.load(') ||
75
+ lowerLine.includes('_pickle.loads(') ||
76
+ lowerLine.includes('_pickle.dump(') ||
77
+ lowerLine.includes('_pickle.dumps(');
78
+ if (hasPickleUsage) {
79
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('insecure-deserialization', 'Insecure deserialization with pickle - allows arbitrary code execution when deserializing untrusted data', 'Use safe serialization formats (JSON, MessagePack) or implement strict validation before pickle deserialization', index + 1, 'Pickle can execute arbitrary Python code during deserialization. If an attacker controls the serialized data, they can achieve Remote Code Execution (RCE), install backdoors, steal credentials, or completely compromise the server. This is one of the most critical Python vulnerabilities.', 'import pickle\ndata = pickle.loads(request.data) # CRITICAL: RCE vulnerability!', [
80
+ 'Remote Code Execution (RCE) when deserializing attacker-controlled data',
81
+ 'Complete server compromise and backdoor installation',
82
+ 'Data exfiltration and credential theft',
83
+ 'Privilege escalation to system/root access',
84
+ 'Chain attacks to internal infrastructure'
85
+ ], 'import pickle\ndef load_user_session(session_data):\n return pickle.loads(session_data) # Dangerous!', 'import json\ndef load_user_session(session_data):\n return json.loads(session_data) # Safe - JSON cannot execute code', 'Never use pickle for untrusted data. Prefer JSON (json.loads), MessagePack (msgpack.unpackb), or Protocol Buffers. If pickle is absolutely required, implement HMAC signature verification, use restricted Unpickler with safe_load(), and validate all data in isolated sandbox.'));
86
+ }
87
+ });
88
+ return vulnerabilities;
89
+ }
90
+ //# sourceMappingURL=data-integrity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-integrity.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/data-integrity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Python Deserialization Security Checks
3
+ * OWASP A08:2021 - Software and Data Integrity Failures
4
+ *
5
+ * Detects insecure deserialization vulnerabilities in Python code,
6
+ * particularly with pickle and YAML libraries.
7
+ */
8
+ import { SecurityVulnerability } from '../../types';
9
+ /**
10
+ * Checks for insecure deserialization vulnerabilities
11
+ *
12
+ * Covers:
13
+ * - Check #9: pickle.load() (HIGH) - Arbitrary code execution via pickle
14
+ * - Check #10: yaml.load() without SafeLoader (HIGH) - Code execution via YAML
15
+ *
16
+ * @param lines - Array of code lines
17
+ * @returns Array of security vulnerabilities found
18
+ */
19
+ export declare function checkDeserialization(lines: string[]): SecurityVulnerability[];
20
+ //# sourceMappingURL=deserialization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deserialization.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/deserialization.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EAAE,GACd,qBAAqB,EAAE,CAyEzB"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ /**
3
+ * Python Deserialization Security Checks
4
+ * OWASP A08:2021 - Software and Data Integrity Failures
5
+ *
6
+ * Detects insecure deserialization vulnerabilities in Python code,
7
+ * particularly with pickle and YAML libraries.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.checkDeserialization = checkDeserialization;
11
+ const createVulnerability_1 = require("../utils/createVulnerability");
12
+ /**
13
+ * Checks for insecure deserialization vulnerabilities
14
+ *
15
+ * Covers:
16
+ * - Check #9: pickle.load() (HIGH) - Arbitrary code execution via pickle
17
+ * - Check #10: yaml.load() without SafeLoader (HIGH) - Code execution via YAML
18
+ *
19
+ * @param lines - Array of code lines
20
+ * @returns Array of security vulnerabilities found
21
+ */
22
+ function checkDeserialization(lines) {
23
+ const vulnerabilities = [];
24
+ let inMultiLineComment = false;
25
+ lines.forEach((line, index) => {
26
+ const lineNumber = index + 1;
27
+ const trimmed = line.trim();
28
+ // CRITICAL: Track Python triple-quote comment blocks (""" ... """ or ''' ... ''')
29
+ const hasTripleQuote = trimmed.includes('"""') || trimmed.includes("'''");
30
+ if (hasTripleQuote) {
31
+ if (!inMultiLineComment) {
32
+ inMultiLineComment = true;
33
+ const tripleQuoteCount = (trimmed.match(/"""/g) || []).length + (trimmed.match(/'''/g) || []).length;
34
+ if (tripleQuoteCount >= 2) {
35
+ inMultiLineComment = false;
36
+ }
37
+ return;
38
+ }
39
+ else {
40
+ inMultiLineComment = false;
41
+ return;
42
+ }
43
+ }
44
+ // CRITICAL: Skip all lines inside multi-line comments and single-line comments
45
+ if (!trimmed || inMultiLineComment || trimmed.startsWith('#')) {
46
+ return;
47
+ }
48
+ // 9. pickle with untrusted data - HIGH
49
+ if (trimmed.match(/pickle\.load[s]?\(/) && !trimmed.includes('# trusted')) {
50
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('unsafe-pickle', 'pickle.load() can execute arbitrary code', 'Use json or msgpack for serialization, never unpickle untrusted data', lineNumber, 'Pickle deserialization can execute arbitrary Python code embedded in the pickled data, making it extremely dangerous with untrusted input.', 'pickle.loads(user_data) # Can execute __reduce__ methods with malicious code', [
51
+ 'Remote Code Execution (RCE)',
52
+ 'Complete system compromise',
53
+ 'Data theft',
54
+ 'Malware installation'
55
+ ], 'import pickle\ndata = pickle.load(untrusted_file)', 'import json\ndata = json.load(file) # Safe, only data deserialization\n# Or use msgpack for binary', 'Never unpickle data from untrusted sources. Use json for text data or msgpack for binary serialization'));
56
+ }
57
+ // 10. yaml.load() without SafeLoader - HIGH
58
+ if (trimmed.match(/yaml\.load\(/) && !trimmed.includes('SafeLoader')) {
59
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('unsafe-yaml-load', 'yaml.load() without SafeLoader can execute arbitrary code', 'Use yaml.safe_load() or yaml.load() with SafeLoader', lineNumber, 'yaml.load() with default Loader can instantiate arbitrary Python objects, including those that execute code during construction.', 'yaml.load(user_config) # Can execute !!python/object/apply', [
60
+ 'Remote Code Execution (RCE)',
61
+ 'Object instantiation attacks',
62
+ 'System compromise'
63
+ ], 'import yaml\nconfig = yaml.load(file)', 'import yaml\nconfig = yaml.safe_load(file) # Safe, only loads basic types\n# Or: yaml.load(file, Loader=yaml.SafeLoader)', 'Always use yaml.safe_load() or explicitly pass Loader=yaml.SafeLoader to yaml.load()'));
64
+ }
65
+ });
66
+ return vulnerabilities;
67
+ }
68
+ //# sourceMappingURL=deserialization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deserialization.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/deserialization.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAeH,oDA2EC;AAvFD,sEAAiF;AAEjF;;;;;;;;;GASG;AACH,SAAgB,oBAAoB,CAClC,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,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,kFAAkF;QAClF,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE1E,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,kBAAkB,GAAG,IAAI,CAAC;gBAC1B,MAAM,gBAAgB,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBACrG,IAAI,gBAAgB,IAAI,CAAC,EAAE,CAAC;oBAC1B,kBAAkB,GAAG,KAAK,CAAC;gBAC7B,CAAC;gBACD,OAAO;YACT,CAAC;iBAAM,CAAC;gBACN,kBAAkB,GAAG,KAAK,CAAC;gBAC3B,OAAO;YACT,CAAC;QACH,CAAC;QAED,+EAA+E;QAC/E,IAAI,CAAC,OAAO,IAAI,kBAAkB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,uCAAuC;QACvC,IAAI,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1E,eAAe,CAAC,IAAI,CAAC,IAAA,uDAAiC,EACpD,eAAe,EACf,0CAA0C,EAC1C,sEAAsE,EACtE,UAAU,EACV,4IAA4I,EAC5I,+EAA+E,EAC/E;gBACE,6BAA6B;gBAC7B,4BAA4B;gBAC5B,YAAY;gBACZ,sBAAsB;aACvB,EACD,mDAAmD,EACnD,qGAAqG,EACrG,wGAAwG,CACzG,CAAC,CAAC;QACL,CAAC;QAED,4CAA4C;QAC5C,IAAI,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACrE,eAAe,CAAC,IAAI,CAAC,IAAA,uDAAiC,EACpD,kBAAkB,EAClB,2DAA2D,EAC3D,qDAAqD,EACrD,UAAU,EACV,kIAAkI,EAClI,6DAA6D,EAC7D;gBACE,6BAA6B;gBAC7B,8BAA8B;gBAC9B,mBAAmB;aACpB,EACD,uCAAuC,EACvC,2HAA2H,EAC3H,sFAAsF,CACvF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,eAAe,CAAC;AACzB,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Django Framework Security Checks
3
+ * OWASP A03:2021 - Injection, A01:2021 - Broken Access Control, A02:2021 - Cryptographic Failures
4
+ *
5
+ * Detects Django-specific security vulnerabilities including CSRF issues,
6
+ * configuration errors, XSS bypasses, and authentication problems.
7
+ */
8
+ import { SecurityVulnerability } from '../../types';
9
+ /**
10
+ * Checks for Django framework security vulnerabilities
11
+ *
12
+ * Covers:
13
+ * - Check #22: @csrf_exempt (HIGH) - Disables CSRF protection
14
+ * - Check #23: DEBUG=True (CRITICAL) - Information disclosure
15
+ * - Check #24: mark_safe() with user input (HIGH) - XSS vulnerability
16
+ * - Check #25: ORM raw() SQL injection (CRITICAL) - SQL injection via raw queries
17
+ * - Check #26: Missing @login_required (MEDIUM) - Missing authentication
18
+ * - Check #27: Weak SECRET_KEY (CRITICAL) - Cryptographic weakness
19
+ *
20
+ * @param lines - Array of code lines
21
+ * @param unsafeSqlVariables - Map of variable names with unsafe SQL string formatting
22
+ * @returns Array of security vulnerabilities found
23
+ */
24
+ export declare function checkDjangoSecurity(lines: string[], unsafeSqlVariables: Map<string, number>): SecurityVulnerability[];
25
+ //# sourceMappingURL=django-security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"django-security.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/django-security.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EAAE,EACf,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,qBAAqB,EAAE,CAgPzB"}
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ /**
3
+ * Django Framework Security Checks
4
+ * OWASP A03:2021 - Injection, A01:2021 - Broken Access Control, A02:2021 - Cryptographic Failures
5
+ *
6
+ * Detects Django-specific security vulnerabilities including CSRF issues,
7
+ * configuration errors, XSS bypasses, and authentication problems.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.checkDjangoSecurity = checkDjangoSecurity;
11
+ const createVulnerability_1 = require("../utils/createVulnerability");
12
+ /**
13
+ * Checks for Django framework security vulnerabilities
14
+ *
15
+ * Covers:
16
+ * - Check #22: @csrf_exempt (HIGH) - Disables CSRF protection
17
+ * - Check #23: DEBUG=True (CRITICAL) - Information disclosure
18
+ * - Check #24: mark_safe() with user input (HIGH) - XSS vulnerability
19
+ * - Check #25: ORM raw() SQL injection (CRITICAL) - SQL injection via raw queries
20
+ * - Check #26: Missing @login_required (MEDIUM) - Missing authentication
21
+ * - Check #27: Weak SECRET_KEY (CRITICAL) - Cryptographic weakness
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
+ function checkDjangoSecurity(lines, unsafeSqlVariables) {
28
+ const vulnerabilities = [];
29
+ let inMultiLineComment = false;
30
+ lines.forEach((line, index) => {
31
+ const lineNumber = index + 1;
32
+ const trimmed = line.trim();
33
+ // CRITICAL: Track Python triple-quote comment blocks (""" ... """ or ''' ... ''')
34
+ const hasTripleQuote = trimmed.includes('"""') || trimmed.includes("'''");
35
+ if (hasTripleQuote) {
36
+ if (!inMultiLineComment) {
37
+ inMultiLineComment = true;
38
+ const tripleQuoteCount = (trimmed.match(/"""/g) || []).length + (trimmed.match(/'''/g) || []).length;
39
+ if (tripleQuoteCount >= 2) {
40
+ inMultiLineComment = false;
41
+ }
42
+ return;
43
+ }
44
+ else {
45
+ inMultiLineComment = false;
46
+ return;
47
+ }
48
+ }
49
+ // CRITICAL: Skip all lines inside multi-line comments and single-line comments
50
+ if (!trimmed || inMultiLineComment || trimmed.startsWith('#')) {
51
+ return;
52
+ }
53
+ // 22. Django CSRF Exempt - HIGH (disables CSRF protection)
54
+ if (trimmed.includes('@csrf_exempt') && !trimmed.startsWith('#')) {
55
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('django-csrf-exempt', '@csrf_exempt decorator disables CSRF protection', 'Remove @csrf_exempt or ensure alternative CSRF protection is in place', lineNumber, 'The @csrf_exempt decorator disables Django\'s built-in CSRF protection, leaving the view vulnerable to Cross-Site Request Forgery attacks where attackers can perform unauthorized actions.', '@csrf_exempt\\ndef upload_file(request): # Attacker can forge POST requests', [
56
+ 'Cross-Site Request Forgery (CSRF)',
57
+ 'Unauthorized state-changing operations',
58
+ 'Account takeover',
59
+ 'Data manipulation',
60
+ 'Privilege escalation'
61
+ ], '@csrf_exempt\\ndef process_payment(request):', 'def process_payment(request):\\n # CSRF protection enabled by default\\n if request.method == "POST":\\n # Verify CSRF token automatically', 'Only use @csrf_exempt for APIs with alternative authentication (e.g., API tokens). Never exempt user-facing forms'));
62
+ }
63
+ // 23. Django DEBUG=True - CRITICAL (information disclosure)
64
+ if (trimmed.match(/DEBUG\s*=\s*True/)) {
65
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('django-debug-true', 'DEBUG = True exposes sensitive information in production', 'Set DEBUG = False in production settings', lineNumber, 'Running Django with DEBUG=True in production exposes detailed error pages with stack traces, settings, environment variables, and SQL queries to end users, revealing sensitive application internals.', 'DEBUG = True # Exposes SECRET_KEY, database credentials, file paths', [
66
+ 'Information disclosure',
67
+ 'Exposure of secret keys and credentials',
68
+ 'Exposure of application structure',
69
+ 'Stack trace information leakage',
70
+ 'Potential for targeted attacks'
71
+ ], 'DEBUG = True', 'import os\\nDEBUG = os.environ.get("DEBUG", "False") == "True" # False by default\\n# Or: DEBUG = False # Production', 'Always set DEBUG=False in production. Use environment variables to control debug mode'));
72
+ }
73
+ // 24. Django mark_safe() - HIGH (XSS vulnerability)
74
+ // CRITICAL FIX (2025-11-21): Expanded detection pattern
75
+ // Old: Only detected mark_safe() with 'request.', 'user_', 'input' keywords
76
+ // New: Detects mark_safe() with ANY variable, f-string, or dynamic content
77
+ if (trimmed.includes('mark_safe(')) {
78
+ const hasDynamicContent = trimmed.includes('request.') || // request.GET, request.POST
79
+ trimmed.includes('user.') || // user.bio, user.name
80
+ trimmed.match(/user_\w+/) || // user_input, user_data
81
+ trimmed.includes('input') || // input variable
82
+ trimmed.match(/mark_safe\([^)]*\{/) || // f-string interpolation: f"...{var}..."
83
+ trimmed.match(/mark_safe\([^)]*\+/) || // string concatenation
84
+ trimmed.match(/mark_safe\([^)]*\.format\(/) || // .format() method
85
+ trimmed.match(/mark_safe\([^)]*%/) || // % string formatting
86
+ trimmed.match(/mark_safe\(\w+\)/) || // variable: mark_safe(content)
87
+ trimmed.match(/mark_safe\([^)]*\[/); // array/dict access: mark_safe(data['key'])
88
+ if (hasDynamicContent) {
89
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('django-mark-safe-xss', 'mark_safe() with user input bypasses XSS protection', 'Sanitize user input or use Django template auto-escaping instead', lineNumber, 'Django\'s mark_safe() function tells the template engine to trust the HTML content. When used with user input, it bypasses XSS protection and allows attackers to inject malicious scripts.', 'html = mark_safe(request.GET["content"]) # Attacker: ?content=<script>alert(1)</script>', [
90
+ 'Cross-Site Scripting (XSS)',
91
+ 'Session hijacking',
92
+ 'Credential theft',
93
+ 'Malicious script injection',
94
+ 'Client-side code execution'
95
+ ], 'from django.utils.safestring import mark_safe\\nhtml = mark_safe(user_input)', 'from django.utils.html import escape\\n# Let Django auto-escape in templates\\nhtml = escape(user_input) # Sanitizes HTML\\n# Or use template: {{ user_input }} (auto-escaped)', 'Never use mark_safe() with user-controlled input. Use Django\'s template auto-escaping'));
96
+ }
97
+ }
98
+ // 25. Django ORM Raw SQL Injection - CRITICAL (with data flow analysis)
99
+ if (trimmed.includes('.raw(')) {
100
+ // Check 1: Inline string formatting (same line as .raw())
101
+ const hasInlineFormatting = trimmed.includes('f"') ||
102
+ trimmed.includes('f\'') ||
103
+ trimmed.includes('%s"') ||
104
+ trimmed.includes('+') ||
105
+ trimmed.includes('.format(');
106
+ // Check 2: Using tracked unsafe variable
107
+ let usesUnsafeVariable = false;
108
+ let unsafeVarLine = 0;
109
+ let varName = '';
110
+ // Extract variable name from .raw(variable) call
111
+ const rawCallMatch = trimmed.match(/\.raw\((\w+)/);
112
+ if (rawCallMatch) {
113
+ varName = rawCallMatch[1];
114
+ if (unsafeSqlVariables.has(varName)) {
115
+ usesUnsafeVariable = true;
116
+ unsafeVarLine = unsafeSqlVariables.get(varName);
117
+ }
118
+ }
119
+ if (hasInlineFormatting || usesUnsafeVariable) {
120
+ const message = usesUnsafeVariable
121
+ ? `Django ORM raw() uses unsafe query variable '${varName}' (defined on line ${unsafeVarLine})`
122
+ : 'Django ORM raw() with string formatting allows SQL injection';
123
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('django-orm-sql-injection', message, 'Use parameterized queries with .raw() or switch to ORM query methods', lineNumber, 'Using string formatting (f-strings, %, +, .format()) with Django\'s .raw() method allows SQL injection attacks. Attackers can manipulate queries to access unauthorized data or modify the database.', 'User.objects.raw(f"SELECT * FROM users WHERE name = \'{name}\'") # name = "admin\'--" → bypasses WHERE', [
124
+ 'SQL injection',
125
+ 'Unauthorized data access',
126
+ 'Data exfiltration',
127
+ 'Data manipulation/deletion',
128
+ 'Authentication bypass'
129
+ ], 'query = f"SELECT * FROM users WHERE id = {user_id}"\\nUser.objects.raw(query)', '# Use parameterized queries\\nUser.objects.raw("SELECT * FROM users WHERE id = %s", [user_id])\\n# Or use ORM: User.objects.filter(id=user_id)', 'Always use parameterized queries with .raw(). Prefer Django ORM methods over raw SQL'));
130
+ }
131
+ }
132
+ // 26. Django Missing login_required - MEDIUM (missing authentication)
133
+ // PHASE 6 FIX (2025-11-22): Broadened detection to include admin, settings, dashboard, financial operations
134
+ const lowerTrimmed = trimmed.toLowerCase();
135
+ const sensitiveKeywords = [
136
+ 'admin', 'delete', 'remove', 'update', 'edit',
137
+ 'settings', 'dashboard', 'manage', 'create', 'transfer',
138
+ 'invoice', 'payment', 'billing'
139
+ ];
140
+ if ((trimmed.includes('def ') || trimmed.includes('class ')) &&
141
+ trimmed.includes('(request') && // Django view signature
142
+ sensitiveKeywords.some(keyword => lowerTrimmed.includes(keyword))) {
143
+ // Check if @login_required is in previous lines (must be actual decorator, not in comments)
144
+ const hasAuthRequired = lines.slice(Math.max(0, index - 5), index).some(prevLine => {
145
+ const prevTrimmed = prevLine.trim();
146
+ return !prevTrimmed.startsWith('#') && (prevTrimmed.includes('@login_required') || prevTrimmed.includes('@permission_required'));
147
+ });
148
+ if (!hasAuthRequired) {
149
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('django-missing-login-required', 'Sensitive view missing @login_required decorator', 'Add @login_required decorator to restrict access to authenticated users', lineNumber, 'Django views that perform sensitive operations (delete, update, admin actions, settings) should require authentication. Without @login_required, anonymous users can access these functions.', 'def admin_dashboard(request): # No @login_required → Anyone can access admin panel', [
150
+ 'Unauthorized access to sensitive functions',
151
+ 'Data manipulation by anonymous users',
152
+ 'Privilege escalation',
153
+ 'Missing access control',
154
+ 'OWASP A01:2021 - Broken Access Control'
155
+ ], 'def admin_dashboard(request):', 'from django.contrib.auth.decorators import login_required\\n\\n@login_required\\ndef admin_dashboard(request):\\n # Only authenticated users can access', 'Always use @login_required for sensitive views. Consider @permission_required for role-based access'));
156
+ }
157
+ }
158
+ // 27. Django Weak SECRET_KEY - CRITICAL (cryptographic weakness)
159
+ if (trimmed.match(/SECRET_KEY\s*=\s*['"]/)) {
160
+ const secretKeyMatch = trimmed.match(/SECRET_KEY\s*=\s*['"]([^'"]+)['"]/);
161
+ if (secretKeyMatch) {
162
+ const secretKey = secretKeyMatch[1];
163
+ const isWeak = secretKey.length < 50 ||
164
+ /^(secret|django|12345|password|key|test|abc|demo)/i.test(secretKey) ||
165
+ secretKey === 'your-secret-key-here';
166
+ if (isWeak) {
167
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('django-weak-secret-key', 'Django SECRET_KEY is weak or hardcoded', 'Generate a strong random SECRET_KEY and store in environment variables', lineNumber, 'Django\'s SECRET_KEY is used for cryptographic signing of sessions, cookies, and password reset tokens. A weak or hardcoded key allows attackers to forge sessions and decrypt sensitive data.', 'SECRET_KEY = "12345" # Attacker can forge session cookies and impersonate any user', [
168
+ 'Session forgery',
169
+ 'Cookie tampering',
170
+ 'Password reset token forgery',
171
+ 'CSRF token bypass',
172
+ 'Cryptographic attack on signed data'
173
+ ], 'SECRET_KEY = "django-insecure-123"', 'import os\\nfrom django.core.management.utils import get_random_secret_key\\n\\nSECRET_KEY = os.environ.get("DJANGO_SECRET_KEY")\\nif not SECRET_KEY:\\n raise ValueError("DJANGO_SECRET_KEY environment variable not set")', 'Generate with: python -c \'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())\''));
174
+ }
175
+ }
176
+ }
177
+ });
178
+ return vulnerabilities;
179
+ }
180
+ //# sourceMappingURL=django-security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"django-security.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/django-security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Python Enhanced Supply Chain Security Checks
3
+ * OWASP A03:2025 - Software Supply Chain Failures (Enhanced)
4
+ *
5
+ * Enhanced supply chain security checks building on existing dependency scanning.
6
+ * Focuses on runtime dependencies, package integrity, and malicious code patterns.
7
+ */
8
+ import { SecurityVulnerability } from '../../types';
9
+ /**
10
+ * Checks for enhanced supply chain security vulnerabilities in Python code
11
+ *
12
+ * Covers:
13
+ * - Check #1: Dynamic imports without validation (HIGH)
14
+ * - Check #2: Runtime package installation (HIGH)
15
+ * - Check #3: Suspicious package patterns (HIGH)
16
+ * - Check #4: Untrusted package sources (MEDIUM)
17
+ * - Check #5: Package typosquatting patterns (MEDIUM)
18
+ *
19
+ * @param lines - Array of code lines
20
+ * @returns Array of security vulnerabilities found
21
+ */
22
+ export declare function checkEnhancedSupplyChain(lines: string[]): SecurityVulnerability[];
23
+ //# sourceMappingURL=enhanced-supply-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhanced-supply-chain.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/enhanced-supply-chain.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EAAE,GACd,qBAAqB,EAAE,CAkLzB"}
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ /**
3
+ * Python Enhanced Supply Chain Security Checks
4
+ * OWASP A03:2025 - Software Supply Chain Failures (Enhanced)
5
+ *
6
+ * Enhanced supply chain security checks building on existing dependency scanning.
7
+ * Focuses on runtime dependencies, package integrity, and malicious code patterns.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.checkEnhancedSupplyChain = checkEnhancedSupplyChain;
11
+ const createVulnerability_1 = require("../utils/createVulnerability");
12
+ /**
13
+ * Checks for enhanced supply chain security vulnerabilities in Python code
14
+ *
15
+ * Covers:
16
+ * - Check #1: Dynamic imports without validation (HIGH)
17
+ * - Check #2: Runtime package installation (HIGH)
18
+ * - Check #3: Suspicious package patterns (HIGH)
19
+ * - Check #4: Untrusted package sources (MEDIUM)
20
+ * - Check #5: Package typosquatting patterns (MEDIUM)
21
+ *
22
+ * @param lines - Array of code lines
23
+ * @returns Array of security vulnerabilities found
24
+ */
25
+ function checkEnhancedSupplyChain(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: Dynamic imports without validation
58
+ if ((lowerLine.includes('__import__(') || lowerLine.includes('importlib.import_module(')) &&
59
+ (lowerLine.includes('input(') || lowerLine.includes('sys.argv') ||
60
+ lowerLine.includes('request.') || lowerLine.includes('os.environ'))) {
61
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('dynamic-import-no-validation', 'Dynamic import from user input without validation', 'Validate and whitelist allowed module names before dynamic imports', index + 1, 'Dynamic imports from user input can execute arbitrary code and enable supply chain attacks', '__import__(user_input) # arbitrary module loading', [
62
+ 'Arbitrary module execution from user input',
63
+ 'Supply chain attacks through malicious packages',
64
+ 'Code injection via module names',
65
+ 'Bypass of static analysis and security tools'
66
+ ], '__import__(user_input)', 'allowed_modules = ["safe_module"]; if module_name in allowed_modules: __import__(module_name)', 'Dynamic imports should validate module names against a whitelist to prevent arbitrary code execution'));
67
+ }
68
+ // Check #2: Runtime package installation
69
+ if ((lowerLine.includes('subprocess.') || lowerLine.includes('os.system(')) &&
70
+ (lowerLine.includes('pip install') || lowerLine.includes('pip3 install') ||
71
+ lowerLine.includes('easy_install') || lowerLine.includes('conda install'))) {
72
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('runtime-package-installation', 'Runtime package installation detected', 'Pre-install packages during build time instead of runtime installation', index + 1, 'Runtime package installation can introduce malicious code and supply chain vulnerabilities', 'subprocess.run(["pip", "install", user_package]) # runtime installation', [
73
+ 'Installation of malicious packages at runtime',
74
+ 'Supply chain attacks through compromised packages',
75
+ 'Privilege escalation through package installation',
76
+ 'Environment contamination with untrusted code'
77
+ ], 'subprocess.run(["pip", "install", package_name])', '# Pre-install packages in requirements.txt or Dockerfile', 'Runtime package installation bypasses security controls and enables arbitrary code execution'));
78
+ }
79
+ // Check #3: Suspicious package patterns (common typosquatting names)
80
+ // Don't flag legitimate packages: bs4, requests, urllib, numpy, pandas (use word boundaries!)
81
+ const legitimatePackages = ['bs4', 'requests', 'urllib', 'numpy', 'pandas'];
82
+ const hasLegitimatePackage = legitimatePackages.some(pkg => {
83
+ // Match exact package name with word boundaries (import numpy, from numpy, import urllib.parse)
84
+ const importPattern = new RegExp(`\\b(import|from)\\s+${pkg}\\b`, 'i');
85
+ return importPattern.test(trimmedLine);
86
+ });
87
+ if ((lowerLine.includes('import ') || lowerLine.includes('from ')) &&
88
+ !hasLegitimatePackage &&
89
+ (lowerLine.includes('reqeusts') || lowerLine.includes('beautifulsoup') ||
90
+ lowerLine.includes('urlib') || lowerLine.includes('numpyy') ||
91
+ lowerLine.includes('pandass') || lowerLine.includes('pythn'))) {
92
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('suspicious-package-pattern', 'Potentially typosquatted package name detected', 'Verify package names carefully against PyPI official packages', index + 1, 'Typosquatting packages can contain malicious code that mimics legitimate packages', 'import reqeusts # should be "requests"', [
93
+ 'Malicious code execution from fake packages',
94
+ 'Data theft and credential harvesting',
95
+ 'Backdoor installation and remote access',
96
+ 'Supply chain compromise through package confusion'
97
+ ], 'import reqeusts', 'import requests # verify correct package name', 'Typosquatting packages exploit common typos to distribute malicious code'));
98
+ }
99
+ // Check #4: Untrusted package sources
100
+ if ((lowerLine.includes('pip install') || lowerLine.includes('pip3 install')) &&
101
+ (lowerLine.includes('--index-url') || lowerLine.includes('-i ') ||
102
+ lowerLine.includes('--extra-index-url') || lowerLine.includes('--find-links'))) {
103
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('untrusted-package-source', 'Package installation from non-standard or untrusted source', 'Use official PyPI repository or verify custom repository security', index + 1, 'Installing packages from untrusted sources can introduce malicious code', 'pip install --index-url http://suspicious-repo.com/simple/ package', [
104
+ 'Malicious packages from compromised repositories',
105
+ 'Supply chain attacks through untrusted sources',
106
+ 'Man-in-the-middle attacks on package downloads',
107
+ 'Installation of backdoored or modified packages'
108
+ ], 'pip install --index-url http://custom-repo.com/simple/ package', 'pip install package # use official PyPI or verify custom repo security', 'Custom package repositories should be verified for security before use'));
109
+ }
110
+ // Check #5: Package typosquatting patterns in pip commands
111
+ if ((lowerLine.includes('pip install') || lowerLine.includes('pip3 install')) &&
112
+ (lowerLine.includes('django-admin') || lowerLine.includes('flask-admin') ||
113
+ lowerLine.includes('python-') || lowerLine.includes('py-') ||
114
+ lowerLine.includes('djangoo') || lowerLine.includes('flaskk') ||
115
+ lowerLine.includes('requestss') || lowerLine.includes('numpy-') ||
116
+ lowerLine.includes('pandas-'))) {
117
+ vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('package-typosquatting-pattern', 'Package name follows common typosquatting pattern', 'Verify official package names on PyPI before installation', index + 1, 'Package names that mimic popular packages may contain malicious code', 'pip install djangoo # should be "django"', [
118
+ 'Installation of malicious packages instead of legitimate ones',
119
+ 'Supply chain attacks through package confusion',
120
+ 'Backdoor code execution in development and production',
121
+ 'Credential theft and data exfiltration'
122
+ ], 'pip install djangoo', 'pip install django # use official package name from PyPI', 'Package names should be verified against official PyPI listings to avoid typosquatting attacks'));
123
+ }
124
+ });
125
+ return vulnerabilities;
126
+ }
127
+ //# sourceMappingURL=enhanced-supply-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhanced-supply-chain.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/enhanced-supply-chain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Python Exception Handling Security Checks
3
+ * OWASP A10:2025 - Mishandling of Exceptional Conditions
4
+ *
5
+ * Detects improper exception handling that can lead to security vulnerabilities.
6
+ * This is a completely NEW category in OWASP 2025.
7
+ */
8
+ import { SecurityVulnerability } from '../../types';
9
+ /**
10
+ * Checks for exception handling security vulnerabilities in Python code
11
+ *
12
+ * Covers:
13
+ * - Check #1: Bare except clauses (HIGH)
14
+ * - Check #2: Exception details exposed in responses (HIGH)
15
+ * - Check #3: Silent exception suppression (MEDIUM)
16
+ * - Check #4: Resource cleanup missing in exceptions (MEDIUM)
17
+ * - Check #5: Incorrect exception handling patterns (MEDIUM)
18
+ *
19
+ * @param lines - Array of code lines
20
+ * @returns Array of security vulnerabilities found
21
+ */
22
+ export declare function checkExceptionHandling(lines: string[]): SecurityVulnerability[];
23
+ //# sourceMappingURL=exception-handling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exception-handling.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/exception-handling.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EAAE,GACd,qBAAqB,EAAE,CA6KzB"}