souleyez 2.43.26__py3-none-any.whl → 2.43.34__py3-none-any.whl

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 (358) hide show
  1. souleyez/__init__.py +1 -2
  2. souleyez/ai/__init__.py +21 -15
  3. souleyez/ai/action_mapper.py +249 -150
  4. souleyez/ai/chain_advisor.py +116 -100
  5. souleyez/ai/claude_provider.py +29 -28
  6. souleyez/ai/context_builder.py +80 -62
  7. souleyez/ai/executor.py +158 -117
  8. souleyez/ai/feedback_handler.py +136 -121
  9. souleyez/ai/llm_factory.py +27 -20
  10. souleyez/ai/llm_provider.py +4 -2
  11. souleyez/ai/ollama_provider.py +6 -9
  12. souleyez/ai/ollama_service.py +44 -37
  13. souleyez/ai/path_scorer.py +91 -76
  14. souleyez/ai/recommender.py +176 -144
  15. souleyez/ai/report_context.py +74 -73
  16. souleyez/ai/report_service.py +84 -66
  17. souleyez/ai/result_parser.py +222 -229
  18. souleyez/ai/safety.py +67 -44
  19. souleyez/auth/__init__.py +23 -22
  20. souleyez/auth/audit.py +36 -26
  21. souleyez/auth/engagement_access.py +65 -48
  22. souleyez/auth/permissions.py +14 -3
  23. souleyez/auth/session_manager.py +54 -37
  24. souleyez/auth/user_manager.py +109 -64
  25. souleyez/commands/audit.py +40 -43
  26. souleyez/commands/auth.py +35 -15
  27. souleyez/commands/deliverables.py +55 -50
  28. souleyez/commands/engagement.py +47 -28
  29. souleyez/commands/license.py +32 -23
  30. souleyez/commands/screenshots.py +36 -32
  31. souleyez/commands/user.py +82 -36
  32. souleyez/config.py +52 -44
  33. souleyez/core/credential_tester.py +87 -81
  34. souleyez/core/cve_mappings.py +179 -192
  35. souleyez/core/cve_matcher.py +162 -148
  36. souleyez/core/msf_auto_mapper.py +100 -83
  37. souleyez/core/msf_chain_engine.py +294 -256
  38. souleyez/core/msf_database.py +153 -70
  39. souleyez/core/msf_integration.py +679 -673
  40. souleyez/core/msf_rpc_client.py +40 -42
  41. souleyez/core/msf_rpc_manager.py +77 -79
  42. souleyez/core/msf_sync_manager.py +241 -181
  43. souleyez/core/network_utils.py +22 -15
  44. souleyez/core/parser_handler.py +34 -25
  45. souleyez/core/pending_chains.py +114 -63
  46. souleyez/core/templates.py +158 -107
  47. souleyez/core/tool_chaining.py +9526 -2879
  48. souleyez/core/version_utils.py +79 -94
  49. souleyez/core/vuln_correlation.py +136 -89
  50. souleyez/core/web_utils.py +33 -32
  51. souleyez/data/wordlists/ad_users.txt +378 -0
  52. souleyez/data/wordlists/api_endpoints_large.txt +769 -0
  53. souleyez/data/wordlists/home_dir_sensitive.txt +39 -0
  54. souleyez/data/wordlists/lfi_payloads.txt +82 -0
  55. souleyez/data/wordlists/passwords_brute.txt +1548 -0
  56. souleyez/data/wordlists/passwords_crack.txt +2479 -0
  57. souleyez/data/wordlists/passwords_spray.txt +386 -0
  58. souleyez/data/wordlists/subdomains_large.txt +5057 -0
  59. souleyez/data/wordlists/usernames_common.txt +694 -0
  60. souleyez/data/wordlists/web_dirs_large.txt +4769 -0
  61. souleyez/detection/__init__.py +1 -1
  62. souleyez/detection/attack_signatures.py +12 -17
  63. souleyez/detection/mitre_mappings.py +61 -55
  64. souleyez/detection/validator.py +97 -86
  65. souleyez/devtools.py +23 -10
  66. souleyez/docs/README.md +4 -4
  67. souleyez/docs/api-reference/cli-commands.md +2 -2
  68. souleyez/docs/developer-guide/adding-new-tools.md +562 -0
  69. souleyez/docs/user-guide/auto-chaining.md +30 -8
  70. souleyez/docs/user-guide/getting-started.md +1 -1
  71. souleyez/docs/user-guide/installation.md +26 -3
  72. souleyez/docs/user-guide/metasploit-integration.md +2 -2
  73. souleyez/docs/user-guide/rbac.md +1 -1
  74. souleyez/docs/user-guide/scope-management.md +1 -1
  75. souleyez/docs/user-guide/siem-integration.md +1 -1
  76. souleyez/docs/user-guide/tools-reference.md +1 -8
  77. souleyez/docs/user-guide/worker-management.md +1 -1
  78. souleyez/engine/background.py +1239 -535
  79. souleyez/engine/base.py +4 -1
  80. souleyez/engine/job_status.py +17 -49
  81. souleyez/engine/log_sanitizer.py +103 -77
  82. souleyez/engine/manager.py +38 -7
  83. souleyez/engine/result_handler.py +2200 -1550
  84. souleyez/engine/worker_manager.py +50 -41
  85. souleyez/export/evidence_bundle.py +72 -62
  86. souleyez/feature_flags/features.py +16 -20
  87. souleyez/feature_flags.py +5 -9
  88. souleyez/handlers/__init__.py +11 -0
  89. souleyez/handlers/base.py +188 -0
  90. souleyez/handlers/bash_handler.py +277 -0
  91. souleyez/handlers/bloodhound_handler.py +243 -0
  92. souleyez/handlers/certipy_handler.py +311 -0
  93. souleyez/handlers/crackmapexec_handler.py +486 -0
  94. souleyez/handlers/dnsrecon_handler.py +344 -0
  95. souleyez/handlers/enum4linux_handler.py +400 -0
  96. souleyez/handlers/evil_winrm_handler.py +493 -0
  97. souleyez/handlers/ffuf_handler.py +815 -0
  98. souleyez/handlers/gobuster_handler.py +1114 -0
  99. souleyez/handlers/gpp_extract_handler.py +334 -0
  100. souleyez/handlers/hashcat_handler.py +444 -0
  101. souleyez/handlers/hydra_handler.py +563 -0
  102. souleyez/handlers/impacket_getuserspns_handler.py +343 -0
  103. souleyez/handlers/impacket_psexec_handler.py +222 -0
  104. souleyez/handlers/impacket_secretsdump_handler.py +426 -0
  105. souleyez/handlers/john_handler.py +286 -0
  106. souleyez/handlers/katana_handler.py +425 -0
  107. souleyez/handlers/kerbrute_handler.py +298 -0
  108. souleyez/handlers/ldapsearch_handler.py +636 -0
  109. souleyez/handlers/lfi_extract_handler.py +464 -0
  110. souleyez/handlers/msf_auxiliary_handler.py +408 -0
  111. souleyez/handlers/msf_exploit_handler.py +380 -0
  112. souleyez/handlers/nikto_handler.py +413 -0
  113. souleyez/handlers/nmap_handler.py +821 -0
  114. souleyez/handlers/nuclei_handler.py +359 -0
  115. souleyez/handlers/nxc_handler.py +371 -0
  116. souleyez/handlers/rdp_sec_check_handler.py +353 -0
  117. souleyez/handlers/registry.py +292 -0
  118. souleyez/handlers/responder_handler.py +232 -0
  119. souleyez/handlers/service_explorer_handler.py +434 -0
  120. souleyez/handlers/smbclient_handler.py +344 -0
  121. souleyez/handlers/smbmap_handler.py +510 -0
  122. souleyez/handlers/smbpasswd_handler.py +296 -0
  123. souleyez/handlers/sqlmap_handler.py +1116 -0
  124. souleyez/handlers/theharvester_handler.py +601 -0
  125. souleyez/handlers/web_login_test_handler.py +327 -0
  126. souleyez/handlers/whois_handler.py +277 -0
  127. souleyez/handlers/wpscan_handler.py +554 -0
  128. souleyez/history.py +32 -16
  129. souleyez/importers/msf_importer.py +106 -75
  130. souleyez/importers/smart_importer.py +208 -147
  131. souleyez/integrations/siem/__init__.py +10 -10
  132. souleyez/integrations/siem/base.py +17 -18
  133. souleyez/integrations/siem/elastic.py +108 -122
  134. souleyez/integrations/siem/factory.py +207 -80
  135. souleyez/integrations/siem/googlesecops.py +146 -154
  136. souleyez/integrations/siem/rule_mappings/__init__.py +1 -1
  137. souleyez/integrations/siem/rule_mappings/wazuh_rules.py +8 -5
  138. souleyez/integrations/siem/sentinel.py +107 -109
  139. souleyez/integrations/siem/splunk.py +246 -212
  140. souleyez/integrations/siem/wazuh.py +65 -71
  141. souleyez/integrations/wazuh/__init__.py +5 -5
  142. souleyez/integrations/wazuh/client.py +70 -93
  143. souleyez/integrations/wazuh/config.py +85 -57
  144. souleyez/integrations/wazuh/host_mapper.py +28 -36
  145. souleyez/integrations/wazuh/sync.py +78 -68
  146. souleyez/intelligence/__init__.py +4 -5
  147. souleyez/intelligence/correlation_analyzer.py +309 -295
  148. souleyez/intelligence/exploit_knowledge.py +661 -623
  149. souleyez/intelligence/exploit_suggestions.py +159 -139
  150. souleyez/intelligence/gap_analyzer.py +132 -97
  151. souleyez/intelligence/gap_detector.py +251 -214
  152. souleyez/intelligence/sensitive_tables.py +266 -129
  153. souleyez/intelligence/service_parser.py +137 -123
  154. souleyez/intelligence/surface_analyzer.py +407 -268
  155. souleyez/intelligence/target_parser.py +159 -162
  156. souleyez/licensing/__init__.py +6 -6
  157. souleyez/licensing/validator.py +17 -19
  158. souleyez/log_config.py +79 -54
  159. souleyez/main.py +1505 -687
  160. souleyez/migrations/fix_job_counter.py +16 -14
  161. souleyez/parsers/bloodhound_parser.py +41 -39
  162. souleyez/parsers/crackmapexec_parser.py +178 -111
  163. souleyez/parsers/dalfox_parser.py +72 -77
  164. souleyez/parsers/dnsrecon_parser.py +103 -91
  165. souleyez/parsers/enum4linux_parser.py +183 -153
  166. souleyez/parsers/ffuf_parser.py +29 -25
  167. souleyez/parsers/gobuster_parser.py +301 -41
  168. souleyez/parsers/hashcat_parser.py +324 -79
  169. souleyez/parsers/http_fingerprint_parser.py +350 -103
  170. souleyez/parsers/hydra_parser.py +131 -111
  171. souleyez/parsers/impacket_parser.py +231 -178
  172. souleyez/parsers/john_parser.py +98 -86
  173. souleyez/parsers/katana_parser.py +316 -0
  174. souleyez/parsers/msf_parser.py +943 -498
  175. souleyez/parsers/nikto_parser.py +346 -65
  176. souleyez/parsers/nmap_parser.py +262 -174
  177. souleyez/parsers/nuclei_parser.py +40 -44
  178. souleyez/parsers/responder_parser.py +26 -26
  179. souleyez/parsers/searchsploit_parser.py +74 -74
  180. souleyez/parsers/service_explorer_parser.py +279 -0
  181. souleyez/parsers/smbmap_parser.py +180 -124
  182. souleyez/parsers/sqlmap_parser.py +434 -308
  183. souleyez/parsers/theharvester_parser.py +75 -57
  184. souleyez/parsers/whois_parser.py +135 -94
  185. souleyez/parsers/wpscan_parser.py +278 -190
  186. souleyez/plugins/afp.py +44 -36
  187. souleyez/plugins/afp_brute.py +114 -46
  188. souleyez/plugins/ard.py +48 -37
  189. souleyez/plugins/bloodhound.py +95 -61
  190. souleyez/plugins/certipy.py +303 -0
  191. souleyez/plugins/crackmapexec.py +186 -85
  192. souleyez/plugins/dalfox.py +120 -59
  193. souleyez/plugins/dns_hijack.py +146 -41
  194. souleyez/plugins/dnsrecon.py +97 -61
  195. souleyez/plugins/enum4linux.py +91 -66
  196. souleyez/plugins/evil_winrm.py +291 -0
  197. souleyez/plugins/ffuf.py +166 -90
  198. souleyez/plugins/firmware_extract.py +133 -29
  199. souleyez/plugins/gobuster.py +387 -190
  200. souleyez/plugins/gpp_extract.py +393 -0
  201. souleyez/plugins/hashcat.py +100 -73
  202. souleyez/plugins/http_fingerprint.py +854 -267
  203. souleyez/plugins/hydra.py +566 -200
  204. souleyez/plugins/impacket_getnpusers.py +117 -69
  205. souleyez/plugins/impacket_psexec.py +84 -64
  206. souleyez/plugins/impacket_secretsdump.py +103 -69
  207. souleyez/plugins/impacket_smbclient.py +89 -75
  208. souleyez/plugins/john.py +86 -69
  209. souleyez/plugins/katana.py +313 -0
  210. souleyez/plugins/kerbrute.py +237 -0
  211. souleyez/plugins/lfi_extract.py +541 -0
  212. souleyez/plugins/macos_ssh.py +117 -48
  213. souleyez/plugins/mdns.py +35 -30
  214. souleyez/plugins/msf_auxiliary.py +253 -130
  215. souleyez/plugins/msf_exploit.py +239 -161
  216. souleyez/plugins/nikto.py +134 -78
  217. souleyez/plugins/nmap.py +275 -91
  218. souleyez/plugins/nuclei.py +180 -89
  219. souleyez/plugins/nxc.py +285 -0
  220. souleyez/plugins/plugin_base.py +35 -36
  221. souleyez/plugins/plugin_template.py +13 -5
  222. souleyez/plugins/rdp_sec_check.py +130 -0
  223. souleyez/plugins/responder.py +112 -71
  224. souleyez/plugins/router_http_brute.py +76 -65
  225. souleyez/plugins/router_ssh_brute.py +118 -41
  226. souleyez/plugins/router_telnet_brute.py +124 -42
  227. souleyez/plugins/routersploit.py +91 -59
  228. souleyez/plugins/routersploit_exploit.py +77 -55
  229. souleyez/plugins/searchsploit.py +91 -77
  230. souleyez/plugins/service_explorer.py +1160 -0
  231. souleyez/plugins/smbmap.py +122 -72
  232. souleyez/plugins/smbpasswd.py +215 -0
  233. souleyez/plugins/sqlmap.py +301 -113
  234. souleyez/plugins/theharvester.py +127 -75
  235. souleyez/plugins/tr069.py +79 -57
  236. souleyez/plugins/upnp.py +65 -47
  237. souleyez/plugins/upnp_abuse.py +73 -55
  238. souleyez/plugins/vnc_access.py +129 -42
  239. souleyez/plugins/vnc_brute.py +109 -38
  240. souleyez/plugins/web_login_test.py +417 -0
  241. souleyez/plugins/whois.py +77 -58
  242. souleyez/plugins/wpscan.py +173 -69
  243. souleyez/reporting/__init__.py +2 -1
  244. souleyez/reporting/attack_chain.py +411 -346
  245. souleyez/reporting/charts.py +436 -501
  246. souleyez/reporting/compliance_mappings.py +334 -201
  247. souleyez/reporting/detection_report.py +126 -125
  248. souleyez/reporting/formatters.py +828 -591
  249. souleyez/reporting/generator.py +386 -302
  250. souleyez/reporting/metrics.py +72 -75
  251. souleyez/scanner.py +35 -29
  252. souleyez/security/__init__.py +37 -11
  253. souleyez/security/scope_validator.py +175 -106
  254. souleyez/security/validation.py +223 -149
  255. souleyez/security.py +22 -6
  256. souleyez/storage/credentials.py +247 -186
  257. souleyez/storage/crypto.py +296 -129
  258. souleyez/storage/database.py +73 -50
  259. souleyez/storage/db.py +58 -36
  260. souleyez/storage/deliverable_evidence.py +177 -128
  261. souleyez/storage/deliverable_exporter.py +282 -246
  262. souleyez/storage/deliverable_templates.py +134 -116
  263. souleyez/storage/deliverables.py +135 -130
  264. souleyez/storage/engagements.py +109 -56
  265. souleyez/storage/evidence.py +181 -152
  266. souleyez/storage/execution_log.py +31 -17
  267. souleyez/storage/exploit_attempts.py +93 -57
  268. souleyez/storage/exploits.py +67 -36
  269. souleyez/storage/findings.py +48 -61
  270. souleyez/storage/hosts.py +176 -144
  271. souleyez/storage/migrate_to_engagements.py +43 -19
  272. souleyez/storage/migrations/_001_add_credential_enhancements.py +22 -12
  273. souleyez/storage/migrations/_002_add_status_tracking.py +10 -7
  274. souleyez/storage/migrations/_003_add_execution_log.py +14 -8
  275. souleyez/storage/migrations/_005_screenshots.py +13 -5
  276. souleyez/storage/migrations/_006_deliverables.py +13 -5
  277. souleyez/storage/migrations/_007_deliverable_templates.py +12 -7
  278. souleyez/storage/migrations/_008_add_nuclei_table.py +10 -4
  279. souleyez/storage/migrations/_010_evidence_linking.py +17 -10
  280. souleyez/storage/migrations/_011_timeline_tracking.py +20 -13
  281. souleyez/storage/migrations/_012_team_collaboration.py +34 -21
  282. souleyez/storage/migrations/_013_add_host_tags.py +12 -6
  283. souleyez/storage/migrations/_014_exploit_attempts.py +22 -10
  284. souleyez/storage/migrations/_015_add_mac_os_fields.py +15 -7
  285. souleyez/storage/migrations/_016_add_domain_field.py +10 -4
  286. souleyez/storage/migrations/_017_msf_sessions.py +16 -8
  287. souleyez/storage/migrations/_018_add_osint_target.py +10 -6
  288. souleyez/storage/migrations/_019_add_engagement_type.py +10 -6
  289. souleyez/storage/migrations/_020_add_rbac.py +36 -15
  290. souleyez/storage/migrations/_021_wazuh_integration.py +20 -8
  291. souleyez/storage/migrations/_022_wazuh_indexer_columns.py +6 -4
  292. souleyez/storage/migrations/_023_fix_detection_results_fk.py +16 -6
  293. souleyez/storage/migrations/_024_wazuh_vulnerabilities.py +26 -10
  294. souleyez/storage/migrations/_025_multi_siem_support.py +3 -5
  295. souleyez/storage/migrations/_026_add_engagement_scope.py +31 -12
  296. souleyez/storage/migrations/_027_multi_siem_persistence.py +32 -15
  297. souleyez/storage/migrations/__init__.py +26 -26
  298. souleyez/storage/migrations/migration_manager.py +19 -19
  299. souleyez/storage/msf_sessions.py +100 -65
  300. souleyez/storage/osint.py +17 -24
  301. souleyez/storage/recommendation_engine.py +269 -235
  302. souleyez/storage/screenshots.py +33 -32
  303. souleyez/storage/smb_shares.py +136 -92
  304. souleyez/storage/sqlmap_data.py +183 -128
  305. souleyez/storage/team_collaboration.py +135 -141
  306. souleyez/storage/timeline_tracker.py +122 -94
  307. souleyez/storage/wazuh_vulns.py +64 -66
  308. souleyez/storage/web_paths.py +33 -37
  309. souleyez/testing/credential_tester.py +221 -205
  310. souleyez/ui/__init__.py +1 -1
  311. souleyez/ui/ai_quotes.py +12 -12
  312. souleyez/ui/attack_surface.py +2439 -1516
  313. souleyez/ui/chain_rules_view.py +914 -382
  314. souleyez/ui/correlation_view.py +312 -230
  315. souleyez/ui/dashboard.py +2382 -1130
  316. souleyez/ui/deliverables_view.py +148 -62
  317. souleyez/ui/design_system.py +13 -13
  318. souleyez/ui/errors.py +49 -49
  319. souleyez/ui/evidence_linking_view.py +284 -179
  320. souleyez/ui/evidence_vault.py +393 -285
  321. souleyez/ui/exploit_suggestions_view.py +555 -349
  322. souleyez/ui/export_view.py +100 -66
  323. souleyez/ui/gap_analysis_view.py +315 -171
  324. souleyez/ui/help_system.py +105 -97
  325. souleyez/ui/intelligence_view.py +436 -293
  326. souleyez/ui/interactive.py +23434 -10286
  327. souleyez/ui/interactive_selector.py +75 -68
  328. souleyez/ui/log_formatter.py +47 -39
  329. souleyez/ui/menu_components.py +22 -13
  330. souleyez/ui/msf_auxiliary_menu.py +184 -133
  331. souleyez/ui/pending_chains_view.py +336 -172
  332. souleyez/ui/progress_indicators.py +5 -3
  333. souleyez/ui/recommendations_view.py +195 -137
  334. souleyez/ui/rule_builder.py +343 -225
  335. souleyez/ui/setup_wizard.py +678 -284
  336. souleyez/ui/shortcuts.py +217 -165
  337. souleyez/ui/splunk_gap_analysis_view.py +452 -270
  338. souleyez/ui/splunk_vulns_view.py +139 -86
  339. souleyez/ui/team_dashboard.py +498 -335
  340. souleyez/ui/template_selector.py +196 -105
  341. souleyez/ui/terminal.py +6 -6
  342. souleyez/ui/timeline_view.py +198 -127
  343. souleyez/ui/tool_setup.py +264 -164
  344. souleyez/ui/tutorial.py +202 -72
  345. souleyez/ui/tutorial_state.py +40 -40
  346. souleyez/ui/wazuh_vulns_view.py +235 -141
  347. souleyez/ui/wordlist_browser.py +260 -107
  348. souleyez/ui.py +464 -312
  349. souleyez/utils/tool_checker.py +427 -367
  350. souleyez/utils.py +33 -29
  351. souleyez/wordlists.py +134 -167
  352. {souleyez-2.43.26.dist-info → souleyez-2.43.34.dist-info}/METADATA +1 -1
  353. souleyez-2.43.34.dist-info/RECORD +443 -0
  354. {souleyez-2.43.26.dist-info → souleyez-2.43.34.dist-info}/WHEEL +1 -1
  355. souleyez-2.43.26.dist-info/RECORD +0 -379
  356. {souleyez-2.43.26.dist-info → souleyez-2.43.34.dist-info}/entry_points.txt +0 -0
  357. {souleyez-2.43.26.dist-info → souleyez-2.43.34.dist-info}/licenses/LICENSE +0 -0
  358. {souleyez-2.43.26.dist-info → souleyez-2.43.34.dist-info}/top_level.txt +0 -0
