{{-- ------------------------------------------------------------- Deckblatt --}}

barox SecPen · Technischer Prüfbericht

{{ $report->title }}

Kunde{{ $customer?->name }}
Projekt{{ $project?->name ?? '–' }} @if ($project?->reference) (Referenz {{ $project->reference }}) @endif
Testdatum {{ $scans->min('started_at')?->format('d.m.Y') ?? '–' }} bis {{ $scans->max('finished_at')?->format('d.m.Y') ?? '–' }}
Erstellt am{{ $generated_at->format('d.m.Y H:i') }}
Erstellt von{{ $report->creator?->name }}
Scanberechtigung {{ $project?->authorization_reference ?? '–' }}, bestätigt {{ $project?->authorization_confirmed_at?->format('d.m.Y') ?? '–' }} durch {{ $project?->authorizedBy?->name ?? '–' }}
Hinweis zum Umfang. Dieser Bericht dokumentiert eine ausdrücklich autorisierte Sicherheitsprüfung. Es wurden ausschliesslich lesende bzw. nicht-destruktive Verfahren eingesetzt. Es erfolgten keine Exploitversuche, keine Brute-Force-Tests, keine Denial-of-Service-Tests und keinerlei Konfigurationsänderungen oder Neustarts an den geprüften Geräten.
{{-- ---------------------------------------------------------- Geprüfte Geräte --}}

1 Geprüfte Geräte

@foreach ($switches as $switch) @endforeach
HostnameManagement-IPHersteller / ModellFirmware SeriennummerUmgebung
{{ $switch->hostname }} {{ $switch->management_ip }} {{ $switch->modelLabel() }} {{ $switch->firmware_version ?: '–' }} {{ $switch->serial_number ?: '–' }} {{ $switch->is_production ? 'Produktivnetz' : 'Labor' }}
{{-- ------------------------------------------------- Scanprofile / Parameter --}}

2 Verwendete Scanprofile und Parameter

@foreach ($scans as $scan)

{{ $scan->name }}

Scanprofil{{ $scan->profile->name }} ({{ $scan->profile->intensityLabel() }})
Engine{{ $scan->profile->engine->label() }}
Scanparameter T{{ data_get($scan->effective_options, 'options.timing', '–') }}, Rate {{ data_get($scan->effective_options, 'options.min_rate', '–') }}–{{ data_get($scan->effective_options, 'options.max_rate', '–') }} Pakete/s, Parallelität {{ data_get($scan->effective_options, 'options.max_parallelism', '–') }}, Diensterkennung {{ data_get($scan->effective_options, 'options.service_detection') ? 'aktiv' : 'inaktiv' }}
Ports {{ data_get($scan->effective_options, 'all_tcp_ports') ? 'alle TCP-Ports' : implode(', ', (array) data_get($scan->effective_options, 'tcp_ports', [])) }} @if (data_get($scan->effective_options, 'udp_ports')) · UDP: {{ implode(', ', (array) data_get($scan->effective_options, 'udp_ports')) }} @endif
Zeitraum {{ $scan->started_at?->format('d.m.Y H:i:s') ?? '–' }} bis {{ $scan->finished_at?->format('d.m.Y H:i:s') ?? '–' }} ({{ $scan->runtimeSeconds() !== null ? gmdate('H:i:s', $scan->runtimeSeconds()) : '–' }})
Status{{ $scan->status->label() }} @if ($scan->abort_reason) – {{ $scan->abort_reason }} @endif
Freigaben Ausgeführt durch {{ $scan->creator?->name }}. @if ($scan->approver) Freigegeben durch {{ $scan->approver->name }}. @else Keine Freigabe erforderlich. @endif @if ($scan->maintenanceWindow) Wartungsfenster: {{ $scan->maintenanceWindow->name }}. @endif
Profil-Prüfsumme{{ $scan->profile_snapshot_hash }}
@endforeach {{-- ------------------------------------------------------- Ergebnisübersicht --}}

3 Ergebnisübersicht

