souleyez 2.43.29__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.
- souleyez/__init__.py +1 -2
- souleyez/ai/__init__.py +21 -15
- souleyez/ai/action_mapper.py +249 -150
- souleyez/ai/chain_advisor.py +116 -100
- souleyez/ai/claude_provider.py +29 -28
- souleyez/ai/context_builder.py +80 -62
- souleyez/ai/executor.py +158 -117
- souleyez/ai/feedback_handler.py +136 -121
- souleyez/ai/llm_factory.py +27 -20
- souleyez/ai/llm_provider.py +4 -2
- souleyez/ai/ollama_provider.py +6 -9
- souleyez/ai/ollama_service.py +44 -37
- souleyez/ai/path_scorer.py +91 -76
- souleyez/ai/recommender.py +176 -144
- souleyez/ai/report_context.py +74 -73
- souleyez/ai/report_service.py +84 -66
- souleyez/ai/result_parser.py +222 -229
- souleyez/ai/safety.py +67 -44
- souleyez/auth/__init__.py +23 -22
- souleyez/auth/audit.py +36 -26
- souleyez/auth/engagement_access.py +65 -48
- souleyez/auth/permissions.py +14 -3
- souleyez/auth/session_manager.py +54 -37
- souleyez/auth/user_manager.py +109 -64
- souleyez/commands/audit.py +40 -43
- souleyez/commands/auth.py +35 -15
- souleyez/commands/deliverables.py +55 -50
- souleyez/commands/engagement.py +47 -28
- souleyez/commands/license.py +32 -23
- souleyez/commands/screenshots.py +36 -32
- souleyez/commands/user.py +82 -36
- souleyez/config.py +52 -44
- souleyez/core/credential_tester.py +87 -81
- souleyez/core/cve_mappings.py +179 -192
- souleyez/core/cve_matcher.py +162 -148
- souleyez/core/msf_auto_mapper.py +100 -83
- souleyez/core/msf_chain_engine.py +294 -256
- souleyez/core/msf_database.py +153 -70
- souleyez/core/msf_integration.py +679 -673
- souleyez/core/msf_rpc_client.py +40 -42
- souleyez/core/msf_rpc_manager.py +77 -79
- souleyez/core/msf_sync_manager.py +241 -181
- souleyez/core/network_utils.py +22 -15
- souleyez/core/parser_handler.py +34 -25
- souleyez/core/pending_chains.py +114 -63
- souleyez/core/templates.py +158 -107
- souleyez/core/tool_chaining.py +9526 -2879
- souleyez/core/version_utils.py +79 -94
- souleyez/core/vuln_correlation.py +136 -89
- souleyez/core/web_utils.py +33 -32
- souleyez/data/wordlists/ad_users.txt +378 -0
- souleyez/data/wordlists/api_endpoints_large.txt +769 -0
- souleyez/data/wordlists/home_dir_sensitive.txt +39 -0
- souleyez/data/wordlists/lfi_payloads.txt +82 -0
- souleyez/data/wordlists/passwords_brute.txt +1548 -0
- souleyez/data/wordlists/passwords_crack.txt +2479 -0
- souleyez/data/wordlists/passwords_spray.txt +386 -0
- souleyez/data/wordlists/subdomains_large.txt +5057 -0
- souleyez/data/wordlists/usernames_common.txt +694 -0
- souleyez/data/wordlists/web_dirs_large.txt +4769 -0
- souleyez/detection/__init__.py +1 -1
- souleyez/detection/attack_signatures.py +12 -17
- souleyez/detection/mitre_mappings.py +61 -55
- souleyez/detection/validator.py +97 -86
- souleyez/devtools.py +23 -10
- souleyez/docs/README.md +4 -4
- souleyez/docs/api-reference/cli-commands.md +2 -2
- souleyez/docs/developer-guide/adding-new-tools.md +562 -0
- souleyez/docs/user-guide/auto-chaining.md +30 -8
- souleyez/docs/user-guide/getting-started.md +1 -1
- souleyez/docs/user-guide/installation.md +26 -3
- souleyez/docs/user-guide/metasploit-integration.md +2 -2
- souleyez/docs/user-guide/rbac.md +1 -1
- souleyez/docs/user-guide/scope-management.md +1 -1
- souleyez/docs/user-guide/siem-integration.md +1 -1
- souleyez/docs/user-guide/tools-reference.md +1 -8
- souleyez/docs/user-guide/worker-management.md +1 -1
- souleyez/engine/background.py +1239 -535
- souleyez/engine/base.py +4 -1
- souleyez/engine/job_status.py +17 -49
- souleyez/engine/log_sanitizer.py +103 -77
- souleyez/engine/manager.py +38 -7
- souleyez/engine/result_handler.py +2200 -1550
- souleyez/engine/worker_manager.py +50 -41
- souleyez/export/evidence_bundle.py +72 -62
- souleyez/feature_flags/features.py +16 -20
- souleyez/feature_flags.py +5 -9
- souleyez/handlers/__init__.py +11 -0
- souleyez/handlers/base.py +188 -0
- souleyez/handlers/bash_handler.py +277 -0
- souleyez/handlers/bloodhound_handler.py +243 -0
- souleyez/handlers/certipy_handler.py +311 -0
- souleyez/handlers/crackmapexec_handler.py +486 -0
- souleyez/handlers/dnsrecon_handler.py +344 -0
- souleyez/handlers/enum4linux_handler.py +400 -0
- souleyez/handlers/evil_winrm_handler.py +493 -0
- souleyez/handlers/ffuf_handler.py +815 -0
- souleyez/handlers/gobuster_handler.py +1114 -0
- souleyez/handlers/gpp_extract_handler.py +334 -0
- souleyez/handlers/hashcat_handler.py +444 -0
- souleyez/handlers/hydra_handler.py +563 -0
- souleyez/handlers/impacket_getuserspns_handler.py +343 -0
- souleyez/handlers/impacket_psexec_handler.py +222 -0
- souleyez/handlers/impacket_secretsdump_handler.py +426 -0
- souleyez/handlers/john_handler.py +286 -0
- souleyez/handlers/katana_handler.py +425 -0
- souleyez/handlers/kerbrute_handler.py +298 -0
- souleyez/handlers/ldapsearch_handler.py +636 -0
- souleyez/handlers/lfi_extract_handler.py +464 -0
- souleyez/handlers/msf_auxiliary_handler.py +408 -0
- souleyez/handlers/msf_exploit_handler.py +380 -0
- souleyez/handlers/nikto_handler.py +413 -0
- souleyez/handlers/nmap_handler.py +821 -0
- souleyez/handlers/nuclei_handler.py +359 -0
- souleyez/handlers/nxc_handler.py +371 -0
- souleyez/handlers/rdp_sec_check_handler.py +353 -0
- souleyez/handlers/registry.py +292 -0
- souleyez/handlers/responder_handler.py +232 -0
- souleyez/handlers/service_explorer_handler.py +434 -0
- souleyez/handlers/smbclient_handler.py +344 -0
- souleyez/handlers/smbmap_handler.py +510 -0
- souleyez/handlers/smbpasswd_handler.py +296 -0
- souleyez/handlers/sqlmap_handler.py +1116 -0
- souleyez/handlers/theharvester_handler.py +601 -0
- souleyez/handlers/web_login_test_handler.py +327 -0
- souleyez/handlers/whois_handler.py +277 -0
- souleyez/handlers/wpscan_handler.py +554 -0
- souleyez/history.py +32 -16
- souleyez/importers/msf_importer.py +106 -75
- souleyez/importers/smart_importer.py +208 -147
- souleyez/integrations/siem/__init__.py +10 -10
- souleyez/integrations/siem/base.py +17 -18
- souleyez/integrations/siem/elastic.py +108 -122
- souleyez/integrations/siem/factory.py +207 -80
- souleyez/integrations/siem/googlesecops.py +146 -154
- souleyez/integrations/siem/rule_mappings/__init__.py +1 -1
- souleyez/integrations/siem/rule_mappings/wazuh_rules.py +8 -5
- souleyez/integrations/siem/sentinel.py +107 -109
- souleyez/integrations/siem/splunk.py +246 -212
- souleyez/integrations/siem/wazuh.py +65 -71
- souleyez/integrations/wazuh/__init__.py +5 -5
- souleyez/integrations/wazuh/client.py +70 -93
- souleyez/integrations/wazuh/config.py +85 -57
- souleyez/integrations/wazuh/host_mapper.py +28 -36
- souleyez/integrations/wazuh/sync.py +78 -68
- souleyez/intelligence/__init__.py +4 -5
- souleyez/intelligence/correlation_analyzer.py +309 -295
- souleyez/intelligence/exploit_knowledge.py +661 -623
- souleyez/intelligence/exploit_suggestions.py +159 -139
- souleyez/intelligence/gap_analyzer.py +132 -97
- souleyez/intelligence/gap_detector.py +251 -214
- souleyez/intelligence/sensitive_tables.py +266 -129
- souleyez/intelligence/service_parser.py +137 -123
- souleyez/intelligence/surface_analyzer.py +407 -268
- souleyez/intelligence/target_parser.py +159 -162
- souleyez/licensing/__init__.py +6 -6
- souleyez/licensing/validator.py +17 -19
- souleyez/log_config.py +79 -54
- souleyez/main.py +1505 -687
- souleyez/migrations/fix_job_counter.py +16 -14
- souleyez/parsers/bloodhound_parser.py +41 -39
- souleyez/parsers/crackmapexec_parser.py +178 -111
- souleyez/parsers/dalfox_parser.py +72 -77
- souleyez/parsers/dnsrecon_parser.py +103 -91
- souleyez/parsers/enum4linux_parser.py +183 -153
- souleyez/parsers/ffuf_parser.py +29 -25
- souleyez/parsers/gobuster_parser.py +301 -41
- souleyez/parsers/hashcat_parser.py +324 -79
- souleyez/parsers/http_fingerprint_parser.py +350 -103
- souleyez/parsers/hydra_parser.py +131 -111
- souleyez/parsers/impacket_parser.py +231 -178
- souleyez/parsers/john_parser.py +98 -86
- souleyez/parsers/katana_parser.py +316 -0
- souleyez/parsers/msf_parser.py +943 -498
- souleyez/parsers/nikto_parser.py +346 -65
- souleyez/parsers/nmap_parser.py +262 -174
- souleyez/parsers/nuclei_parser.py +40 -44
- souleyez/parsers/responder_parser.py +26 -26
- souleyez/parsers/searchsploit_parser.py +74 -74
- souleyez/parsers/service_explorer_parser.py +279 -0
- souleyez/parsers/smbmap_parser.py +180 -124
- souleyez/parsers/sqlmap_parser.py +434 -308
- souleyez/parsers/theharvester_parser.py +75 -57
- souleyez/parsers/whois_parser.py +135 -94
- souleyez/parsers/wpscan_parser.py +278 -190
- souleyez/plugins/afp.py +44 -36
- souleyez/plugins/afp_brute.py +114 -46
- souleyez/plugins/ard.py +48 -37
- souleyez/plugins/bloodhound.py +95 -61
- souleyez/plugins/certipy.py +303 -0
- souleyez/plugins/crackmapexec.py +186 -85
- souleyez/plugins/dalfox.py +120 -59
- souleyez/plugins/dns_hijack.py +146 -41
- souleyez/plugins/dnsrecon.py +97 -61
- souleyez/plugins/enum4linux.py +91 -66
- souleyez/plugins/evil_winrm.py +291 -0
- souleyez/plugins/ffuf.py +166 -90
- souleyez/plugins/firmware_extract.py +133 -29
- souleyez/plugins/gobuster.py +387 -190
- souleyez/plugins/gpp_extract.py +393 -0
- souleyez/plugins/hashcat.py +100 -73
- souleyez/plugins/http_fingerprint.py +854 -267
- souleyez/plugins/hydra.py +566 -200
- souleyez/plugins/impacket_getnpusers.py +117 -69
- souleyez/plugins/impacket_psexec.py +84 -64
- souleyez/plugins/impacket_secretsdump.py +103 -69
- souleyez/plugins/impacket_smbclient.py +89 -75
- souleyez/plugins/john.py +86 -69
- souleyez/plugins/katana.py +313 -0
- souleyez/plugins/kerbrute.py +237 -0
- souleyez/plugins/lfi_extract.py +541 -0
- souleyez/plugins/macos_ssh.py +117 -48
- souleyez/plugins/mdns.py +35 -30
- souleyez/plugins/msf_auxiliary.py +253 -130
- souleyez/plugins/msf_exploit.py +239 -161
- souleyez/plugins/nikto.py +134 -78
- souleyez/plugins/nmap.py +275 -91
- souleyez/plugins/nuclei.py +180 -89
- souleyez/plugins/nxc.py +285 -0
- souleyez/plugins/plugin_base.py +35 -36
- souleyez/plugins/plugin_template.py +13 -5
- souleyez/plugins/rdp_sec_check.py +130 -0
- souleyez/plugins/responder.py +112 -71
- souleyez/plugins/router_http_brute.py +76 -65
- souleyez/plugins/router_ssh_brute.py +118 -41
- souleyez/plugins/router_telnet_brute.py +124 -42
- souleyez/plugins/routersploit.py +91 -59
- souleyez/plugins/routersploit_exploit.py +77 -55
- souleyez/plugins/searchsploit.py +91 -77
- souleyez/plugins/service_explorer.py +1160 -0
- souleyez/plugins/smbmap.py +122 -72
- souleyez/plugins/smbpasswd.py +215 -0
- souleyez/plugins/sqlmap.py +301 -113
- souleyez/plugins/theharvester.py +127 -75
- souleyez/plugins/tr069.py +79 -57
- souleyez/plugins/upnp.py +65 -47
- souleyez/plugins/upnp_abuse.py +73 -55
- souleyez/plugins/vnc_access.py +129 -42
- souleyez/plugins/vnc_brute.py +109 -38
- souleyez/plugins/web_login_test.py +417 -0
- souleyez/plugins/whois.py +77 -58
- souleyez/plugins/wpscan.py +173 -69
- souleyez/reporting/__init__.py +2 -1
- souleyez/reporting/attack_chain.py +411 -346
- souleyez/reporting/charts.py +436 -501
- souleyez/reporting/compliance_mappings.py +334 -201
- souleyez/reporting/detection_report.py +126 -125
- souleyez/reporting/formatters.py +828 -591
- souleyez/reporting/generator.py +386 -302
- souleyez/reporting/metrics.py +72 -75
- souleyez/scanner.py +35 -29
- souleyez/security/__init__.py +37 -11
- souleyez/security/scope_validator.py +175 -106
- souleyez/security/validation.py +223 -149
- souleyez/security.py +22 -6
- souleyez/storage/credentials.py +247 -186
- souleyez/storage/crypto.py +296 -129
- souleyez/storage/database.py +73 -50
- souleyez/storage/db.py +58 -36
- souleyez/storage/deliverable_evidence.py +177 -128
- souleyez/storage/deliverable_exporter.py +282 -246
- souleyez/storage/deliverable_templates.py +134 -116
- souleyez/storage/deliverables.py +135 -130
- souleyez/storage/engagements.py +109 -56
- souleyez/storage/evidence.py +181 -152
- souleyez/storage/execution_log.py +31 -17
- souleyez/storage/exploit_attempts.py +93 -57
- souleyez/storage/exploits.py +67 -36
- souleyez/storage/findings.py +48 -61
- souleyez/storage/hosts.py +176 -144
- souleyez/storage/migrate_to_engagements.py +43 -19
- souleyez/storage/migrations/_001_add_credential_enhancements.py +22 -12
- souleyez/storage/migrations/_002_add_status_tracking.py +10 -7
- souleyez/storage/migrations/_003_add_execution_log.py +14 -8
- souleyez/storage/migrations/_005_screenshots.py +13 -5
- souleyez/storage/migrations/_006_deliverables.py +13 -5
- souleyez/storage/migrations/_007_deliverable_templates.py +12 -7
- souleyez/storage/migrations/_008_add_nuclei_table.py +10 -4
- souleyez/storage/migrations/_010_evidence_linking.py +17 -10
- souleyez/storage/migrations/_011_timeline_tracking.py +20 -13
- souleyez/storage/migrations/_012_team_collaboration.py +34 -21
- souleyez/storage/migrations/_013_add_host_tags.py +12 -6
- souleyez/storage/migrations/_014_exploit_attempts.py +22 -10
- souleyez/storage/migrations/_015_add_mac_os_fields.py +15 -7
- souleyez/storage/migrations/_016_add_domain_field.py +10 -4
- souleyez/storage/migrations/_017_msf_sessions.py +16 -8
- souleyez/storage/migrations/_018_add_osint_target.py +10 -6
- souleyez/storage/migrations/_019_add_engagement_type.py +10 -6
- souleyez/storage/migrations/_020_add_rbac.py +36 -15
- souleyez/storage/migrations/_021_wazuh_integration.py +20 -8
- souleyez/storage/migrations/_022_wazuh_indexer_columns.py +6 -4
- souleyez/storage/migrations/_023_fix_detection_results_fk.py +16 -6
- souleyez/storage/migrations/_024_wazuh_vulnerabilities.py +26 -10
- souleyez/storage/migrations/_025_multi_siem_support.py +3 -5
- souleyez/storage/migrations/_026_add_engagement_scope.py +31 -12
- souleyez/storage/migrations/_027_multi_siem_persistence.py +32 -15
- souleyez/storage/migrations/__init__.py +26 -26
- souleyez/storage/migrations/migration_manager.py +19 -19
- souleyez/storage/msf_sessions.py +100 -65
- souleyez/storage/osint.py +17 -24
- souleyez/storage/recommendation_engine.py +269 -235
- souleyez/storage/screenshots.py +33 -32
- souleyez/storage/smb_shares.py +136 -92
- souleyez/storage/sqlmap_data.py +183 -128
- souleyez/storage/team_collaboration.py +135 -141
- souleyez/storage/timeline_tracker.py +122 -94
- souleyez/storage/wazuh_vulns.py +64 -66
- souleyez/storage/web_paths.py +33 -37
- souleyez/testing/credential_tester.py +221 -205
- souleyez/ui/__init__.py +1 -1
- souleyez/ui/ai_quotes.py +12 -12
- souleyez/ui/attack_surface.py +2439 -1516
- souleyez/ui/chain_rules_view.py +914 -382
- souleyez/ui/correlation_view.py +312 -230
- souleyez/ui/dashboard.py +2382 -1130
- souleyez/ui/deliverables_view.py +148 -62
- souleyez/ui/design_system.py +13 -13
- souleyez/ui/errors.py +49 -49
- souleyez/ui/evidence_linking_view.py +284 -179
- souleyez/ui/evidence_vault.py +393 -285
- souleyez/ui/exploit_suggestions_view.py +555 -349
- souleyez/ui/export_view.py +100 -66
- souleyez/ui/gap_analysis_view.py +315 -171
- souleyez/ui/help_system.py +105 -97
- souleyez/ui/intelligence_view.py +436 -293
- souleyez/ui/interactive.py +22827 -10678
- souleyez/ui/interactive_selector.py +75 -68
- souleyez/ui/log_formatter.py +47 -39
- souleyez/ui/menu_components.py +22 -13
- souleyez/ui/msf_auxiliary_menu.py +184 -133
- souleyez/ui/pending_chains_view.py +336 -172
- souleyez/ui/progress_indicators.py +5 -3
- souleyez/ui/recommendations_view.py +195 -137
- souleyez/ui/rule_builder.py +343 -225
- souleyez/ui/setup_wizard.py +678 -284
- souleyez/ui/shortcuts.py +217 -165
- souleyez/ui/splunk_gap_analysis_view.py +452 -270
- souleyez/ui/splunk_vulns_view.py +139 -86
- souleyez/ui/team_dashboard.py +498 -335
- souleyez/ui/template_selector.py +196 -105
- souleyez/ui/terminal.py +6 -6
- souleyez/ui/timeline_view.py +198 -127
- souleyez/ui/tool_setup.py +264 -164
- souleyez/ui/tutorial.py +202 -72
- souleyez/ui/tutorial_state.py +40 -40
- souleyez/ui/wazuh_vulns_view.py +235 -141
- souleyez/ui/wordlist_browser.py +260 -107
- souleyez/ui.py +464 -312
- souleyez/utils/tool_checker.py +427 -367
- souleyez/utils.py +33 -29
- souleyez/wordlists.py +134 -167
- {souleyez-2.43.29.dist-info → souleyez-2.43.34.dist-info}/METADATA +1 -1
- souleyez-2.43.34.dist-info/RECORD +443 -0
- {souleyez-2.43.29.dist-info → souleyez-2.43.34.dist-info}/WHEEL +1 -1
- souleyez-2.43.29.dist-info/RECORD +0 -379
- {souleyez-2.43.29.dist-info → souleyez-2.43.34.dist-info}/entry_points.txt +0 -0
- {souleyez-2.43.29.dist-info → souleyez-2.43.34.dist-info}/licenses/LICENSE +0 -0
- {souleyez-2.43.29.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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
]
|
|
83
|
-
},
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
},
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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[
|
|
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(
|
|
210
|
-
existing_cwe = finding[
|
|
211
|
-
if existing_cwe.startswith(
|
|
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[
|
|
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
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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(
|
|
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(
|
|
398
|
+
return self.cwe_mappings.get(cwe_id, {}).get("name", cwe_id)
|