@@ -8,258 +8,391 @@ from typing import Dict, List, Set
8
8
 
9
9
  class ComplianceMappings:
10
10
  """Map findings to compliance frameworks."""
11
-
11
+
12
12
  def __init__(self):
13
13
  # OWASP Top 10 2021 keyword mappings
14
14
  self.owasp_mappings = {
15
- 'A01:2021': {
16
- 'name': 'Broken Access Control',
17
- 'keywords': [
18
- 'access control', 'authorization', 'privilege escalation',
19
- 'directory traversal', 'path traversal', 'file inclusion',
20
- 'idor', 'insecure direct object', 'force browsing',
21
- 'missing authorization', 'cors', 'elevation of privilege'
22
- ]
23
- },
24
- 'A02:2021': {
25
- 'name': 'Cryptographic Failures',
26
- 'keywords': [
27
- 'encryption', 'weak cipher', 'ssl', 'tls', 'https',
28
- 'cryptographic', 'weak hash', 'md5', 'sha1', 'des',
29
- 'plaintext', 'clear text', 'sensitive data', 'pii',
30
- 'password storage', 'weak encryption'
31
- ]
32
- },
33
- 'A03:2021': {
34
- 'name': 'Injection',
35
- 'keywords': [
36
- 'sql injection', 'sqli', 'command injection', 'ldap injection',
37
- 'xpath injection', 'xml injection', 'nosql injection',
38
- 'os command', 'code injection', 'script injection',
39
- 'blind sql', 'union select', 'shell injection'
40
- ]
41
- },
42
- 'A04:2021': {
43
- 'name': 'Insecure Design',
44
- 'keywords': [
45
- 'insecure design', 'threat modeling', 'design flaw',
46
- 'architecture', 'security pattern', 'secure by design',
47
- 'business logic', 'logic flaw'
48
- ]
49
- },
50
- 'A05:2021': {
51
- 'name': 'Security Misconfiguration',
52
- 'keywords': [
53
- 'misconfiguration', 'default', 'unnecessary feature',
54
- 'verbose error', 'stack trace', 'information disclosure',
55
- 'debug', 'unused', 'unpatched', 'outdated',
56
- 'directory listing', 'server banner', 'version disclosure'
57
- ]
58
- },
59
- 'A06:2021': {
60
- 'name': 'Vulnerable and Outdated Components',
61
- 'keywords': [
62
- 'outdated', 'vulnerable component', 'cve', 'known vulnerability',
63
- 'old version', 'unpatched', 'vulnerable library',
64
- 'dependency', 'third party', 'component'
65
- ]
66
- },
67
- 'A07:2021': {
68
- 'name': 'Identification and Authentication Failures',
69
- 'keywords': [
70
- 'authentication', 'weak password', 'credential',
71
- 'session', 'brute force', 'password policy',
72
- 'default credentials', 'session fixation', 'session hijack',
73
- 'login', 'authentication bypass', 'weak credentials'
74
- ]
75
- },
76
- 'A08:2021': {
77
- 'name': 'Software and Data Integrity Failures',
78
- 'keywords': [
79
- 'integrity', 'deserialization', 'untrusted data',
80
- 'pipeline', 'update', 'auto-update', 'insecure deserialization',
81
- 'code signing', 'tamper'
82
- ]
83
- },
84
- 'A09:2021': {
85
- 'name': 'Security Logging and Monitoring Failures',
86
- 'keywords': [
87
- 'logging', 'monitoring', 'audit', 'log',
88
- 'alerting', 'detection', 'incident response',
89
- 'insufficient logging', 'no logging'
90
- ]
91
- },
92
- 'A10:2021': {
93
- 'name': 'Server-Side Request Forgery (SSRF)',
94
- 'keywords': [
95
- 'ssrf', 'server-side request forgery', 'request forgery',
96
- 'internal network', 'localhost', 'metadata'
97
- ]
98
- }
15
+ "A01:2021": {
16
+ "name": "Broken Access Control",
17
+ "keywords": [
18
+ "access control",
19
+ "authorization",
20
+ "privilege escalation",
21
+ "directory traversal",
22
+ "path traversal",
23
+ "file inclusion",
24
+ "idor",
25
+ "insecure direct object",
26
+ "force browsing",
27
+ "missing authorization",
28
+ "cors",
29
+ "elevation of privilege",
30
+ ],
31
+ },
32
+ "A02:2021": {
33
+ "name": "Cryptographic Failures",
34
+ "keywords": [
35
+ "encryption",
36
+ "weak cipher",
37
+ "ssl",
38
+ "tls",
39
+ "https",
40
+ "cryptographic",
41
+ "weak hash",
42
+ "md5",
43
+ "sha1",
44
+ "des",
45
+ "plaintext",
46
+ "clear text",
47
+ "sensitive data",
48
+ "pii",
49
+ "password storage",
50
+ "weak encryption",
51
+ ],
52
+ },
53
+ "A03:2021": {
54
+ "name": "Injection",
55
+ "keywords": [
56
+ "sql injection",
57
+ "sqli",
58
+ "command injection",
59
+ "ldap injection",
60
+ "xpath injection",
61
+ "xml injection",
62
+ "nosql injection",
63
+ "os command",
64
+ "code injection",
65
+ "script injection",
66
+ "blind sql",
67
+ "union select",
68
+ "shell injection",
69
+ ],
70
+ },
71
+ "A04:2021": {
72
+ "name": "Insecure Design",
73
+ "keywords": [
74
+ "insecure design",
75
+ "threat modeling",
76
+ "design flaw",
77
+ "architecture",
78
+ "security pattern",
79
+ "secure by design",
80
+ "business logic",
81
+ "logic flaw",
82
+ ],
83
+ },
84
+ "A05:2021": {
85
+ "name": "Security Misconfiguration",
86
+ "keywords": [
87
+ "misconfiguration",
88
+ "default",
89
+ "unnecessary feature",
90
+ "verbose error",
91
+ "stack trace",
92
+ "information disclosure",
93
+ "debug",
94
+ "unused",
95
+ "unpatched",
96
+ "outdated",
97
+ "directory listing",
98
+ "server banner",
99
+ "version disclosure",
100
+ ],
101
+ },
102
+ "A06:2021": {
103
+ "name": "Vulnerable and Outdated Components",
104
+ "keywords": [
105
+ "outdated",
106
+ "vulnerable component",
107
+ "cve",
108
+ "known vulnerability",
109
+ "old version",
110
+ "unpatched",
111
+ "vulnerable library",
112
+ "dependency",
113
+ "third party",
114
+ "component",
115
+ ],
116
+ },
117
+ "A07:2021": {
118
+ "name": "Identification and Authentication Failures",
119
+ "keywords": [
120
+ "authentication",
121
+ "weak password",
122
+ "credential",
123
+ "session",
124
+ "brute force",
125
+ "password policy",
126
+ "default credentials",
127
+ "session fixation",
128
+ "session hijack",
129
+ "login",
130
+ "authentication bypass",
131
+ "weak credentials",
132
+ ],
133
+ },
134
+ "A08:2021": {
135
+ "name": "Software and Data Integrity Failures",
136
+ "keywords": [
137
+ "integrity",
138
+ "deserialization",
139
+ "untrusted data",
140
+ "pipeline",
141
+ "update",
142
+ "auto-update",
143
+ "insecure deserialization",
144
+ "code signing",
145
+ "tamper",
146
+ ],
147
+ },
148
+ "A09:2021": {
149
+ "name": "Security Logging and Monitoring Failures",
150
+ "keywords": [
151
+ "logging",
152
+ "monitoring",
153
+ "audit",
154
+ "log",
155
+ "alerting",
156
+ "detection",
157
+ "incident response",
158
+ "insufficient logging",
159
+ "no logging",
160
+ ],
161
+ },
162
+ "A10:2021": {
163
+ "name": "Server-Side Request Forgery (SSRF)",
164
+ "keywords": [
165
+ "ssrf",
166
+ "server-side request forgery",
167
+ "request forgery",
168
+ "internal network",
169
+ "localhost",
170
+ "metadata",
171
+ ],
172
+ },
99
173
  }