@foreach (\App\Enums\FindingClassification::cases() as $classification) @endforeach
KategorieAnzahlBedeutung
{{ $classification->label() }} {{ ($findingsByClassification[$classification->value] ?? collect())->count() }} @switch($classification) @case(\App\Enums\FindingClassification::Vulnerability) Bekannte Schwachstelle mit Referenz (CVE/Plugin). @break @case(\App\Enums\FindingClassification::Configuration) Abweichung von der empfohlenen Konfiguration, kein Softwarefehler. @break @case(\App\Enums\FindingClassification::LoadLimit) Grenze der Verarbeitungskapazität des Geräts, kein Sicherheitsproblem im engeren Sinn. @break @case(\App\Enums\FindingClassification::FirmwareDefect) Verhalten deutet auf einen Fehler der Gerätesoftware hin; Herstellerklärung erforderlich. @break @case(\App\Enums\FindingClassification::NotReproducible) Einmalig beobachtet, unter gleichen Bedingungen nicht erneut aufgetreten. @break @default Bewertung noch offen. @endswitch
@foreach (['critical', 'high', 'medium', 'low', 'info'] as $severity) @endforeach
SchweregradAnzahl
{{ \App\Enums\Severity::from($severity)->label() }} {{ ($findingsBySeverity[$severity] ?? collect())->count() }}
{{-- ---------------------------------------------------- Ports und Dienste ----}}

4 Erkannte Ports und Dienste

@if ($openPorts->isEmpty())

Es wurden keine offenen Ports festgestellt.

@else @foreach ($openPorts as $port) @endforeach
GerätPortProtokollDienst / VersionCPE
{{ $port['hostname'] ?: $port['ip'] }} {{ $port['port'] }} {{ $port['protocol'] }} {{ $port['service'] ?: '–' }} {{ $port['cpe'] ?: '–' }}
@endif {{-- ------------------------------------------------------------- Findings ----}}

5 Findings im Detail

@forelse ($findings as $finding)

{{ $finding->severity->label() }} · {{ $finding->title }}

Gerät{{ $finding->switch?->hostname ?? '–' }} ({{ $finding->switch?->management_ip }})
Quelle{{ strtoupper($finding->source) }} @if ($finding->plugin_id) · Plugin {{ $finding->plugin_id }} @endif
Port{{ $finding->port ? $finding->port.'/'.$finding->protocol : '–' }}
CVSS v3 / CVE {{ $finding->cvss3_base ?? '–' }} · {{ implode(', ', (array) ($finding->cve ?? [])) ?: 'keine CVE-Referenz' }}
Klassifizierung{{ $finding->classification->label() }}
Status{{ $finding->status->label() }}
Erstmals / zuletzt gesehen {{ $finding->first_seen_at?->format('d.m.Y') ?? '–' }} / {{ $finding->last_seen_at?->format('d.m.Y') ?? '–' }}
@if ($finding->description)

{{ $finding->description }}

@endif @if ($finding->evidence)

Nachweis:

{{ \Illuminate\Support\Str::limit($finding->evidence, 1200) }}

@endif @if ($finding->internal_assessment)
Bewertung barox: {{ $finding->internal_assessment }}
@endif @if ($finding->vendor_feedback)
Herstellerfeedback @if ($finding->vendor_case_reference) (Ticket {{ $finding->vendor_case_reference }})@endif: {{ $finding->vendor_feedback }}
@endif @if ($finding->recommended_action)

Empfohlene Massnahme: {{ $finding->recommended_action }}

@elseif ($finding->solution)

Lösungsempfehlung des Herstellers: {{ $finding->solution }}

@endif @empty

Es wurden keine Findings erfasst.

@endforelse {{-- --------------------------------------------------- Verhalten des Geräts --}}

6 Verhalten der Geräte während der Prüfung

@foreach ($metrics as $series)

{{ $series['hostname'] ?? 'Gerät '.$series['switch_id'] }}

CPU-Auslastung (Mittel / Maximum) {{ $series['cpu_avg'] ?? '–' }} % / {{ $series['cpu_max'] ?? '–' }} %
Ping-Antwortzeit (Mittel / Maximum) {{ $series['rtt_avg'] ?? '–' }} ms / {{ $series['rtt_max'] ?? '–' }} ms
Paketverlust (Maximum){{ $series['loss_max'] ?? '–' }} %
Ausfälle Webinterface{{ $series['http_failures'] }} Messpunkte
Ausfälle SNMP{{ $series['snmp_failures'] }} Messpunkte

CPU-Verlauf

{!! $series['sparkline_cpu'] !!}

Ping-Antwortzeit

{!! $series['sparkline_rtt'] !!}

Paketverlust

{!! $series['sparkline_loss'] !!} @endforeach

Erkannte Neustarts

@if ($reboots->isEmpty())

Während der Prüfung wurde kein Neustart eines Geräts festgestellt.

@else @foreach ($reboots as $incident) @endforeach
GerätZeitpunktBeschreibung
{{ $incident->switch?->hostname }} {{ $incident->started_at?->format('d.m.Y H:i:s') }} {{ $incident->summary }}
@endif

STP- und MSTP-Ereignisse

@if ($topologyEvents->isEmpty())

Keine auffälligen Topologieänderungen oder Link-Flaps.

