check-msdefender 1.1.11__tar.gz → 1.1.13__tar.gz
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.
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/PKG-INFO +1 -1
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/__init__.py +1 -1
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/services/products_service.py +50 -11
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/pyproject.toml +1 -1
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/LICENSE +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/README.md +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/__main__.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/check_msdefender.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/__init__.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/__main__.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/commands/__init__.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/commands/alerts.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/commands/detail.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/commands/lastseen.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/commands/machines.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/commands/onboarding.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/commands/products.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/commands/vulnerabilities.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/decorators.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/handlers.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/core/__init__.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/core/auth.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/core/config.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/core/defender.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/core/exceptions.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/core/logging_config.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/core/nagios.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/services/__init__.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/services/alerts_service.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/services/detail_service.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/services/lastseen_service.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/services/machines_service.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/services/models.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/services/onboarding_service.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/services/vulnerabilities_service.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/__init__.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/fixtures/__init__.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/fixtures/alerts_data.json +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/fixtures/machine_data.json +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/fixtures/mock_defender_client.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/fixtures/test_alerts_service.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/fixtures/test_detail_service.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/fixtures/test_lastseen_service.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/fixtures/test_onboarding_service.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/fixtures/test_vulnerabilities_service.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/fixtures/vulnerability_data.json +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/integration/__init__.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/integration/test_cli_integration.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/integration/test_lastseen_integration.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/unit/__init__.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/unit/test_alerts_service.py +0 -0
- {check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/unit/test_detail_service.py +0 -0
{check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/services/products_service.py
RENAMED
|
@@ -6,6 +6,12 @@ from datetime import datetime
|
|
|
6
6
|
from check_msdefender.core.exceptions import ValidationError
|
|
7
7
|
from check_msdefender.core.logging_config import get_verbose_logger
|
|
8
8
|
|
|
9
|
+
class DetailObject:
|
|
10
|
+
def __init__(self, software: str, data: str, score: int):
|
|
11
|
+
self.software = software
|
|
12
|
+
self.data = data
|
|
13
|
+
self.score = score
|
|
14
|
+
self.paths: list[str] = []
|
|
9
15
|
|
|
10
16
|
class ProductsService:
|
|
11
17
|
"""Service for checking installed products on machines."""
|
|
@@ -60,6 +66,7 @@ class ProductsService:
|
|
|
60
66
|
cve_id = vulnerability.get("cveId", "Unknown")
|
|
61
67
|
cvss_score = vulnerability.get("cvssScore", 0)
|
|
62
68
|
disk_paths = vulnerability.get("diskPaths", [])
|
|
69
|
+
registry_paths = vulnerability.get("registryPaths", [])
|
|
63
70
|
severity = vulnerability.get("vulnerabilitySeverityLevel", "Unknown")
|
|
64
71
|
|
|
65
72
|
software_key = f"{software_name}-{software_version}-{software_vendor}"
|
|
@@ -71,12 +78,15 @@ class ProductsService:
|
|
|
71
78
|
"vendor": software_vendor,
|
|
72
79
|
"cves": [],
|
|
73
80
|
"paths": set(),
|
|
81
|
+
"registryPaths": set(),
|
|
74
82
|
"max_cvss": 0,
|
|
75
83
|
"severities": set(),
|
|
76
84
|
}
|
|
77
85
|
|
|
78
|
-
|
|
86
|
+
cve_info = {"cve_id": cve_id, "severity": severity}
|
|
87
|
+
software_vulnerabilities[software_key]["cves"].append(cve_info)
|
|
79
88
|
software_vulnerabilities[software_key]["paths"].update(disk_paths)
|
|
89
|
+
software_vulnerabilities[software_key]["registryPaths"].update(registry_paths)
|
|
80
90
|
software_vulnerabilities[software_key]["max_cvss"] = max(
|
|
81
91
|
software_vulnerabilities[software_key]["max_cvss"], cvss_score
|
|
82
92
|
)
|
|
@@ -112,15 +122,18 @@ class ProductsService:
|
|
|
112
122
|
summary_line = f"{len(products)} total CVEs (Critical: {critical_count}, High: {high_count}, Medium: {medium_count}, Low: {low_count}), {len(vulnerable_software)} vulnerable software"
|
|
113
123
|
details.append(summary_line)
|
|
114
124
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
125
|
+
detail_objects = []
|
|
126
|
+
|
|
127
|
+
# Add software details
|
|
128
|
+
for software in list(software_vulnerabilities.values()):
|
|
129
|
+
score = 0
|
|
130
|
+
|
|
118
131
|
cve_count = len(software["cves"])
|
|
119
|
-
unique_cves = list(set(software["cves"]))
|
|
132
|
+
unique_cves = list(set(cve["cve_id"] for cve in software["cves"]))
|
|
120
133
|
cve_list = ", ".join(unique_cves[:5]) # Show first 5 CVEs
|
|
121
134
|
severities = ", ".join(software["severities"]) # Show first 5 CVEs
|
|
122
|
-
for
|
|
123
|
-
severity =
|
|
135
|
+
for cve in software["cves"]:
|
|
136
|
+
severity = cve["severity"].lower()
|
|
124
137
|
if severity == "critical":
|
|
125
138
|
score += 100
|
|
126
139
|
elif severity == "high":
|
|
@@ -133,14 +146,40 @@ class ProductsService:
|
|
|
133
146
|
if len(unique_cves) > 5:
|
|
134
147
|
cve_list += f".. (+{len(unique_cves) - 5} more)"
|
|
135
148
|
|
|
136
|
-
|
|
137
|
-
f"{software['name']} {software['version']} ({software['vendor']})
|
|
138
|
-
f"{score} ({cve_count}: {severities}) weaknesses ({cve_list})"
|
|
149
|
+
detail_object = DetailObject(
|
|
150
|
+
software=f"{software['name']} {software['version']} ({software['vendor']})",
|
|
151
|
+
data=f"{score} ({cve_count}: {severities}) weaknesses ({cve_list})",
|
|
152
|
+
score=score
|
|
139
153
|
)
|
|
154
|
+
|
|
140
155
|
total_score += score
|
|
156
|
+
|
|
141
157
|
# Add paths (limit to 4)
|
|
142
158
|
for path in list(software["paths"])[:4]:
|
|
143
|
-
|
|
159
|
+
detail_object.paths.append(f" - {path}")
|
|
160
|
+
|
|
161
|
+
# Indicate if more paths exist
|
|
162
|
+
if (len(software["paths"]) > 4):
|
|
163
|
+
detail_object.paths.append(f" - .. (+{len(software['paths']) - 4} more)")
|
|
164
|
+
|
|
165
|
+
# Add registry paths if available (limit to 4)
|
|
166
|
+
for registry_path in list(software["registryPaths"])[:4]:
|
|
167
|
+
detail_object.paths.append(f" - {registry_path}")
|
|
168
|
+
|
|
169
|
+
# Indicate if more registry paths exist
|
|
170
|
+
if (len(software["registryPaths"]) > 4):
|
|
171
|
+
detail_object.paths.append(f" - .. (+{len(software['registryPaths']) - 4} more)")
|
|
172
|
+
|
|
173
|
+
# Collect detail objects for sorting
|
|
174
|
+
detail_objects.append(detail_object)
|
|
175
|
+
|
|
176
|
+
# Sort detail objects by score descending
|
|
177
|
+
detail_objects.sort(key=lambda x: x.score, reverse=True)
|
|
178
|
+
|
|
179
|
+
# Limit to top 10
|
|
180
|
+
for detail_object in detail_objects[:10]:
|
|
181
|
+
details.append(f"{detail_object.software} {detail_object.data}")
|
|
182
|
+
details.extend(detail_object.paths)
|
|
144
183
|
|
|
145
184
|
# Determine the value based on severity:
|
|
146
185
|
# - Critical vulnerabilities trigger critical threshold
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/commands/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/commands/lastseen.py
RENAMED
|
File without changes
|
{check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/commands/machines.py
RENAMED
|
File without changes
|
{check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/commands/onboarding.py
RENAMED
|
File without changes
|
{check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/commands/products.py
RENAMED
|
File without changes
|
{check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/cli/commands/vulnerabilities.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/services/alerts_service.py
RENAMED
|
File without changes
|
{check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/services/detail_service.py
RENAMED
|
File without changes
|
{check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/services/lastseen_service.py
RENAMED
|
File without changes
|
{check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/services/machines_service.py
RENAMED
|
File without changes
|
|
File without changes
|
{check_msdefender-1.1.11 → check_msdefender-1.1.13}/check_msdefender/services/onboarding_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/fixtures/test_onboarding_service.py
RENAMED
|
File without changes
|
{check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/fixtures/test_vulnerabilities_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/integration/test_cli_integration.py
RENAMED
|
File without changes
|
{check_msdefender-1.1.11 → check_msdefender-1.1.13}/tests/integration/test_lastseen_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|