100
-
174
+
101
175
  # CWE Top 25 2024 mappings
102
176
  self.cwe_mappings = {
103
- 'CWE-89': {
104
- 'name': 'SQL Injection',
105
- 'keywords': ['sql injection', 'sqli', 'union select', 'blind sql']
106
- },
107
- 'CWE-79': {
108
- 'name': 'Cross-site Scripting (XSS)',
109
- 'keywords': ['xss', 'cross-site scripting', 'javascript injection', 'reflected xss', 'stored xss']
110
- },
111
- 'CWE-78': {
112
- 'name': 'OS Command Injection',
113
- 'keywords': ['command injection', 'os command', 'shell injection', 'rce']
114
- },
115
- 'CWE-22': {
116
- 'name': 'Path Traversal',
117
- 'keywords': ['path traversal', 'directory traversal', '../', 'file inclusion', 'lfi']
118
- },
119
- 'CWE-352': {
120
- 'name': 'Cross-Site Request Forgery (CSRF)',
121
- 'keywords': ['csrf', 'cross-site request forgery', 'xsrf']
122
- },
123
- 'CWE-434': {
124
- 'name': 'Unrestricted Upload of Dangerous File',
125
- 'keywords': ['file upload', 'upload vulnerability', 'unrestricted upload']
126
- },
127
- 'CWE-862': {
128
- 'name': 'Missing Authorization',
129
- 'keywords': ['missing authorization', 'authorization bypass', 'idor']
130
- },
131
- 'CWE-798': {
132
- 'name': 'Hard-coded Credentials',
133
- 'keywords': ['hardcoded', 'hard-coded', 'default credentials', 'embedded password']
134
- },
135
- 'CWE-287': {
136
- 'name': 'Improper Authentication',
137
- 'keywords': ['authentication bypass', 'weak authentication', 'broken auth']
138
- },
139
- 'CWE-190': {
140
- 'name': 'Integer Overflow',
141
- 'keywords': ['integer overflow', 'buffer overflow', 'overflow']
142
- },
143
- 'CWE-502': {
144
- 'name': 'Deserialization of Untrusted Data',
145
- 'keywords': ['deserialization', 'untrusted data', 'insecure deserialization']
146
- },
147
- 'CWE-611': {
148
- 'name': 'XML External Entity (XXE)',
149
- 'keywords': ['xxe', 'xml external entity', 'xml injection']
150
- },
151
- 'CWE-918': {
152
- 'name': 'Server-Side Request Forgery (SSRF)',
153
- 'keywords': ['ssrf', 'server-side request forgery']
154
- },
155
- 'CWE-94': {
156
- 'name': 'Code Injection',
157
- 'keywords': ['code injection', 'remote code execution', 'rce']
158
- },
159
- 'CWE-269': {
160
- 'name': 'Improper Privilege Management',
161
- 'keywords': ['privilege escalation', 'elevation of privilege', 'privilege management']
162
- },
163
- 'CWE-200': {
164
- 'name': 'Information Disclosure',
165
- 'keywords': ['information disclosure', 'sensitive data', 'data exposure', 'verbose error']
166
- },
167
- 'CWE-522': {
168
- 'name': 'Insufficiently Protected Credentials',
169
- 'keywords': ['weak password', 'password policy', 'credential protection']
170
- },
171
- 'CWE-306': {
172
- 'name': 'Missing Authentication',
173
- 'keywords': ['missing authentication', 'no authentication', 'unauthenticated']
174
- },
175
- 'CWE-319': {
176
- 'name': 'Cleartext Transmission of Sensitive Information',
177
- 'keywords': ['cleartext', 'plain text', 'unencrypted', 'http']
178
- },
179
- 'CWE-326': {
180
- 'name': 'Inadequate Encryption Strength',
181
- 'keywords': ['weak encryption', 'weak cipher', 'des', 'md5', 'sha1']
182
- }
177
+ "CWE-89": {
178
+ "name": "SQL Injection",
179
+ "keywords": ["sql injection", "sqli", "union select", "blind sql"],
180
+ },
181
+ "CWE-79": {
182
+ "name": "Cross-site Scripting (XSS)",
183
+ "keywords": [
184
+ "xss",
185
+ "cross-site scripting",
186
+ "javascript injection",
187
+ "reflected xss",
188
+ "stored xss",
189
+ ],
190
+ },
191
+ "CWE-78": {
192
+ "name": "OS Command Injection",
193
+ "keywords": [
194
+ "command injection",
195
+ "os command",
196
+ "shell injection",
197
+ "rce",
198
+ ],
199
+ },
200
+ "CWE-22": {
201
+ "name": "Path Traversal",
202
+ "keywords": [
203
+ "path traversal",
204
+ "directory traversal",
205
+ "../",
206
+ "file inclusion",
207
+ "lfi",
208
+ ],
209
+ },
210
+ "CWE-352": {
211
+ "name": "Cross-Site Request Forgery (CSRF)",
212
+ "keywords": ["csrf", "cross-site request forgery", "xsrf"],
213
+ },
214
+ "CWE-434": {
215
+ "name": "Unrestricted Upload of Dangerous File",
216
+ "keywords": [
217
+ "file upload",
218
+ "upload vulnerability",
219
+ "unrestricted upload",
220
+ ],
221
+ },
222
+ "CWE-862": {
223
+ "name": "Missing Authorization",
224
+ "keywords": ["missing authorization", "authorization bypass", "idor"],
225
+ },
226
+ "CWE-798": {
227
+ "name": "Hard-coded Credentials",
228
+ "keywords": [
229
+ "hardcoded",
230
+ "hard-coded",
231
+ "default credentials",
232
+ "embedded password",
233
+ ],
234
+ },
235
+ "CWE-287": {
236
+ "name": "Improper Authentication",
237
+ "keywords": [
238
+ "authentication bypass",
239
+ "weak authentication",
240
+ "broken auth",
241
+ ],
242
+ },
243
+ "CWE-190": {
244
+ "name": "Integer Overflow",
245
+ "keywords": ["integer overflow", "buffer overflow", "overflow"],
246
+ },
247
+ "CWE-502": {
248
+ "name": "Deserialization of Untrusted Data",
249
+ "keywords": [
250
+ "deserialization",
251
+ "untrusted data",
252
+ "insecure deserialization",
253
+ ],
254
+ },
255
+ "CWE-611": {
256
+ "name": "XML External Entity (XXE)",
257
+ "keywords": ["xxe", "xml external entity", "xml injection"],
258
+ },
259
+ "CWE-918": {
260
+ "name": "Server-Side Request Forgery (SSRF)",
261
+ "keywords": ["ssrf", "server-side request forgery"],
262
+ },
263
+ "CWE-94": {
264
+ "name": "Code Injection",
265
+ "keywords": ["code injection", "remote code execution", "rce"],
266
+ },
267
+ "CWE-269": {
268
+ "name": "Improper Privilege Management",
269
+ "keywords": [
270
+ "privilege escalation",
271
+ "elevation of privilege",
272
+ "privilege management",
273
+ ],
274
+ },
275
+ "CWE-200": {
276
+ "name": "Information Disclosure",
277
+ "keywords": [
278
+ "information disclosure",
279
+ "sensitive data",
280
+ "data exposure",
281
+ "verbose error",
282
+ ],
283
+ },
284
+ "CWE-522": {
285
+ "name": "Insufficiently Protected Credentials",
286
+ "keywords": [
287
+ "weak password",
288
+ "password policy",
289
+ "credential protection",
290
+ ],
291
+ },
292
+ "CWE-306": {
293
+ "name": "Missing Authentication",
294
+ "keywords": [
295
+ "missing authentication",
296
+ "no authentication",
297
+ "unauthenticated",
298
+ ],
299
+ },
300
+ "CWE-319": {
301
+ "name": "Cleartext Transmission of Sensitive Information",
302
+ "keywords": ["cleartext", "plain text", "unencrypted", "http"],
303
+ },
304
+ "CWE-326": {
305
+ "name": "Inadequate Encryption Strength",
306
+ "keywords": ["weak encryption", "weak cipher", "des", "md5", "sha1"],
307
+ },
183
308
  }