@else @foreach ($topologyEvents as $incident) @endforeach
GerätTypZeitpunktBeschreibung
{{ $incident->switch?->hostname }}{{ $incident->type }} {{ $incident->started_at?->format('d.m.Y H:i:s') }} {{ $incident->summary }}
@endif

Automatische Abbrüche

@if ($autoAborts->isEmpty())

Kein Scan musste automatisch abgebrochen werden.

@else @foreach ($autoAborts as $scan)
{{ $scan->name }} wurde am {{ $scan->aborted_at?->format('d.m.Y H:i:s') }} automatisch abgebrochen.
Grund: {{ $scan->abortReason()?->label() ?? $scan->abort_reason }}.
Der Nmap-Prozess wurde kontrolliert beendet, ein laufender Nessus-Scan gestoppt und die Nachbeobachtung fortgesetzt. Am Gerät wurden keine Massnahmen ausgeführt.
@endforeach @endif {{-- --------------------------------------------------------------- Zeitachse --}}

7 Zeitachse

@foreach ($events->take(300) as $event) @endforeach
ZeitpunktArtEreignis
{{ $event->occurred_at->format('d.m. H:i:s') }} {{ $event->severity }} {{ $event->message }}
{{-- ------------------------------------------------ Bewertung und Massnahmen --}}

8 Technische Bewertung

Die Prüfung umfasste {{ $switches->count() }} Gerät(e) in {{ $scans->count() }} Scanläufen. Insgesamt wurden {{ $findings->count() }} Feststellungen erfasst, davon {{ ($findingsBySeverity['critical'] ?? collect())->count() + ($findingsBySeverity['high'] ?? collect())->count() }} mit hohem oder kritischem Schweregrad.

@php $loadLimits = $findingsByClassification[\App\Enums\FindingClassification::LoadLimit->value] ?? collect(); $firmware = $findingsByClassification[\App\Enums\FindingClassification::FirmwareDefect->value] ?? collect(); $open = $findingsByClassification[\App\Enums\FindingClassification::Undetermined->value] ?? collect(); @endphp @if ($autoAborts->isNotEmpty() || $loadLimits->isNotEmpty())
Belastungsgrenze. Die geprüften Geräte haben unter Scanlast Grenzwerte überschritten (CPU, Latenz, Paketverlust oder Erreichbarkeit des Managements). Dies ist kein Angriff und keine Schwachstelle im engeren Sinn, sondern eine Aussage über die Verarbeitungskapazität der Managementeinheit. Für den Betrieb bedeutet dies, dass Netzwerkscans Dritter (etwa durch Monitoring- oder Inventarisierungswerkzeuge) dieselbe Wirkung haben können.
@endif @if ($firmware->isNotEmpty())
Möglicher Firmwarefehler. {{ $firmware->count() }} Feststellung(en) deuten auf ein Fehlverhalten der Gerätesoftware hin (etwa Neustart oder dauerhafter Managementausfall bei regulärem Verbindungsaufbau). Eine Klärung mit dem Hersteller wird empfohlen; die Rohdaten liegen im Anhang bei.
@endif @if ($open->isNotEmpty())
Noch nicht abschliessend bewertet. {{ $open->count() }} Feststellung(en) sind noch in Prüfung. Sie sind in diesem Bericht vollständig dokumentiert, aber noch nicht bewertet.
@endif

9 Empfohlene Massnahmen

@foreach ($findings->where('severity_rank', '>=', 2)->take(50) as $finding) @endforeach
PrioritätGerätFeststellungMassnahme
{{ $finding->severity->label() }} {{ $finding->switch?->hostname ?? '–' }} {{ $finding->title }} {{ $finding->recommended_action ?: $finding->solution ?: 'Noch festzulegen.' }}

10 Anhänge und Rohdaten

@foreach ($scans as $scan) @foreach ($scan->nmapResults as $result) @endforeach @foreach ($scan->nessusScans as $nessus) @if ($nessus->export_path) @endif @endforeach @endforeach
ScanDateiSHA-256Grösse
{{ $scan->name }} {{ basename((string) $result->xml_path) }} {{ $result->xml_sha256 }} {{ $result->xml_bytes ? number_format($result->xml_bytes / 1024, 1).' KB' : '–' }}
{{ $scan->name }} {{ basename((string) $nessus->export_path) }} {{ $nessus->export_sha256 }} {{ $nessus->export_bytes ? number_format($nessus->export_bytes / 1024, 1).' KB' : '–' }}

Die Rohdateien liegen ausserhalb des Webverzeichnisses auf dem Prüfsystem und werden auf Anfrage bereitgestellt. Die Prüfsummen erlauben den Nachweis der Unverändertheit.