Fix vulns: utiliser IPs au lieu de QPS asset IDs pour API VMDR
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
f04d04224d
commit
662b9c3535
@ -411,10 +411,11 @@ async def qualys_search(request: Request, db=Depends(get_db),
|
|||||||
# Enrichir avec vulnérabilités (severity 3,4,5, Confirmed/Potential, Active)
|
# Enrichir avec vulnérabilités (severity 3,4,5, Confirmed/Potential, Active)
|
||||||
vuln_map = {}
|
vuln_map = {}
|
||||||
if assets:
|
if assets:
|
||||||
asset_ids = [str(a.qualys_asset_id) for a in assets if a.qualys_asset_id]
|
ips = [str(a.ip_address) for a in assets if a.ip_address]
|
||||||
if asset_ids:
|
ips = [ip for ip in ips if ip and ip != "None"]
|
||||||
|
if ips:
|
||||||
try:
|
try:
|
||||||
vuln_map = get_vuln_counts(db, ",".join(asset_ids[:50]))
|
vuln_map = get_vuln_counts(db, ",".join(ips[:50]))
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|||||||
@ -371,13 +371,13 @@ def _find_asset_by_hostname(qualys_url, qualys_user, qualys_pass, hostname, prox
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def get_vuln_counts(db, qualys_asset_ids):
|
def get_vuln_counts(db, ip_list):
|
||||||
"""Recupere le nombre de vulnerabilites actives severity 3,4,5 pour un ou plusieurs assets.
|
"""Recupere le nombre de vulnerabilites actives severity 3,4,5 pour une liste d'IPs.
|
||||||
qualys_asset_ids: str (un ID ou liste separee par virgules)
|
ip_list: str (IPs separees par virgules)
|
||||||
Retourne dict {asset_id: {severity3, severity4, severity5, total, confirmed, potential}}
|
Retourne dict {ip: {severity3, severity4, severity5, total, confirmed, potential}}
|
||||||
"""
|
"""
|
||||||
qualys_url, qualys_user, qualys_pass, qualys_proxy = _get_qualys_creds(db)
|
qualys_url, qualys_user, qualys_pass, qualys_proxy = _get_qualys_creds(db)
|
||||||
if not qualys_user or not qualys_asset_ids:
|
if not qualys_user or not ip_list:
|
||||||
return {}
|
return {}
|
||||||
proxies = {"https": qualys_proxy, "http": qualys_proxy} if qualys_proxy else None
|
proxies = {"https": qualys_proxy, "http": qualys_proxy} if qualys_proxy else None
|
||||||
|
|
||||||
@ -386,7 +386,7 @@ def get_vuln_counts(db, qualys_asset_ids):
|
|||||||
f"{qualys_url}/api/2.0/fo/asset/host/vm/detection/",
|
f"{qualys_url}/api/2.0/fo/asset/host/vm/detection/",
|
||||||
data={
|
data={
|
||||||
"action": "list",
|
"action": "list",
|
||||||
"ids": str(qualys_asset_ids),
|
"ips": str(ip_list),
|
||||||
"severities": "3,4,5",
|
"severities": "3,4,5",
|
||||||
"status": "New,Active,Re-Opened",
|
"status": "New,Active,Re-Opened",
|
||||||
"show_results": "0",
|
"show_results": "0",
|
||||||
@ -407,8 +407,8 @@ def get_vuln_counts(db, qualys_asset_ids):
|
|||||||
|
|
||||||
for host_block in txt.split("<HOST>")[1:]:
|
for host_block in txt.split("<HOST>")[1:]:
|
||||||
host_block = host_block.split("</HOST>")[0]
|
host_block = host_block.split("</HOST>")[0]
|
||||||
host_id = (parse_xml(host_block, "ID") or [""])[0]
|
host_ip = (parse_xml(host_block, "IP") or [""])[0]
|
||||||
if not host_id:
|
if not host_ip:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
counts = {"severity3": 0, "severity4": 0, "severity5": 0,
|
counts = {"severity3": 0, "severity4": 0, "severity5": 0,
|
||||||
@ -432,6 +432,6 @@ def get_vuln_counts(db, qualys_asset_ids):
|
|||||||
if det_type == "Confirmed": counts["confirmed"] += 1
|
if det_type == "Confirmed": counts["confirmed"] += 1
|
||||||
elif det_type == "Potential": counts["potential"] += 1
|
elif det_type == "Potential": counts["potential"] += 1
|
||||||
|
|
||||||
results[str(host_id)] = counts
|
results[host_ip] = counts
|
||||||
|
|
||||||
return results
|
return results
|
||||||
|
|||||||
@ -167,7 +167,7 @@ function updateBulkTag() {
|
|||||||
{% else %}<span class="text-gray-600 text-xs">N/A</span>{% endif %}
|
{% else %}<span class="text-gray-600 text-xs">N/A</span>{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td class="p-2 text-center">
|
<td class="p-2 text-center">
|
||||||
{% set vc = vuln_map.get(qid|string, {}) if vuln_map else {} %}
|
{% set vc = vuln_map.get(ip|string, {}) if vuln_map else {} %}
|
||||||
{% if vc and vc.total > 0 %}
|
{% if vc and vc.total > 0 %}
|
||||||
<span title="S3:{{ vc.severity3 }} S4:{{ vc.severity4 }} S5:{{ vc.severity5 }} | Confirmed:{{ vc.confirmed }} Potential:{{ vc.potential }}">
|
<span title="S3:{{ vc.severity3 }} S4:{{ vc.severity4 }} S5:{{ vc.severity5 }} | Confirmed:{{ vc.confirmed }} Potential:{{ vc.potential }}">
|
||||||
{% if vc.severity5 > 0 %}<span class="badge badge-red">{{ vc.severity5 }} crit</span> {% endif %}
|
{% if vc.severity5 > 0 %}<span class="badge badge-red">{{ vc.severity5 }} crit</span> {% endif %}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user