184
-
309
+
185
310
  def map_finding_to_owasp(self, finding: Dict) -> List[str]:
186
311
  """Map a finding to OWASP Top 10 2021 categories."""
187
312
  matches = []
188
-
313
+
189
314
  # Combine title, description, and tool for keyword matching
190
315
  search_text = (
191
316
  f"{finding.get('title', '')} "
192
317
  f"{finding.get('description', '')} "
193
318
  f"{finding.get('tool', '')}"
194
319
  ).lower()
195
-
320
+
196
321
  for owasp_id, owasp_data in self.owasp_mappings.items():
197
- for keyword in owasp_data['keywords']:
322
+ for keyword in owasp_data["keywords"]:
198
323
  if keyword.lower() in search_text:
199
324
  matches.append(owasp_id)
200
325
  break # Only match once per category
201
-
326
+
202
327
  return matches
203
-
328
+
204
329
  def map_finding_to_cwe(self, finding: Dict) -> List[str]:
205
330
  """Map a finding to CWE Top 25 categories."""
206
331
  matches = []
207
-
332
+
208
333
  # Check if finding already has CWE
209
- if finding.get('cwe'):
210
- existing_cwe = finding['cwe'].upper()
211
- if existing_cwe.startswith('CWE-'):
334
+ if finding.get("cwe"):
335
+ existing_cwe = finding["cwe"].upper()
336
+ if existing_cwe.startswith("CWE-"):
212
337
  matches.append(existing_cwe)
