{% extends "base.html" %} {% block title %}Vulnerabilities · SD RMM{% endblock %} {% block content %}

Vulnerabilities

{{ counts.get('critical', 0) }} critical · {{ counts.get('high', 0) }} high across {{ hosts }} device{{ '' if hosts == 1 else 's' }} · {{ total_open }} open finding{{ '' if total_open == 1 else 's' }} total. {% if last.ts %}Nightly scan · last run {{ last.ts }} ({{ last.packages }} packages).{% endif %}

{% if sev != 'action' %}‹ Actionable view{% endif %}
{{ actionable }}
Actionable
{% for s in ['critical','high','medium','low'] %}
{{ counts.get(s, 0) }}
{{ s }}
{% endfor %}
{{ total_open }}
All open
{% if groups %}

{{ groups|length }} package{{ '' if groups|length == 1 else 's' }}, {{ shown }} finding{{ '' if shown == 1 else 's' }} in this view — grouped by package, worst severity first, fixable first. Click a package to expand.

{% for g in groups %}
{{ g.sev }} {{ g.package }} {{ g.rows|length }} finding{{ '' if g.rows|length == 1 else 's' }} · {{ g.devices|join(', ') }} {% if g.fixable %}{{ g.fixable }} fixable{% else %}no fix published{% endif %} {% for f, a in g.rows %} {% endfor %}
SeverityDeviceInstalledVulnerabilityFixed inFirst seen
{{ f.severity }} {{ a.hostname }} {{ f.version }} {{ f.vuln_id }} {% if f.summary %}
{{ f.summary[:140] }}{% if f.summary|length > 140 %}…{% endif %}
{% endif %}
{{ f.fixed_version or '—' }} {{ f.first_seen_at.strftime('%b %d') }}
{% endfor %} {% else %}

{% if sev == 'action' %}No critical or high findings — nothing needs action. {{ total_open }} lower-severity finding{{ '' if total_open == 1 else 's' }} are tracked under All open. {% else %}No open findings{% if sev not in ('action','all') %} at severity “{{ sev }}”{% endif %}. Clean fleet.{% endif %}

{% endif %}

Findings come from matching each device's package inventory (name + exact installed version) against OSV.dev, nightly. A finding auto-resolves when the package is upgraded past the affected range or removed. “No fix published” = the distro hasn't shipped a patched release yet — nothing to install, we re-check every night. Critical/high findings also lower the device's Hardening score. Rarely-actionable severities: negligible ({{ counts.get('negligible', 0) }}) · unknown ({{ counts.get('unknown', 0) }})

{% endblock %}