213
-
338
+
214
339
  # Combine title, description, and tool for keyword matching
215
340
  search_text = (
216
341
  f"{finding.get('title', '')} "
217
342
  f"{finding.get('description', '')} "
218
343
  f"{finding.get('tool', '')}"
219
344
  ).lower()
220
-
345
+
221
346
  for cwe_id, cwe_data in self.cwe_mappings.items():
222
347
  if cwe_id in matches:
223
348
  continue # Already have this CWE
224
-
225
- for keyword in cwe_data['keywords']:
349
+
350
+ for keyword in cwe_data["keywords"]:
226
351
  if keyword.lower() in search_text:
227
352
  matches.append(cwe_id)
228
353
  break # Only match once per category
229
-
354
+
230
355
  return matches
231
-
356
+
232
357
  def get_compliance_coverage(self, findings: List[Dict]) -> Dict:
233
358
  """Calculate compliance framework coverage."""
234
359
  owasp_covered = set()
235
360
  cwe_covered = set()
236
-
361
+
237
362
  for finding in findings:
238
363
  owasp_matches = self.map_finding_to_owasp(finding)
239
364
  cwe_matches = self.map_finding_to_cwe(finding)
240
-
365
+
241
366
  owasp_covered.update(owasp_matches)
242
367
  cwe_covered.update(cwe_matches)
243
-
368
+
244
369
  return {
245
- 'owasp': {
246
- 'covered': sorted(list(owasp_covered)),
247
- 'total': len(self.owasp_mappings),
248
- 'coverage_percent': round(len(owasp_covered) / len(self.owasp_mappings) * 100, 1),
249
- 'gaps': sorted([k for k in self.owasp_mappings.keys() if k not in owasp_covered])
250
- },
251
- 'cwe': {
252
- 'covered': sorted(list(cwe_covered)),
253
- 'total': len(self.cwe_mappings),
254
- 'coverage_percent': round(len(cwe_covered) / len(self.cwe_mappings) * 100, 1),
255
- 'gaps': sorted([k for k in self.cwe_mappings.keys() if k not in cwe_covered])
256
- }
370
+ "owasp": {
371
+ "covered": sorted(list(owasp_covered)),
372
+ "total": len(self.owasp_mappings),
373
+ "coverage_percent": round(
374
+ len(owasp_covered) / len(self.owasp_mappings) * 100, 1
375
+ ),
376
+ "gaps": sorted(
377
+ [k for k in self.owasp_mappings.keys() if k not in owasp_covered]
378
+ ),
379
+ },
380
+ "cwe": {
381
+ "covered": sorted(list(cwe_covered)),
382
+ "total": len(self.cwe_mappings),
383
+ "coverage_percent": round(
384
+ len(cwe_covered) / len(self.cwe_mappings) * 100, 1
385
+ ),
386
+ "gaps": sorted(
387
+ [k for k in self.cwe_mappings.keys() if k not in cwe_covered]
388
+ ),
389
+ },
257
390
  }
258
-
391
+
259
392
  def get_owasp_name(self, owasp_id: str) -> str:
260
393
  """Get full name for OWASP ID."""
261
- return self.owasp_mappings.get(owasp_id, {}).get('name', owasp_id)
262
-
394
+ return self.owasp_mappings.get(owasp_id, {}).get("name", owasp_id)
395
+
263
396
  def get_cwe_name(self, cwe_id: str) -> str:
264
397
  """Get full name for CWE ID."""
265
- return self.cwe_mappings.get(cwe_id, {}).get('name', cwe_id)
398
+ return self.cwe_mappings.get(cwe_id, {}).get("name", cwe_id)