§1
RoamSwitch für Linux ist eine residente Netzwerksicherheits- und Systemdiagnoseanwendung, die das Zero-Trust-Netzwerkverteidigungsmodell von macOS RoamSwitch auf Linux (systemd + nftables-Umgebungen) bringt.
Diese Edition zielt auf Client-Maschinen (Workstations, Laptops, Einplatinencomputer) ab und setzt autonomes Verhalten voraus, das der Maschine folgt, wenn sie sich zwischen Netzwerken bewegt. Eine gehärtete Server-/Headless-Infrastruktur-Edition (RoamSwitch Server Edition – Always-on-Default-Deny, Critical-Path-FIM-Integrität, Remote-Webhooks und statische Richtliniendurchsetzung) wird als dedizierter Server-Build bereitgestellt.
Es identifiziert das verbundene WLAN/kabelgebundene Netzwerk anhand seiner Gateway-MAC-Adresse und schaltet selbstständig das aktive nftables-Firewallprofil um. Darüber hinaus bietet es drei Ebenen der Man-in-the-Middle-Verteidigung in nicht vertrauenswürdigen Netzwerken – einen VPN-Tunnel + Kill-Switch (WireGuard oder Tailscale, die primäre Verteidigung), eine präventive ARP/NDP-Sperre und ARP-Spoof-Erkennung – plus verhaltensbasierte Ransomware-Erkennung (Fanotify + Shannon-Entropie + Kanarienvögel), eine passive Link Guard, der Phishing-Verbindungen kennzeichnet oder blockiert (NFQUEUE + SNI), ein Port Anomaly Guard, BadUSB-Abwehr, Kernel Local Privilege Escalation (LPE) Preemption (Frag Gap CVE-2026-53362 Abschwächung), eBPF-Laufzeit-Bedrohungssensor-Integration (Falco/Tetragon) mit Sub-Second-Process-Freezing (SIGSTOP) und Air-Gap-Netzwerk isolation, eine 24-Punkte-Bewertung des Sicherheitszustands und ein integrierter Model Context Protocol (MCP)-Server.
Dieses Whitepaper beschreibt die Architektur, das Bedrohungsmodell und das Design jedes Abwehrmechanismus – und insbesondere, wie das Prinzip der „vollständig lokalen Verarbeitung; das Einzige, was von der Maschine gesendet wird, ist eine Anfrage nach signierten Erkennungsdaten, die nichts über Sie enthalten“, auf Codeebene garantiert wird. Es vermeidet Marketingsprache; Die Ansprüche können anhand des tatsächlichen Verhaltens des verteilten Pakets (Binärdatei) und der Selbstprüfung im Anhang überprüft werden. RoamSwitch für Linux ist proprietäre Freeware und sein Quellcode wird nicht veröffentlicht (§11).
| Prinzip | Detailliert |
|---|---|
| Null-Telemetrie | Das Produkt sendet nichts über Sie oder Ihre Maschine an irgendjemanden. Es gibt keine Telemetrie, Analyse, Absturzberichte, Nutzungsmetriken, Remote-Konfiguration oder Lizenzaktivierungsserver. |
| Nur Updates empfangen | Die einzige ausgehende Anfrage, die das Produkt stellt, ist einmal täglich GET eines festen, signierten Manifests von lafine.net/updates/v1 – der Scam-Site-Liste für den Link Guard, der ClamAV-Signaturversion, der neuesten App-Version, den Paket-CVE-Maps (Homebrew/npm/PyPI/crates.io/RubyGems/Packagist/Go/Maven), der CVE-Map der aktiven Schwachstellenprüfung sowie der Liste beliebter npm-Paketnamen für die Typosquatting-Erkennung. Es enthält keine Abfragezeichenfolge, keine Cookies, keine identifizierenden Header und keine Informationen über Sie. updates.enabled = false schaltet es vollständig aus; Das Produkt läuft dann mit gebündelten Daten ohne externen Kontakt. |
| Vollständig lokale Verarbeitung | Jede Bewertung, Erkennung und Prüfung wird vollständig auf dem lokalen Computer ausgeführt. URL-Sicherheitsanalysen und geheime Scans werten ihre Eingaben heuristisch aus, ohne sie irgendwohin zu übertragen. |
| Geringeste Berechtigung | Privilegierte Vorgänge sind auf einen Root-Daemon beschränkt; Die Benutzeroberfläche, die CLI und der MCP-Server fordern sie über einen Unix-Domain-Socket-IPC an. Der Daemon öffnet keinen TCP/UDP-Socket; Der Link Guard verwendet nur den AF_NETLINK NFQUEUE-Urteilskanal (Kernel ↔ Userspace, kein Paketausgang). |
| Fehler geschlossen | Air-Gap (Notfallisolierung) überlebt einen Daemon-Neustart und wird innerhalb von Sekunden wieder aktiviert, wenn seine Regeln extern gelöscht werden. |
| Offline-Lizenzierung | Pro-/Business-Lizenzen werden ausschließlich durch die Ed25519-Signaturprüfung überprüft. Es erfolgt kein Aufruf an einen Aktivierungsserver. |
§2
RoamSwitch für Linux zielt hauptsächlich auf Laptops/mobile Workstations ab, die zwischen nicht vertrauenswürdigen Netzwerken wechseln.
Angreifer im Visier
- ___
- Bösartige USB-Geräte (BadUSB) – Vortäuschen einer Tastatur und Einschleusen von Tastenanschlägen, bevor der Bildschirm gesperrt wird; unregistrierter USB-Massenspeicher zur Datenexfiltration oder zum Einschleusen von Schadsoftware.
- Ransomware/dateilose Malware – Eindringen über eine heruntergeladene Datei und Massenverschlüsselung der Dokumente des Benutzers.
- DNS-basiertes C2 und Phishing – Malware, die Namensauflösung nutzt, um einen C2-Server oder eine Phishing-Site zu erreichen.
Außerhalb des Gültigkeitsbereichs
- Ein Angreifer, der bereits Wurzeln schlägt; Rootkits auf Kernel- oder Firmware-Ebene.
- Angriffe, die die Festplatte physisch entfernen (die Domäne der vollständigen Festplattenverschlüsselung; RoamSwitch diagnostiziert, ob eine Verschlüsselung vorhanden ist, führt jedoch keine Verschlüsselung durch).
- Proximity Wireless Sharing-Steuerung im AirDrop-Stil (kein Betriebssystem-nativer Mechanismus unter Linux; nicht unterstützt).
§3
RoamSwitch für Linux ist in Rust in sieben Kisten implementiert. Die gesamte Kommunikation mit dem Daemon erfolgt über /run/roamswitch/roamswitch.sock (einen Unix-Domänen-Socket). Es gibt keinen überwachenden TCP/UDP-Socket im Daemon, in der App oder im MCP-Server. Das Einzige, was die App binds hat, ist ein einzelner Unix-Socket, um eine zweite Instanz zu verhindern.
# Userspace (unprivilegiert) roamswitch-app GTK3 + AppIndicator-Tray roamswitch (CLI) Schlankes Shell-Frontend roamswitch-mcp stdio JSON-RPC (von AI-Clients gestartet) │ │ AF_UNIX /run/roamswitch/roamswitch.sock (nur lokales IPC) ▼ roamswitch-daemon root / systemd Type=notify + WatchdogSec=30 · nftables-Profilsteuerung (inet roamswitch-Tabelle) · Sentinel-Schleife (Netzwerkerkennung & Profildurchsetzung) · VPN-Tunnel + Kill-Switch (WireGuard: wg-quick / roamswitch_vpn, Tailscale: roamswitch_ts) · Präventive ARP/NDP-Sperre (Neigh-Tabellen-Pin) / Erkennung · Port-Anomalie-Wächter (roamswitch_dev_guard) · fanotify-Wächter (Ransomware / Malware) · Link-Guard (NFQUEUE — inet roamswitch_linkguard) · Canary-Engine / Quarantäne-Vault · Kernel-LPE-Härtung (userns-Deaktivierung, Yama LSM) · eBPF-Laufzeitintegration (/var/run/roamswitch/events.sock) · Millisekunden-SIGSTOP-Einfrieren angreifender Prozesse & Air-Gap-Kopplung · USB-Überwachung (evdev EVIOCGRAB — BadUSB) / Freigabe-Warteschlange · Ed25519-Lizenzprüfung roamswitch-updater Ein eigenständiger systemd-Timer-Helfer. Das einzige Crate mit HTTP/TLS-Stack (täglicher signierter Manifest-GET) roamswitch-core Reine Logikbibliothek (von allen Crates geteilt) roamswitchkit MCP-Client-SDK
| Komponente | Privileg | Rolle |
|---|---|---|
| roamswitch-daemon | root (systemd, Type=notify + WatchdogSec=30) | Alle privilegierten Operationen. Steuert als einzelner Autor nftables, DNS und systemd-Einheiten. |
| Roamswitch-App | Login-Benutzer | GTK3 GUI + AppIndicator-Fach. Nur Konfigurationsbearbeitung und -visualisierung; Jede privilegierte Aktion durchläuft IPC. |
| Roamswitch (CLI) | Login-Benutzer | Dünnes Shell-Frontend mit demselben IPC-Sockel. |
| roamswitch-mcp | Vom KI-Client erzeugter Prozess | stdio JSON-RPC. Stellt schreibgeschützte Diagnoseinformationen bereit. |
Die gesamte Kommunikation mit dem Daemon erfolgt über /run/roamswitch/roamswitch.sock (ein Verzeichnis mit 0700-äquivalenten Berechtigungen). Die Benutzerkonfiguration wird als Klartext-JSON unter ~/.config/roamswitch/config.json gespeichert. Der Daemon liest /home/*/.config/roamswitch/config.json mit Root-Rechten (er läuft mit HOME=/root). Die Konfiguration verlässt nie die Maschine; Es gibt keine Kontoregistrierung und keine Cloud-Synchronisierung.
§4
Die Sentinel-Schleife (standardmäßig 5-Sekunden-Zyklus) liest den MAC des Standard-Gateways von /proc/net/arp und ip neigh und gleicht ihn mit den registrierten MACs in config.json ab. MAC wird anstelle von SSID verwendet, da eine SSID auf einfache Weise gefälscht wird. Die beim Profilwechsel angezeigte Desktop-Benachrichtigung gibt den Grund für den Wechsel an („ein nicht registriertes Netzwerk“ / „Ihre Einstellung für das registrierte Netzwerk X“ / „keine Netzwerkverbindung“).
| Profil | Situation | nftables-Verhalten |
|---|---|---|
| offen (vertrauenswürdig) | Ein registriertes Heim- oder Firmennetzwerk | policy accept. Lokaler Verkehr erlaubt. |
| ausgeglichen | Nicht registriert, aber als relativ sicher konfiguriert | Eingehender Anruf standardmäßig verweigert. Nur etablierte Verbindungen und lo erlaubt; Exposition des exponierten Ports überwacht. |
| lockdown (Auswärtsschutz) | Öffentliches WLAN / nicht registriertes Netzwerk | Alle eingehenden Pakete wurden heimlich verworfen. Sharing-Dienste werden automatisch gestoppt (Opt-in). |
Alle Regeln sind in einer dedizierten nftables-Tabelle mit dem Namen inet roamswitch isoliert und kollidieren nie mit anderen Firewall-Konfigurationen (ufw/firewalld). Der Ablauf der manuellen Überschreibung (1 Stunde / 2 Stunden / 4 Stunden / bis Mitternacht / bis zur Löschung / bis zur nächsten Trennung) wird vom Daemon als einzigem Autor erzwungen. Die GUI schreibt niemals einen Ablauf; Es liest den config.json, den der Daemon beim nächsten Tick neu geschrieben hat, erneut und spiegelt ihn in der Benutzeroberfläche wider (wodurch ein Konflikt vermieden wird).
Air-Gap (Notfall-Netzwerkisolierung)
Ein vollständiger Isolationsmodus, der policy drop (Priorität -100) sowohl für die Eingabe- als auch für die Ausgabe-Hooks der Tabelle inet roamswitch festlegt und nur lo zulässt.
- Fail close – Beim Neustart des Daemons wird durch die Erkennung der Markierungsdatei (
/run/roamswitch/airgap.active) die Isolation erneut sichergestellt. - Selbstheilend – Wenn ein externer Prozess die Regeln mit
nft delete tablelöscht, wird die Sentinel-Schleife innerhalb von Sekunden erneut angewendet. - Automatischer Ablauf – 600 Sekunden nach der Aktivierung (identisch mit macOS
maxAirGapDuration) wird die Isolation automatisch aufgehoben und verhindert so einen dauerhaften Verbindungsverlust durch einen Fehlklick.
table inet roamswitch {
chain input {
type filter hook input priority -100; policy <accept|drop>;
iif "lo" accept
ct state established,related accept
# balanced/lockdown: alles andere droppen
}
chain output {
type filter hook output priority -100; policy <accept|drop>;
# policy drop nur während Air-Gap; nur lo und ct established sind erlaubt
}
}
Passiver Link Guard (Erkennung von Phishing-Verbindungen)
Der Daemon überwacht, wohin ausgehende Verbindungen gehen, und markiert bzw. blockiert Verbindungen zu gefährlichen Hosts, wenn es sich um die eng gefasste Gruppe „eindeutig Phishing“ handelt. Es ersetzt den älteren Paste-a-URL-Checker, der ein Eingreifen des Benutzers erforderte.
- Interception – eine dedizierte nftables-Tabelle
inet roamswitch_linkguardbindet den Pfadoutputein und stellt DNS-Fragen und neue/frühe Webverbindungen über NFQUEUE in die Warteschlange für einen Userspace-Worker. NFQUEUE ist ein Kernel↔Userspace-Urteilskanal überAF_NETLINK; Der Daemon bindet keinen Socket und generiert kein Paket. Die Warteschlangenregeln tragenbypass, sodass der Datenverkehr ungehindert durchläuft, wenn der Worker nicht ausgeführt wird (Air-Gap bleibt der separate harte Stopp). - Hostname-Quellen – der DNS-Fragename, der TLS-ClientHello SNI (damit ein Browser, der DoH verwendet, immer noch durch den Hostnamen abgedeckt wird) und der Klartext-HTTP-Header
Host. Encrypted ClientHello (ECH), sobald es weit verbreitet ist, ist ein bekannter blinder Fleck. - Verdict (
roamswitch-core, reine Logik) – ein Host wird anhand des lokalen Phishing-/Bedrohungs-Feeds und einer Reihe von Offline-Heuristiken überprüft: IDN/verwechselbares Homograph einer geschützten Marke, Markentoken in einer nicht offiziellen Domäne, Raw-IP-Host, TLD mit hohem Risiko.
Modus (linkGuard.mode) | Feed-Hit oder Markenhomograf | Andere verdächtige Signale |
|---|---|---|
off | nicht geprüft | nicht geprüft |
warn | Verbindung hielt bis zu 8 s + eine Aufforderung zur Genehmigung/Blockierung | Nur Benachrichtigung |
block (Standard) | Verbindung getrennt + ein Zulassungsdialog (einmal pro Host) | Nur Benachrichtigung |
Nur ein Feed-Hit oder ein Markenhomograph-Host wird jemals hart blockiert; Alles, was die Heuristik allein kennzeichnet, ist eine Warnung. warn-Modus hält die Verbindung zu einem gefährlichen Host bis zu 8 Sekunden lang, während der Benutzer gefragt wird; Wenn die Sperre ohne Antwort abläuft, ist sie fail-closed (die Pakete werden verworfen und das Urteil wird nicht zwischengespeichert) – es erfolgt keine Antwort auf „Ist diese Site in Ordnung?“ darf nicht „Ja“ bedeuten und wird beim nächsten Versuch erneut aufgefordert. Im block-Modus werden eine Benachrichtigung und ein Zulassungsdialog pro Host angezeigt (ein Browser, der viele Verbindungen zum gleichen blockierten Host öffnet, überflutet keine Benachrichtigungen mehr). In einem gefährlichen Genehmigungsdialog ist die Standardschaltfläche „Weiter blockieren“ und „Zulassen“ ist die stille, nicht standardmäßige Option. Ein blockierter Host kann dauerhaft oder für fünf Minuten ab der Benachrichtigung (linkGuard.allowlist) zugelassen werden.
DNS wird überprüft, nie gefälscht: Eine DNS-Frage auf der Blockliste erzeugt nur eine Benachrichtigung; Die Durchsetzung erfolgt auf der nachfolgenden TCP-Verbindung, sodass RoamSwitch niemals eine synthetische DNS-Antwort einfügt. Der feed ist eine zusammengestellte Liste von Phishing-/Betrugsdomänen, die im Paket geliefert und vom täglichen Updater aktualisiert wird (§11). Auch wenn kein Feed vorhanden ist, werden die Offline-Heuristiken weiterhin ausgeführt. Die Ed25519-Signatur der Feeddatei wird vor dem Laden überprüft. Ein fehlerhafter oder fehlender Feed scheitert nur an der „Heuristik“ und niemals daran, „alles zuzulassen“.
VPN-Tunnel + Kill-Switch (die primäre MITM-Verteidigung)
Anti-MITM-Schutz, der nicht von der Integrität der Schicht 2 abhängt. In einem nicht vertrauenswürdigen Netzwerk macht ein ständig aktiver verschlüsselter Tunnel zu einem vertrauenswürdigen Endpunkt lokales ARP/NDP-Spoofing, Rogue-DHCP und passives Sniffing irrelevant – der Angreifer sieht nur Chiffretext. Die ARP/NDP-Sperre und die folgende Erkennung sind für diese Funktion zweitrangig.
Zwei Backends zur Auswahl – „WireGuard (Konfigurationsdatei)“ oder „Tailscale (Ausgangsknoten)“. RoamSwitch implementiert keine eigene Kryptografie und ist kein VPN-Anbieter. Beide Backends sind optionale Abhängigkeiten; Wenn nicht, zeigt die GUI den Installationsbefehl an.
(A) WireGuard-Backend
- Es wird kein VPN-Server bereitgestellt – verwendet eine WireGuard-Konfiguration, die der Benutzer bereitstellt: eine
.confvon einem Anbieter wie Mullvad, IVPN oder Proton VPN oder den eigenen WireGuard-Server des Benutzers (ein VPS oder ein Heimserver). Es wird keine Standardkonfiguration ausgeliefert. - Config – der Daemon validiert den
.confund speichert ihn unter/etc/wireguard/roamswitch.conf(0600, Schnittstelleroamswitch). Es kann nicht anderswo leben: Das AppArmorwg-quick-Profil unter Ubuntu 24.04+ / Debian 13 verweigertwg-quickdas Lesen eines.confaußerhalb von/etc/wireguard/– selbst als Root. Eine Split-Tunnel-Konfiguration (AllowedIPs, nicht0.0.0.0/0/::/0) wird als „nicht der gesamte Datenverkehr ist geschützt“ gekennzeichnet. - Kill-switch – eine dedizierte nftables-Tabelle
inet roamswitch_vpn(policy drop, beide Hooks) verwirft alles außer Loopback, der Tunnelschnittstelle (roamswitch, passend zuoifname), UDP zur angehefteten Endpunkt-IP, DHCP und ICMP. Es wird vor installiert, bevor der Tunnel eingerichtet wird (der Endpunkt wird zuerst übergetent ahostsin feste IPs aufgelöst), sodass es kein Leckfenster gibt. Wennwg-quick upfehlschlägt, bleibt der Kill-Switch aktiv.
(B) Tailscale-Backend
- Für Benutzer, die Tailscale bereits ausführen. RoamSwitch führt nicht aus, führt
tailscale up/ login / installtailscaledaus – es liesttailscale status --jsonund führttailscale set --exit-node=<node>/--exit-node=aus (klar). - Ein Exit-Knoten ist erforderlich – Anti-MITM-Schutz gilt nur bei einem Exit-Knoten, der den gesamten Datenverkehr weiterleitet. Wenn „Keine“ konfiguriert ist, ist der Schutz nicht aktiviert und die Benutzeroberfläche warnt „nicht geschützt“. Wenn der ausgewählte Knoten offline geht, wird der Schutz automatisch deaktiviert und der Benutzer benachrichtigt (die Weiterleitung aller Daten über einen toten Knoten würde die Verbindung blockieren).
- Kill-switch (
inet roamswitch_ts,policy drop) – Der Transport von Tailscale kann nicht an eine einzelne Endpunkt-IP (DERP-Relays + Roaming-Peers) angeheftet werden, daher ist dieser lockerer als der von WireGuard. Es ermöglicht: Loopback, die Tunnelschnittstelle (tailscale0), die CGNAT-Bereiche100.64.0.0/10undfd7a:115c:a1e0::/48, STUN (udp/3478), DERP (tcp/443),udp/41641, DHCP, ICMP, MagicDNS (100.100.100.100:53), aufgebaute Verbindungen. Alles andere – beliebiges UDP, DNS zu einem lokalen Resolver, SMB, mDNS, Klartext-HTTP, beliebiges TCP – wird gelöscht. - Kill-Switch-Vorbehalte – (1) breitere Zulassungsliste als das WireGuard-Backend (
udp/3478,tcp/443, das gesamte CGNAT/10). (2) Ein On-Path-Angreifer sieht immer noch Metadaten (dass Tailscale verwendet wird, DERP-Region, Timing) und kann sie löschen/verzögern – kann die getunnelte Nutzlast jedoch nicht lesen. (3) Wenn direktes UDP blockiert ist, beruht die Vertraulichkeit auf Tailscales eigenem DERP TLS mit festem Zertifikat. (4) Wenn MagicDNS ausgeschaltet ist und ein lokaler Resolver vorhanden ist, bricht DNS im aktivierten Zustand ab (UI-Warnung). (5) Captive-Portale müssen vor der Aktivierung angemeldet sein.
Common – nur aktiviert, wenn vpn_on_untrusted_enabled und das Netzwerk nicht vertrauenswürdig ist (level != open). In einem vertrauenswürdigen Netzwerk wird der Exit-Knoten gelöscht und der Kill-Switch entfernt (niemals tailscale down). Standardmäßig deaktiviert, Opt-in. Der WireGuard-Tunnel/Tailscale-Transport geht an den eigenen VPN-Endpunkt/Tailnet des Benutzers und hat nichts mit der Infrastruktur von lafine zu tun (§9).
Präventive ARP/NDP-Sperre
Sobald ein nicht vertrauenswürdiges Netzwerk beitritt, werden die MAC-Adressen der On-Link-Infrastruktur, die ein MITM-Angreifer nachahmen müsste, in der Kernel-Nachbartabelle als PERMANENT (statische) Einträge verankert. Nach dem Fixieren ignoriert der Kernel gefälschte ARP-Antworten/Nachbar-Ankündigungen.
- ___ IPv6-Nachbarn werden mit
ip -6 neigh replace ... nud permanentgepinnt. - Vertrauenswürdige Netzwerke werden nie angeheftet – ein Neustart des Heimrouters kann also nicht dazu führen, dass der Benutzer ins Schwarze getroffen wird. Auf jedem Netzwerk-Switch neu angepinnt (TOFU); Bei der nächsten Wiederherstellung der Verbindung wird ein legitimes Failover erkannt. Angepinnte Einträge werden in
/var/lib/roamswitch/arp_lock.jsonaufgezeichnet. - Standardmäßig aktiviert (Community Edition-Richtlinie; gleiche Aufschlüsselung wie beim macOS Pro-Build). Umschalten:
gateway_arp_lock_enabled.
ARP-Spoof-Erkennung (notify-first)
Überwacht /proc/net/arp auf eine IP-Zuordnung zu mehreren MACs und auf eine verdächtige plötzliche Änderung des Gateway-MAC. Im Lockdown: Den gesamten Verkehr unterbrechen (Air-Gap) + benachrichtigen. Auf ausgeglichenen/vertrauenswürdigen Netzwerken: benachrichtigen ohne zu schneiden; Der Benutzer löst den Notfall-Air-Gap über RoamSwitch aus. Dies (a) verhindert, dass ein Angreifer ein einzelnes gefälschtes ARP-Paket als Waffe für einen selbstverschuldeten Ausfall nutzt, und (b) verhindert, dass ein Router-Neustart oder ein Access-Point-Roaming diesen versehentlich auslöst. Umschalten: arp_spoof_guard_enabled.
Port Anomaly Guard
Enthält automatisch einen Überwachungsport, der neu dem externen LAN zugänglich gemacht wird (eine Hintertür, C2 oder ein Entwicklungsserver/eine lokale LLM-API, die versehentlich an 0.0.0.0 gebunden ist). Das Urteil lautet baseline-relative, nicht „gefährliche Portnummer“. Bei der Aktivierung werden die aktuell verfügbar gemachten ausführbaren Dateien als „bekannt“ erlernt; Danach wird nur eine neu erschienene verfügbar gemachte ausführbare Datei markiert (Identität = der ausführbare Pfad, Snapshots normalisiert auf snap:<name>). Systemdämonen liegen außerhalb des Gültigkeitsbereichs. Die Eindämmung erfolgt über die Tabelle inet roamswitch_dev_guard: Legen Sie TCP von einem beliebigen Ort außer lo auf diesen Port ab – die Maschine selbst verwendet ihn weiterhin. Bei der automatischen Eindämmung wird sofort ein Desktop-Benachrichtigungs- und Bestätigungsdialogfeld („Diesen Port zulassen“/„Blockiert halten“) angezeigt, der eine permanente Whitelist mit einem Klick ermöglicht. Über den Port-Diagnosebildschirm kann jeder Port auch einzeln zugelassen und die Baseline neu erfasst werden. Standardmäßig aktiviert. Umschalten: port_anomaly_guard_enabled. Portiert von macOS.
Docker-Risikoerkennung & Firewall-Umgehungsschutz
Von Docker veröffentlichte Ports (-p) sind bekanntermaßen in der Lage, die Standard-Firewall des Hosts zu umgehen. Daher werden dauerhaft Prüfregeln in die DOCKER-USER-Chain eingefügt, die jeglichen nicht ausdrücklich erlaubten externen Datenverkehr blockieren (keine Konfiguration nötig, standardmäßig aktiv). Zusätzlich wird docker events in Echtzeit überwacht, um den Moment zu erkennen, in dem ein --privileged-Container startet oder /var/run/docker.sock eingebunden wird – ein Risiko für einen Container-Ausbruch – und Sie sofort zu benachrichtigen. Da dies eine riskante Konfiguration und keine bestätigte Kompromittierung anzeigt, erfolgt nur eine Benachrichtigung ohne automatische Blockierung.
Scanner für Geheimnisse & API-Schlüssel-Lecks
Erkennt API-Schlüssel (OpenAI, Anthropic, AWS, GitHub, Slack, Stripe u. a.) und SSH-Private-Keys mittels Shannon-Entropie und Mustererkennung. roamswitch audit-secrets <text|Datei|Verzeichnis> durchsucht Text und Dateien sowie rekursiv ein ganzes Verzeichnis (überspringt .git, node_modules u. Ä.; Dateien über 2 MB oder die binär wirken, werden übersprungen). Dieselbe Funktion steht auch über das MCP-Tool audit_secrets und die Python-SDK-Methode audit_secrets_directory() zur Verfügung. Inhalte werden niemals irgendwohin übertragen.
Erstmaliger Setup-Assistent und Bestätigungs-Benutzeroberfläche
Das Paket wird mit /etc/xdg/autostart/roamswitch.desktop geliefert, sodass der Setup-Assistent bei der ersten Anmeldung nach der Installation gestartet wird (danach ist er nur noch in der Taskleiste vorhanden). Beim Aktivieren/Deaktivieren eines Sicherheitswächters wird ein Bestätigungsdialogfeld für dieselben Wächter wie beim macOS-Build angezeigt (Portanomalie, ARP-Auto-Containment, USB-Speicher, BadUSB-Tastatur, Bluetooth). Entscheidungen zum Ereigniszeitpunkt (eine unbekannte USB-Tastatur, ein nicht registriertes USB-Laufwerk, ein unbekannter automatisch blockierter Port, ein Notfall-Air-Gap) werden als modale Dialoge dargestellt.
§5
Shannon-Entropie-Burst-Erkennung · YARA-Scanning
Schreibereignisse werden per PID verfolgt. Wenn ein einzelner Prozess innerhalb von 5 Sekunden 20 oder mehr distinct Dateien mit einer Entropie ≥ 7,92 erstellt, wird dies als Ransomware-Massenverschlüsselung behandelt: Der Prozess wird mit SIGSTOP eingefroren und Air-Gap wird ausgelöst.
- Vollständige Trennung von YARA-Scanning und Entropie-Tracking – Die YARA-Malware-Inspektion wird ausnahmslos auf alle geschriebenen Dateien angewendet (Zero Bypass, Scanning
~/.cache/,node_modules/,/tmp/und Archive). Unterdessen schließt die Ransomware-Entropie-Burst-Analyse natürlich komprimierte Formate (.zip,.tgz,.tar.gz,.gz,.png,.jpg,.mp4,.wasm) und verifizierte Paketmanager (npm,npx,cargo,rustc,dpkg,apt,tar), der in Build-/Cache-Bäumen arbeitet, um falsch positive SIGSTOP-Einfrierungen zu verhindern. - Wiederholte Überschreibungen derselben Datei (z. B. die drei Durchläufe von
shred) zählen als ein Ereignis. - ___
Kanarienvögel (Köderdateien)
Decoy-Dateien werden in den Ordnern „Dokumente“, „Desktop“, „Downloads“ und „Bilder“ des Benutzers sowie in einem speziellen Verzeichnis abgelegt und in einem 3-Sekunden-Zyklus mit einer SHA-256-Basislinie verglichen. Jede Umbenennung, Löschung, Kürzung oder Inhaltsänderung löst Air-Gap sofort aus. Da der Daemon als Root ausgeführt wird, zählt er /home/* auf und stellt Canaries in den Verzeichnissen jedes echten Benutzers bereit.
Fanotify-Überwachung · Quarantäne-Tresor · ClamAV
- Der Daemon überwacht
/home,/var/tmp,/dev/shmauf Mount-Ebene und/auf Dateisystemebene überFAN_CLASS_CONTENT(FallbackFAN_CLASS_NOTIF). - Notify-first, keine stille Quarantäne. Ein bloßer YARA-/ClamAV-Treffer wird nie stillschweigend unter Quarantäne gestellt oder
FAN_DENY'd. Eine echte Signatur löst eine modale Anfrage in/run/roamswitch/approvals.json(Quarantäne/Zulassen/Später) aus; Nichts gelangt in den Tresor, bis der Benutzer dies bestätigt. Nur ein tatsächlicherexecveistFAN_DENYund nur, wennpre_exec_blocking_enabledaktiviert ist. Die Genehmigung läuft bei Fail-Open ab. - Testsignaturen wie EICAR werden nur im Verlauf erfasst – die branchenübliche Testzeichenfolge löst keine Benachrichtigung aus, sondern erzeugt nur einen Eintrag im Benachrichtigungsverlauf, und wird weder im Fanotify-Guard noch im Download-Guard unter Quarantäne gestellt oder blockiert.
- Eine vom Benutzer konfigurierte
scan_exclusions-Pfadliste (absolute Pfade, rekursiv angewendet; sie fasst das alteclamav_exclusionszusammen) wird sowohl von den YARA- als auch den ClamAV-Scannern berücksichtigt. „Zulassen“ in der Eingabeaufforderung und „Wiederherstellen“ in der Registerkarte „Quarantäne“ werden beide daran angehängt, sodass dieselbe Datei nicht erneut markiert wird. - Erkannte und bestätigte echte Malware wird nach
~/.local/share/roamswitch/quarantine/verschoben. Der Tresor ist0700; Jedes Beispiel ist0400(schreibgeschützt, nicht ausführbar). Bei der Wiederherstellung kehrt die Datei zu0644zurück und wird an den Eigentümer des Zielverzeichnisses übertragen. - Die Berechtigungsereignisschleife führt keine Dateisystem-E/A durch – die Konfiguration wird von einem dedizierten Hintergrundthread in einen
Mutex<GuardConfig>-Snapshot gelesen; Hot-Path-Accessoren sperren und kopieren einfach. Dies ist eine Designinvariante: Das Blockieren aufFAN_OPEN_PERMwürde die Maschine einfrieren. - Wenn ClamAV vorhanden ist, werden neu heruntergeladene ausführbare Dateien (
.sh,.deb,.elf, …) und gefährliche KI-Modelle (.pkl,.pt) anhand der lokalen Datenbank gescannt. ClamAV ist eine optionale Abhängigkeit; Die anderen Abwehrmechanismen funktionieren auch ohne. Bei der Installation ruft der tägliche Updater (§11)freshclamauf, damit die Signaturdatenbank aktuell bleibt.
Kernel Local Privilege Escalation (LPE) Preemption & Hardening
Wenn ein Angreifer oder eine Schadsoftware unprivilegierten Benutzern Zugang verschafft, verhindert die Tiefenverteidigung, dass Schwachstellen im Linux-Kernel ausgenutzt werden, um Root-Rechte zu erlangen.
- ___ RoamSwitch bewertet und erzwingt
user.max_user_namespaces = 0(oderkernel.unprivileged_userns_clone = 0) über einen One-Click-Hardening- oder Setup-Assistenten. Dies schließt die Angriffsfläche für unprivilegierte Prozesse ab, selbst bei ungepatchten Kernel-Zero-Days. - Yama LSM-Speicherschutz – Durch die Durchsetzung von
kernel.yama.ptrace_scope = 1(oder2) wird verhindert, dass nicht autorisierte Prozesse überptraceeine Verbindung herstellen oder über/proc/$pid/memden Speicher lesen, wodurch Browsersitzungen und private GPG/SSH-Schlüssel geschützt werden. - Core Dump Suppression – Die Einstellung
fs.suid_dumpable = 0verhindert, dass abstürzende sensible Prozesse Klartext-Speicherauszüge auf die Festplatte schreiben. - __
eBPF-Laufzeit-Bedrohungssensor und autonomes Einfrieren von Prozessen (Desktop eBPF Guard)
Der RoamSwitch-Client-Daemon umfasst eine native Integration mit modernen eBPF-Sensoren im Kernel (Falco / Tetragon / BTF).
# eBPF-Laufzeit-Bedrohungserkennung & autonomer Abwehrfluss [Bösartiger Prozess (LPE/Malware)] │ Illegale Syscall-Ausführung (Frag-Gap-Ausnutzungsversuch) ▼ [Linux-Kernel (eBPF-Sonde)] │ eBPF-Ringpuffer (kompaktes 2-MB-Design) ▼ [Falco (RoamSwitch Optimized)] │ Direkter UNIX-Socket im Arbeitsspeicher (/var/run/roamswitch/events.sock) ▼ [roamswitch-daemon (root)] ├─► ① Millisekunden-Einfrieren des angreifenden Prozesses: kill(pid, SIGSTOP) [Zustand: Ts] ├─► ② Vollständige Netzwerktrennung: nftables input/output drop [Air-Gap aktiviert] └─► ③ Desktop-Notfallwarnung: GTK3-Modal & libnotify-Benachrichtigung
- Direct UNIX Domain Socket IPC (
/var/run/roamswitch/events.sock) – Warnungen von Falco oder anderen eBPF-Sensoren werden direkt über einen speicherinternen UNIX-Socket empfangen, ohne in Festplattenprotokolle zu schreiben, wodurch Festplatten-E/A-Latenz vermieden wird und Antwortübergaben in weniger als einer Sekunde möglich sind. - ___ löst eine sofortige Desktop-Benachrichtigung aus.
- Overhead-arme Desktop-Abstimmung & Schutz vor Log-Aufblähung (RoamSwitch Optimized) — um Akkuverbrauch, CPU-Last und Speicherplatzerschöpfung auf Laptops und Workstations einzudämmen, liegt ein optimiertes Profil (
99-roamswitch-optimized.yaml) bei:- Schweregradfilterung (
priority: warning) – Filtert 95 % der routinemäßigen Hinweis-/Infoereignisse heraus. - Kernel Early Drop (
drop_failed_exit: true) – Verwirft fehlgeschlagene Systemaufruf-Exits direkt im Kernel-Treiber, wodurch Kontextwechsel und CPU-Last halbiert werden. - Kompakter Ringpuffer (
cpus_for_each_buffer: 2) – Reduziert die Größe des Ringpuffers auf 2 MB, wobei der residente RAM bei 30–50 MB und die CPU-Auslastung bei <1 % bleibt. - Obligatorische Protokollrotationsobergrenze (
/etc/logrotate.d/roamswitch-falco) – Erzwingt eine strikte Obergrenze von 50 MB mit komprimierter Rotation der 7. Generation.
- Schweregradfilterung (
- Hybrid Resilience (Standalone vs. eBPF-Modus) – Ohne Falco schützt RoamSwitch das System über Kernel sysctl (
user.max_user_namespaces = 0), nftables-Roaming-Profile, Fanotify-Entropie-Tracking und Canaries. Mit Falco fängt die tief im Kernel integrierte Verhaltenstelemetrie fortgeschrittene Zero-Day-Exploits ab und friert Angreiferprozesse in Echtzeit ein.
§6
USB-Ereignisse werden überwacht; Tastaturgeräte (HID) und USB-Massenspeicher werden verfolgt. Standardmäßig deaktiviert (Auslieferung isEnabled = false, passend zu macOS USBKeyboardGuard / USBStorageGuard). Melden Sie sich über den Erstausführungsassistenten oder die Registerkarte „USB“ an. Beim Aktivieren wird ein Bestätigungsdialog angezeigt.
Rogue-USB-Tastatur (Tastenanschlag-Injektion)
- Keine Deautorisierung physischer Ports auf Kernel-Ebene (wichtig). Die alte Implementierung (≤1.0.6) schrieb
0bis/sys/bus/usb/devices/*/authorizedfür eine nicht registrierte Tastatur und trennte sie physisch. Bei einem kombinierten Tastatur- und Mausempfänger (üblich bei einem Raspberry Pi oder einem Mini-PC) wird dadurch auch die Maus getrennt, wodurch ein Computer ohne eingebauten Eingang gesperrt wird. RoamSwitch verweigert jetzt strikt das Schreiben vonauthorized=0auf ein Gerät, das eine HID-Schnittstelle (bInterfaceClass 03) bereitstellt, und der Daemon autorisiert jedesauthorized==0HID-Gerät beim Start erneut, um Maschinen selbst zu reparieren, die durch eine frühere Version blockiert wurden. - ___ Der Mausknoten bleibt unberührt. Dies ist das Linux-Äquivalent von macOS
CGEventTap; Das Gerät bleibt mit Strom versorgt. - Sicherheit – Der Zugriff erfolgt nur, wenn eine andere Tastatur zum Tippen vorhanden ist (eine integrierte oder eine zugelassene und angeschlossene USB-Tastatur), sodass ein Computer mit einer einzigen neuen Tastatur niemals gesperrt wird.
- Genehmigungsdialog – neben der Übernahme wird eine Genehmigungsanfrage in
/run/roamswitch/approvals.jsonin die Warteschlange gestellt und die GUI zeigt ein Modal (Zulassen/Verweigern) an. Zulassen, setzt das Gerät auf die Whitelist und gibt den Zugriff frei. Fail-open nach 3 Minuten.
Schurken-USB-Massenspeicher
Wenn ein nicht registriertes USB-Massenspeichergerät (keine HID-Schnittstelle) eingesteckt wird, der Schutz aktiviert ist und das Netzwerk nicht vertrauenswürdig bzw. gesperrt ist, wird es mit authorized=0 (sicher für ein Nicht-HID-Gerät) gehalten und ein Genehmigungsdialog angezeigt. Erneute Autorisierungen und Whitelists zulassen; Deny hält es aufrecht. Der macOS-Build wurde in 1.7.4 an dieses Modell „Schreibgeschützt halten + Genehmigungsaufforderung“ angepasst.
Identifikation und Bestandsschutz
HID wird aus bInterfaceClass == "03" und der Zeile Handlers= in /proc/bus/input/devices ermittelt. Ein Kombinationsempfänger (ein VID:PID mit sowohl einem kbd- als auch einem Mausabschnitt) wird durch VID:PID zusammengeführt. Eine nicht registrierte Tastatur, die beim Daemon-Start vorhanden ist, ist Großvaterschutz; Geschnappt wird lediglich eine nachträglich hot-plugged Tastatur.
§7
Der LinuxHealthChecker in roamswitch-core bewertet 24 Elemente und ergibt eine Punktzahl von 0–100, eine A–F-Note und Ratschläge pro Element. Im GTK-Dashboard, der CLI (roamswitch status) und dem MCP (get_security_report), werden Titel, Details und Empfehlung aller 24 Elemente in der Sprache des Benutzers (10 Sprachen) angezeigt.
| Kategorie | Beispielartikel |
|---|---|
| Festplatte / Boot | LUKS/dm-crypt-Verschlüsselung, UEFI Secure Boot |
| Zugangskontrolle | LSM (AppArmor / SELinux), SSH / Sudo-Konfigurationsprüfung |
| Kernhärtung | sysctl-Härtung, Deaktivierung unprivilegierter Benutzer-Namespaces (Frag Gap-Mitigation), Core-Dump-Kontrolle, Noexec auf /tmp und /dev/shm |
| Aktualisierungen | Automatische Konfiguration von Sicherheitsupdates |
| Netzwerk | ARP-Spoofing-Überwachung, Gateway-ARP/NDP-Sperrstatus, Prüfung exponierter Ports, Stärke der WLAN-Verschlüsselung |
| Schadsoftware | ClamAV / fanotify (überprüft auch, dass der Guard tatsächlich läuft) / Entropieüberwachung / noexec |
| Browser | Firefox / Chrome / Chromium Safe Browsing-Einstellungen |
| DNS / USB | Bedrohungsschutz-DNS, Zero-Trust-Status des USB-Busses |
Jede Prüfung basiert auf dem Lesen lokaler Dateien und der Befehlsausgabe (getenforce, mokutil, resolvectl, ss, …). Es gibt keinerlei externe Abfrage.
Vertrauensbewusste Einstufung. Die Härtung, die RoamSwitch absichtlich nicht in einem vertrauenswürdigen (Heim-)Netzwerk anwendet – Fixierung des Gateway-MAC als PERMANENT (was das LAN bei einem Neustart des Routers blockieren würde), erneutes Mounten von /tmp und /dev/shm noexec (was Paket-Builds und einige Installationsprogramme unterbricht) und Bedrohungsschutz-DNS im Standardbereich – wird grün mit angezeigt eine Erklärung anstelle eines roten „nicht gehärtet“ und weist darauf hin, dass es automatisch auf ein nicht vertrauenswürdiges Netzwerk angewendet wird. Die Laufzeitwahrheit kommt von /run/roamswitch/state.json (active_level / network_trusted / fanotify_ready), die in jedem Zyklus vom Daemon geschrieben wird. Das Fanotify-Element prüft, ob der Guard tatsächlich markiert ist und ausgeführt wird (/run/roamswitch/fanotify.ready), und nicht nur, ob der Kernel ihn unterstützt. Das Element „exponierte Ports“ liest das Live-Profil des Daemons (der MCP-Hardcode ist weg).
___ Der Daemon wird als Root ausgeführt, sodass bis auf den Daemon-Neustart kein pkexec erforderlich ist.
§8
roamswitch-mcp spricht JSON-RPC über stdio und wird von KI-Clients wie Claude Desktop, Cursor und Antigravity erzeugt. Jedes Tool ist schreibgeschützt und vollständig lokal.
| Werkzeug | Zweck |
|---|---|
| get_security_report | 24-Punkte-Bewertung, Punktzahl, Empfehlungen |
| get_exposed_ports | exponierte Ports und deren Firewall-Blockierungsstatus |
| get_guard_status | aktuelle Schutzstufe und Status des Verteidigungsmoduls |
| audit_url_safety | Heuristische URL-Sicherheitsanalyse (ruft das Ziel nicht ab) |
| audit_secrets | Erkennung von API-Schlüsseln/Geheimnissen im Text (übermittelt den Text nicht) |
| audit_security_logs | Aggregation lokaler Journal-/Authentifizierungsprotokolle |
| get_quarantine_status / get_canary_status | Quarantäne und Kanarienstaat |
| get_app_help | Suche in der integrierten Wissensdatenbank |
| run_active_vuln_scan | Nicht-destruktive, ausschließlich auf 127.0.0.1 beschränkte aktive Schwachstellenprüfung. Das einzige Tool, das das Netzwerk nutzt — standardmäßig deaktiviert und nur nach Zustimmung in den Einstellungen. |
| run_package_cve_scan | Gleicht installierte Pakete (Mac: Homebrew / Linux: dpkg, dnf, zypper, pacman) mit einer lokalen CVE-Zuordnung ab. Es findet überhaupt keine Netzwerkkommunikation statt. |
| run_package_cve_scan_languages | Gleicht Abhängigkeits-Lockfiles für npm, PyPI, crates.io, RubyGems, Packagist, Go und Maven mit derselben lokalen CVE-Zuordnung ab. Es findet überhaupt keine Netzwerkkommunikation statt. |
| verify_fim | Berechnet die Hashes von rund 150 kritischen Systemdateien neu und vergleicht sie mit der gespeicherten Baseline. |
| get_file_scan_guard_status | Liefert die Konfiguration des File Scan Guard (ClamAV) und den Zustand des zugehörigen Quarantäne-Tresors. |
| get_port_anomaly_incidents | Liefert den Baseline-Zustand des Port-Anomalie-Schutzes, aktuell automatisch blockierte Ports und bis zu die 50 jüngsten Vorfälle. Die Antwort weist ausdrücklich darauf hin, dass die aktuell blockierten Ports eine zeitstempellose Momentaufnahme sind, die sich von der zeitgestempelten Vorfallshistorie unterscheidet. |
| get_ebpf_incidents | Liefert den aktuellen Isolationsstatus des eBPF-Runtime-Guards und die Vorfallshistorie dahinter. |
| get_resource_guard_incidents | Liefert die Historie des Ressourcen- und Prozessanomalie-Schutzes (Speicherlecks, Crash-Loops) samt Konfidenzstufe. |
| get_notification_history | Gibt den Verlauf der von RoamSwitch gesendeten Benachrichtigungen (Sicherheitslog-Auffälligkeiten, ClickFix-Erkennungen u. a.) der letzten 7 Tage zurück, neueste zuerst. |
| get_incident_timeline | Führt die Erkennungen aller Schutzmodule zu einer chronologischen Zeitleiste zusammen — mit Prozessabstammung und MITRE-ATT&CK-Tags (experimentell). |
Der MCP-Server öffnet selbst kein Netzwerk; er verbindet sich über roamswitchkit mit dem Unix-Socket des Daemons oder ruft die Logik von roamswitch-core direkt auf. Die einzige Ausnahme ist das standardmäßig deaktivierte run_active_vuln_scan, das nicht-destruktive Prüfanfragen an 127.0.0.1 — also an den Host selbst — sendet.
Eine bei einer Fire-Drill-Übung mit einem lokalen LLM entdeckte und behobene Fehlzuordnung
Im September 2026 führten wir mit diesem MCP-Server eine Übung durch, bei der ein lokales LLM (Qwen 3.8 27B) einen Vorfall untersuchen sollte, und entdeckten dabei einen Fall, in dem das Modell die von get_port_anomaly_incidents zurückgegebenen Daten falsch interpretierte und eine unabhängige, ältere Portsperrung in die Erzählung eines laufenden Vorfalls einflocht. Die Ursache: Eine zeitstempellose Momentaufnahme der aktuell blockierten Ports wurde in derselben Antwort wie die echte, zeitgestempelte Vorfallshistorie zurückgegeben, ohne dass etwas zwischen beiden unterschied. Die Korrektur fügt explizite Hinweisfelder hinzu, die kennzeichnen, welches Feld eine Zeitleiste und welches eine Momentaufnahme ist. Beim erneuten Ausführen desselben Szenarios mit demselben Modell zitierte dieses den Wortlaut des Hinweises und lehnte es ausdrücklich ab, den alten Port dem aktuellen Vorfall zuzuordnen. Die Wirksamkeit der Korrektur wurde sowohl durch einen automatisierten Regressionstest als auch durch die erneute Ausführung mit dem echten lokalen LLM bestätigt.
§9
RoamSwitch für Linux stellt genau eine Art ausgehender Anfrage dar: die GET eines signierten Manifests des täglichen Updaters (§11). Alles andere – jede Bewertung, Erkennung und jedes Audit – wird lokal abgeschlossen. RoamSwitch für Linux ist proprietäre Freeware und seine Quelle ist nicht veröffentlicht, daher wurden die folgenden Inspektionen von lafine durchgeführt; Die Ergebnisse sind in 9.2 enthalten und die Schritte in Anhang C sind allein aus dem verteilten Paket reproduzierbar.
9.1 Prüfmethode
- Crate-Isolation – ein HTTP/TLS-Stack ist nur in einer Kiste,
roamswitch-updaterzulässig, der die eigenständige, zeitgesteuerte Updater-Binärdatei erstellt.scripts/audit_no_network.sh(in CI ausgeführt, Gating) schlägt beim Build fehl, wennroamswitch-core,roamswitch-daemon,roamswitch-app,roamswitch-mcpoderroamswitchkitreqwest/hyper/ureq/rustls/native-tls/openssleinzieht oder wenn eine.rs-Datei außerhalb vonroamswitch-updaterTcpStream/ verwendetTcpListener/UdpSocket/to_socket_addrs/lookup_host. - Abhängigkeitsbauminspektion – der vollständige
Cargo.lockwurde nach Telemetrie-/Analyse-/Absturzberichts-SDKs durchsucht (sentry,opentelemetry, …). - __
- Subprocess enumeration – jede
Command::new(...)-Aufrufseite wurde überprüft.
9.2 Ergebnisse
| Prüfungselement | Ergebnis |
|---|---|
| HTTP/TLS-Stack | Nur in roamswitch-updater (ureq + rustls) vorhanden. Nicht in core / daemon / app / mcp / kit |
| Telemetrie-/Analyse-/Absturzberichts-SDK | Nicht vorhanden nirgendwo |
TcpStream / TcpListener / UdpSocket | Kein einziges Vorkommen außerhalb von roamswitch-updater |
| Verwendete Socket-APIs | AF_UNIX (lokaler IPC); AF_NETLINK (NFQUEUE-Urteilskanal, nftables und ip neigh-Steuerung – kein Ausgang); AF_INET nur in roamswitch-updater. Der VPN-Tunnel (§4) ist, wenn er aktiviert ist, wg-quick (WireGuard-Backend) oder tailscaled (Tailscale-Backend) – ein Unterprozess, nicht der Daemon – und sendet Datenverkehr an den eigenen Endpunkt/Tailnet des Benutzers |
| Täglicher Updater | Ein GET https://lafine.net/updates/v1/manifest pro ~24 Stunden. Keine Abfragezeichenfolge, keine Cookies, generischer Benutzeragent, keine Kennungen. Alle Nutzlasten Ed25519-verifiziert. updates.enabled = false deaktiviert es vollständig |
| VPN-Tunnel (§4) | Standardmäßig deaktiviert. Wenn diese Option aktiviert ist, erstellt wg-quick einen WireGuard-Tunnel zum Endpunkt im eigenen .conf des Benutzers – ohne Bezug zu lafine. Auflösung des Endpunkt-Hostnamens über getent ahosts (glibc NSS), nicht über eine Rust-Socket-API |
| Lizenzaktivierung | Offline-Ed25519-Signaturüberprüfung. Keine Kommunikation mit einem Aktivierungsserver |
RoamSwitch für Linux initiiert genau eine Art ausgehender Anfrage – einen täglichen, reinen Empfangs-Download signierter Erkennungsdaten, der keine Informationen über den Benutzer oder die Maschine enthält. Nichts anderes im Produkt kontaktiert jemals einen externen Server.
9.3 Vollständige Liste der nach außen gerichteten Operationen
Jeder Vorgang, der dazu führen könnte, dass ein Paket direkt oder indirekt den lokalen Computer verlässt:
| # | Betrieb | Ziel | Auslöser | Was wird gesendet? |
|---|---|---|---|---|
| 1 | Daily updater – GET /v1/manifest und die Feed-Datei, wenn sich ihre Version geändert hat | lafine.net/updates/v1 (CDN) | systemd Timer, einmal alle ~24 Stunden mit einer zufälligen Verzögerung. Aus, wenn updates.enabled = false oder roamswitch-update.timer deaktiviert ist | ein einfaches HTTPS-GET: keine Abfragezeichenfolge, keine Cookies, generisch User-Agent, nichts über den Benutzer oder die Maschine. Erhält ein signiertes Manifest + Feed |
| 1a | freshclam (ClamAVs eigener Updater), der vom täglichen Updater aufgerufen wird, wenn ClamAV installiert wird | Das CDN des ClamAV-Projekts | als Teil von #1 | Verkehr von ClamAV selbst (ein separates Projekt); RoamSwitch startet es nur |
| 2 | ping -c1 -W1 | das LAN-Standard-Gateway (link-local) | um den ARP-Cache während der ARP-Spoofing-Erkennung zu aktualisieren | Nur ICMP-Echo-Anfrage. Keine DNS-Auflösung, keine Nutzlast |
| 3 | Starten des Systembrowsers (xdg-open) | https://lafine.net/... (Produktseite) | nur wenn der Benutzer auf eine Schaltfläche wie „Versionshinweise öffnen“ klickt | der RoamSwitch-Prozess öffnet keinen Socket; Es übergibt die URL an den Betriebssystembrowser |
| 4 | lösenctl dns | — (es findet keine Kommunikation statt) | Bedrohungsschutz-DNS in einem nicht vertrauenswürdigen Netzwerk (Opt-in). <iface> ist jede physische Netzwerkkarte, die eine Standardroute trägt (kabelgebunden und drahtlos gleichzeitig; lo / tailscale* / wg* / docker* / veth* ausgeschlossen); wird auch auf ein vertrauenswürdiges Netzwerk angewendet, wenn dns_scope = always_on; jeden Sentinel-Zyklus in Einklang gebracht | es ändert nur die OS-Resolver-Einstellung; RoamSwitch selbst sendet keine DNS-Anfrage |
| 5 | Paketmanager-Updates | die apt/dnf/zypper-Repositorys der Distribution | wenn der Benutzer apt upgrade usw. ausführt oder auf die GUI-Schaltfläche „Jetzt aktualisieren“ klickt (wodurch apt-get / dnf / zypper über pkexec ausgeführt wird) | RoamSwitch liest die lokale apt-cache policy-Ausgabe und startet den Paketmanager; hat nichts mit lafine zu tun |
| 6 | VPN-Tunnel (§4) – WireGuard-Backend: Der Tunnel wg-quick baut / Tailscale-Backend: tailscale set --exit-node leitet den gesamten Datenverkehr über den Ausgangsknoten | der eigene VPN-Endpunkt/Tailnet des Benutzers (WireGuard: der Endpunkt im .conf; Tailscale: der ausgewählte Exit-Knoten und die DERP-Relays) | wenn vpn_on_untrusted_enabled und das Netzwerk nicht vertrauenswürdig ist. Standardmäßig deaktiviert | verschlüsselter WireGuard/Tailscale-Verkehr; Das Ziel ist der eigene VPN-Server/Tailnet des Benutzers, unabhängig von Lafine. WireGuard-Endpunktauflösung über getent ahosts (glibc NSS); Tailscale wird von tailscaled gesteuert (ein separater Prozess) |
Alle anderen RoamSwitch-Funktionen – nftables-Steuerung, ARP/NDP-Pinning der Nachbartabelle (ip neigh, kein Paketausgang), Link Guard (NFQUEUE, nur AF_NETLINK), Port-Scanning (Parsen der ss-Ausgabe), ARP-Überwachung, Zustandsbewertung, Entropieüberwachung, Kanarienvögel, Fanotify, USB-Überwachung (evdev grab), Quarantäne, Protokollprüfung, URL- und geheime Prüfung – werden nur mit lokaler Datei abgeschlossen Lesevorgänge und Analyse der Unterprozessausgabe. Der §4-VPN-Tunnel ist die einzige „ausgehende Kommunikation, die der Benutzer explizit konfiguriert hat“, und sein Ziel ist der eigene VPN-Server des Benutzers – es fließen keine Daten zur Lafine-Infrastruktur.
§10
- Kein Konto – keine Benutzerregistrierung, kein Login, keine E-Mail-Adresse jemals angefordert.
- Konfiguration ist nur lokal – wird im Klartext unter
~/.config/roamswitch/config.jsongespeichert und verlässt den Computer nie. Es gibt keine Cloud-Synchronisierung. - Bewertungsergebnisse sind nur lokal – Sicherheitsberichte und Protokollprüfungsergebnisse werden nur auf dem Bildschirm angezeigt und, wenn der Benutzer dies wünscht, in eine lokale Datei exportiert.
- Lizenzschlüssel werden offline überprüft – Pro-/Business-Lizenztoken enthalten eine Ed25519-Signatur und werden mit einem öffentlichen Schlüssel überprüft. Es erfolgt keine Abfrage an einen Lafine-Server.
- Keine Absturzmeldung – im Panikfall wird nirgendwo ein Stack-Trace gesendet.
- Der tägliche Updater sendet nichts über Sie – keine Abfragezeichenfolge, keine Cookies, keine Geräte- oder Installationskennung, ein generisches
User-Agent. Es handelt sich um einen Download, nicht um einen Bericht. Link-Guard-Urteile, blockierte Hosts und Scan-Ergebnisse werden nur in die lokale Aktivitätsansicht/das Journal geschrieben und niemals übertragen.
§11
| Auflage | Für | Preis | Lizenz |
|---|---|---|---|
| Community Edition | Privater Linux-Gebrauch | Kostenlos | Proprietäre Freeware (gebündelte EULA) |
| Business (geplant) | Flottenmanagement, Richtlinienverteilung, unterzeichnete interne Vereinbarung, SLA für Organisationen | Bezahlt | Kommerzielle Lizenz. Gleiches binäres + Tier-Gate |
Käufer von macOS RoamSwitch Pro Lifetime erhalten Business-Funktionen kostenlos auf ihren eigenen Linux-Rechnern.
Vertrieb und Lieferkette
| Kanal | Detailliert |
|---|---|
| APT | https://lafine.net/apt (stable main). Release signiert mit einem RSA-4096-Schlüssel |
| U/min | https://lafine.net/rpm (getrenntes Fedora / openSUSE). repomd.xml GPG-signiert |
| AUR | roamswitch-bin (ruft den GitHub Releases-Tarball ab und überprüft sha256) |
| Tarball | amd64 / aarch64 .tar.gz + .sha256 auf GitHub-Releases |
- Pinned glibc floor – Release-Binärdateien werden in einem Debian 12-Container (Bookworm, Glibc 2.36) erstellt. Dies verhindert Nichtübereinstimmungen der Symbolversionen unter Debian 12 / Ubuntu 22.04 und höher. Ein CI-Schritt „Verify glibc floor“ schlägt beim Build fehl, wenn eine Abhängigkeit eingeführt wird, die mehr als 2.36 erfordert.
- Signierungsschlüsselverwaltung – der private Schlüssel für die Signierung des apt/rpm-Repositorys ist nur in einem verschlüsselten GitHub Actions-Geheimnis vorhanden; nur der öffentliche Schlüssel wird an das Repository übergeben.
11.3 Der tägliche Updater
roamswitch-updater ist eine eigenständige Binärdatei, die von einem systemd-Timer ausgeführt wird (roamswitch-update.timer, OnCalendar=daily mit einer zufälligen Verzögerung von 3 Stunden und Persistent=true). Es ist die einzige Komponente, die das Netzwerk erreicht. Jeder Lauf:
GET https://lafine.net/updates/v1/manifestund seine abgetrennte Signatur.- Überprüfen Sie die Ed25519-Signatur des Manifests mit einem dedizierten Bedrohungs-Feed-Signaturschlüssel – getrennt vom Sparkle-App-Update-Schlüssel. Der Feed wird täglich vom serverseitigen CI neu signiert, sodass der private Schlüssel in einem CI-Geheimnis gespeichert ist. Wenn man es auf den Feed beschränkt, bedeutet ein Leck, dass ein Angreifer nur eine fehlerhafte Blocklist bereitstellen kann (Sinkhole/Warnung – kein Codepfad, kein App-Update-Pfad). Der App-Update-Signaturschlüssel verlässt niemals den macOS-Schlüsselbund. Ein Manifest, das nicht überprüft wird, wird verworfen – der Updater greift niemals auf nicht signierte Daten zurück.
- Wenn sich die Bedrohungs-Feed-Version geändert hat, laden Sie den Feed herunter, überprüfen Sie seine SHA-256- und Ed25519-Signatur und installieren Sie ihn atomar für den Link Guard (§4).
- Wenn ClamAV installiert ist, rufen Sie
freshclamauf. - Notieren Sie die neueste App-Version für eine Benachrichtigung (der Updater never installiert die App; unter Linux führt der Benutzer
apt upgradeaus).
Das Scheitern eines Schritts – offline, eine fehlerhafte Signatur, freshclam fehlt – wird als updates.lastError aufgezeichnet und der Prozess endet immer noch mit 0, sodass ein Timer-Lauf nie eine systemd-Fehlerbenachrichtigung generiert. Der gesamte Mechanismus wird durch updates.enabled = false in updates.json oder durch systemctl disable --now roamswitch-update.timer deaktiviert; Das Produkt läuft dann mit den im Paket gebündelten Daten. Der Bedrohungs-Feed wird auch im Paket ausgeliefert, sodass eine Neuinstallation über einen funktionierenden Feed verfügt, bevor der Updater überhaupt ausgeführt wurde, und apt upgrade ihn auch dann aktualisiert, wenn der Updater deaktiviert ist.
§12
- OS: Ubuntu 22.04 / 24.04 und höher, Debian 12 und höher, Linux Mint / Pop!_OS / elementary / Zorin, Raspberry Pi OS 64-bit (Bookworm), Ubuntu für Raspberry Pi
- Architecture: x86_64 / aarch64
- Erforderlich:
systemd,nftables,iproute2(ip neigh– die ARP/NDP-Sperre) (wird automatisch von den.deb/.rpm-Abhängigkeiten eingezogen) - Optional:
clamav(Malware-Scan),nmcli(Wi-Fi-Verschlüsselungserkennung),libnotify(Desktop-Benachrichtigungen),wireguard-tools(das WireGuard-Backend des VPN-Tunnels + Kill-Switch, §4),tailscale(sein Tailscale-Backend, §4),polkit/pkexec(Ausführen eines Upgrades über die GUI) - Nicht unterstützt: Nicht-Systemd-Distributionen (Alpine / Void / Devuan)
- Display: 1280×720 oder größer (Fenster und Schriftart passen sich automatisch der Bildschirmgröße an und unterstützen kleine Raspberry Pi-Displays)
Anhang A
| Kiste | Zweck | Netzwerk |
|---|---|---|
| serde / serde_json | Serialisierung von Konfiguration und IPC | keine |
| Tokio | asynchrone Laufzeit (features = ["full"], es werden jedoch nur Unix-Sockets verwendet) | keine (kein TCP) |
| Tracing / Tracing-Abonnent | Protokollierung (lokal / journalistisch) | keine |
| dieser Fehler / jedenfalls | Fehlerbehandlung | keine |
| Regex | String-Parsing (Diagnose, CSS-Skalierung) | keine |
| URL | URL-Analyse (audit_url_safety-Heuristik) | none (wird nicht abgerufen) |
| Chrono | Datums-/Uhrzeitverarbeitung | keine |
| ed25519-dalek | Offline-Überprüfung von Lizenzsignaturen | keine |
| base64 / sha2 | Lizenz-Tokens, Canary-Hashes | keine |
| libc | chown / kill / Systemaufrufe | keine |
| idna | Dekodierung von IDN/Punycode-Hosts zur Homographenerkennung | keine |
| nfq (nur Daemon) | NFQUEUE-Bindungen für den Link Guard – reines Rust, AF_NETLINK | keine (Urteilskanal, kein Ausgang) |
| offen | ruft xdg-open für „Versionshinweise öffnen“ auf | Der Prozess selbst kommuniziert nicht |
| GTK3 / ksni (nur App) | GUI und Fach | keine |
| ureq + rustls (roamswitch-updater only) | der tägliche Updater ist ein HTTPS-GET | der einzige HTTP/TLS-Stack im Baum; auf die Updater-Binärdatei beschränkt |
In roamswitch-core, roamswitch-daemon, roamswitch-app, roamswitch-mcp oder roamswitchkit wird kein HTTP-Client, TLS-Stack oder Telemetrie-SDK angezeigt. ureq + rustls sind nur in roamswitch-updater vorhanden (scripts/audit_no_network.sh erzwingt dies in CI). Es gibt nirgendwo ein Telemetrie-SDK.
Anhang B
table inet roamswitch { # Profil-Firewall (Air-Gap / balanced / lockdown)
chain input {
type filter hook input priority -100; policy <accept|drop>;
iif "lo" accept
ct state established,related accept
# balanced/lockdown: alles andere droppen
}
chain output {
type filter hook output priority -100; policy <accept|drop>;
# policy drop nur während Air-Gap; nur lo und ct established sind erlaubt
}
}
table inet roamswitch_linkguard { # §4.5 — unabhängig von der Profiltabelle
chain output {
type filter hook output priority 0; policy accept;
udp dport 53 queue num 92 bypass
tcp dport 53 queue num 92 bypass
tcp dport { 80, 443 } ct state new,established queue num 92 bypass
}
}
table inet roamswitch_dev_guard { # §4 Port-Anomalie-Wächter / manuelle Port-Isolierung, separate Tabelle
chain input {
type filter hook input priority -10; policy accept;
iif != "lo" tcp dport { … } drop
}
}
table inet roamswitch_vpn { # §4 Kill-Switch für das WireGuard-Backend
chain output {
type filter hook output priority -150; policy drop;
oifname "lo" accept
oifname "roamswitch" accept
meta l4proto { icmp, ipv6-icmp } accept
udp sport 68 udp dport 67 accept # DHCP
ip daddr { <endpoint v4> } udp dport <port> accept
ip6 daddr { <endpoint v6> } udp dport <port> accept
ct state established,related accept
}
chain input { type filter hook input priority -150; policy drop; … } # symmetrisch
}
table inet roamswitch_ts { # §4 Kill-Switch für das Tailscale-Backend (weniger streng)
chain output {
type filter hook output priority -150; policy drop;
oifname "lo" accept
oifname "tailscale0" accept
meta l4proto { icmp, ipv6-icmp } accept
udp sport 68 udp dport 67 accept # DHCP (v6-Seite ist ebenfalls symmetrisch)
ip daddr 100.64.0.0/10 accept # tailnet CGNAT
ip6 daddr fd7a:115c:a1e0::/48 accept
ip daddr 100.100.100.100 udp dport 53 accept # MagicDNS
ip daddr 100.100.100.100 tcp dport 53 accept
udp dport 3478 accept # STUN
udp dport 41641 accept # Direkte WireGuard-Verbindung
tcp dport 443 accept # DERP-Fallback
ct state established,related accept
}
chain input { type filter hook input priority -150; policy drop; … } # symmetrisch
}
Das ARP/NDP-Pinning des Gateways/IPv6-Routers/DNS-Resolvers (§4) erfolgt in der Kernel-Nachbartabelle (ip neigh replace … nud permanent), nicht in nftables. Angepinnte Einträge werden in /var/lib/roamswitch/arp_lock.json aufgezeichnet.
Anhang C
Jeder Anspruch in diesem Dokument kann auf Ihrem eigenen Computer überprüft werden. Die folgenden Befehle werden auf einem Host ausgeführt, auf dem das Paket roamswitch installiert ist.
C.1 Überprüfung des ausgehenden Datenverkehrs
Die Daemon-/App-/MCP-Binärdateien verknüpfen keine HTTP-/TLS-Bibliothek:
for b in roamswitch-daemon roamswitch-app roamswitch-mcp; do
ldd "$(command -v $b)" | grep -iE 'ssl|crypto|nghttp|curl' && echo " ^ in $b"
done
# → Keine Ausgabe. Der HTTP/TLS-Stack ist nur statisch in roamswitch-updater eingebunden.
Der laufende Daemon enthält keinen Internet-Socket:
sudo lsof -p "$(pgrep -x roamswitch-daemon)" -a -i
# → Keine Ausgabe = null TCP/UDP-Internetverbindungen
sudo lsof -p "$(pgrep -x roamswitch-daemon)" -a -U | grep roamswitch
# → Nur /run/roamswitch/roamswitch.sock (der Link-Guard fügt einen AF_NETLINK-Socket hinzu,
# aber das ist ein Kernel-Kanal, kein Internet-Socket)
Der einzige RoamSwitch-zuordenbare ausgehende Datenverkehr ist der tägliche Updater:
watch -n 5 'sudo ss -tupn | grep -E "roamswitch-(daemon|app|mcp)" || echo "(none)"'
# → Immer "(none)". Keiner dieser drei öffnet jemals einen Internet-Socket.
systemctl list-timers roamswitch-update.timer
sudo systemctl start roamswitch-update.service
journalctl -u roamswitch-update.service -n 20 --no-pager
# → Ein einziger HTTPS-GET an lafine.net/updates/v1, danach wird beendet.
Deaktivieren Sie es und bestätigen Sie die völlige Stille:
sudo systemctl disable --now roamswitch-update.timer
# oder /var/lib/roamswitch/updates.json auf "enabled": false setzen
sudo strace -f -e trace=network -p "$(pgrep -x roamswitch-daemon)" 2>&1 | grep -i 'connect('
# → Verbindet sich nur mit AF_UNIX / AF_NETLINK. AF_INET / AF_INET6 tauchen nie auf.
C.2 Reproduzierbare Verteidigungsüberprüfung (Docker Test Suite)
Alle Erkennungs-, Kontroll- und Abwehrmechanismen von RoamSwitch (Air-Gap-Durchsetzung, Selbstheilung nach Firewall-Übergriffen, Ransomware-Canary-Manipulation, /tmp Noexec, Yama LSM, Homograph Phishing Interception und Credential Leak Detection – insgesamt 17 Elemente) können sicher reproduziert und zu 100 % in einem isolierten Container verifiziert werden, ohne Host-Netzwerke oder Dateien zu beeinträchtigen, mithilfe der offiziellen Docker-Testsuite, die in bereitgestellt wird das öffentliche Support-Repository (roamswitch-support
# Testsuite abrufen und reproduzieren (automatisierte Verifikation in einem isolierten Container mit dem offiziellen Distributionspaket)
git clone https://github.com/lafine1211/roamswitch-support.git
cd roamswitch-support/test/docker
docker build -t roamswitch-test .
docker run --rm --privileged roamswitch-test
Der Testcontainer ruft automatisch das offizielle Distributionspaket aus dem APT-Repository (lafine.net/apt) ab und wertet jedes der folgenden systematischen Testelemente (SP-1–11, PENT-1–7) innerhalb eines isolierten Netzwerks und Mount-Namespace aus.
(1) Autonome Netzwerkverteidigung und Luftspalt-Selbstheilung
| Ausweis | Szenario | Verifizierungsmethode | Bestehenskriterium |
|---|---|---|---|
| SP-3 | Air-Gap-Aktivierung → Austrittsabfall | Senden Sie enable_air_gap IPC | policy drop wird auf den Ausgabe-Hook angewendet; Der gesamte ausgehende Datenverkehr wurde blockiert |
| SP-3b | Erzwungene Bereinigung und Selbstheilung der Firewall | Löschregeln über nft delete table inet roamswitch | Die Anti-Clobber-Selbstheilung stellt die Drop-Regeln innerhalb von 5 Sekunden wieder her |
| SP-3c | Beim Daemon-Neustart fehlgeschlagen | Daemon (SIGKILL) mitten in der Luftlücke hart töten und neu starten | Die Egress-Drop-Richtlinie bleibt auch nach dem Neustart nahtlos bestehen |
| SP-3d | Autorisierte Air-Gap-Wiederherstellung | Autorisierten disable_air_gap IPC senden | Drop-Richtlinie aufgehoben, alle Markierungsdateien entfernt, Austritt wiederhergestellt |
| SP-8 | Präventives ARP/NDP-Pinning | In isolierter NetNS-Gateway-Umgebung aktivieren → gefälschtes Gratis-ARP senden | Gateway-Nachbareintrag bleibt PERMANENT; gefälschtes ARP ignoriert |
| SP-9 | VPN-Kill-Switch (WireGuard) | Live WireGuard-Server in separaten Netzen, Import .conf → vpn_up | Handshake wird bis inet roamswitch_vpn abgeschlossen; Null Lecks beim Tunneltod |
| SP-10 | VPN-Kill-Switch (Tailscale) | Stub tailscale CLI + separate Netze, tailscale0 IF | Off-Tunnel-Klartext-TCP/80 und lokales DNS blockiert; DERP und MagicDNS erlaubt |
(2) Kernel- und Mount-Hardening
| Ausweis | Szenario | Verifizierungsmethode | Bestehenskriterium |
|---|---|---|---|
| SP-11a | Härtung des Netzwerksystems | Führen Sie apply_kernel_sysctl_hardening IPC aus | rp_filter=1, tcp_syncookies=1, accept_redirects=0 erreichen Zielwerte |
| SP-11b | Speicherschutz und Yama LSM | Überprüfen Sie ptrace_scope und suid_dumpable | kernel.yama.ptrace_scope=1 (blockiert Snooping), fs.suid_dumpable=0 (kein Core-Dump) |
| SP-11c | /tmp & /dev/shm noexec-Verteidigung | Führen Sie apply_mount_hardening IPC aus | /tmp und /dev/shm erneut gemountet noexec,nosuid,nodev; Hinrichtung verweigert |
| SP-11d | Legitime Benutzerausführung bleibt erhalten | Skripte im Standard-Home-Verzeichnis (~/) ausführen | Läuft ungehindert, ohne legitime Entwickler-/Administrator-Workflows zu unterbrechen |
(3) Mehrschichtige Malware- und Ransomware-Abwehr und Canaries
| Ausweis | Szenario | Verifizierungsmethode | Bestehenskriterium |
|---|---|---|---|
| SP-1 | Canary-Manipulationserkennung | Decoy-Canary-Datei (.xlsx) in ~/Documents/ abschneiden oder umbenennen | Manipulationen werden innerhalb von Sekunden erkannt und lösen einen sofortigen Air-Gap aus |
| SP-2 | Ransomware-Massenverschlüsselungs-Burst-Erkennung | Ein einzelner Prozess generiert schnell mehrere Dateien mit hoher Entropie | Beleidigender Arbeitsprozess mit SIGSTOP eingefroren; Luftspalt ausgelöst |
| SP-2b | Kein falsch positives Ergebnis am shred | Führen Sie shred -n 3 -u über Testdateien hinweg aus | Die Übereinstimmung mit der Zulassungsliste verhindert die Erkennung falsch positiver Ergebnisse oder das Einfrieren |
| SP-2c | Kritische Prozesse sind nie eingefroren | Validieren Sie die Logik des Einfrierens des Ziels während der Burst-Erkennung | Kritische Daemons (dockerd, systemd, containerd) werden nie eingefroren |
| SP-4 | Die EICAR-Testzeichenfolge dient nur der Benachrichtigung | Schreiben Sie die EICAR-Testzeichenfolge in ~/Downloads/ | Keine Benachrichtigung, nur ein Eintrag im Benachrichtigungsverlauf; die Datei wird niemals automatisch unter Quarantäne gestellt |
| SP-4b | Echte Malware-Signatur zuerst bestätigen | Schreiben Sie eine echte Signatur außerhalb überwachter Ordner | Ruft den modalen Genehmigungsdialog auf; Quarantäne erfolgt nur nach Bestätigung durch den Benutzer |
| SP-4c | Härtung der Quarantäne-Vault-Berechtigungen | Überprüfen Sie die Berechtigungen des Tresorverzeichnisses und der Beispieldateien | Vault-Verzeichnis auf 0700 festgelegt, unter Quarantäne gestellte Proben auf 0400 festgelegt |
| SP-4d | Privilegierte IPC-sichere Wiederherstellung der Originaldatei | Senden Sie restore_quarantine_file IPC | Datei mit Benutzerberechtigungen (0644) im ursprünglichen Pfad wiederhergestellt und zu Ausschlüssen hinzugefügt |
(4) Passiver Link Guard und Phishing-Abwehr
| Ausweis | Szenario | Verifizierungsmethode | Bestehenskriterium |
|---|---|---|---|
| SP-7 | mode = block harte Durchsetzung | Stellen Sie eine Verbindung zu in der Feedliste aufgeführten oder blocklistExtra-Hosts her | Auf der TLS-Ebene abgelegt (SNI-Analyse); Nicht gelistete sichere Hosts erreichen HTTP 200 |
| SP-7b | mode = warn Fail-Closed Hold | Ohne Benutzerreaktion eine Verbindung zum Warnhost herstellen (Zeitüberschreitung 8 Sekunden) | Verwirft Pakete bei Zeitüberschreitung (fail-closed); nur mit ausdrücklicher Genehmigung gestattet |
| SP-7c | mode = off Kompletter Abriss | Linkschutz deaktivieren | Die Tabelle inet roamswitch_linkguard ist vollständig deinstalliert |
(5) BadUSB-Mitigation und Gerätekontrolle
| Ausweis | Szenario | Verifizierungsmethode | Bestehenskriterium |
|---|---|---|---|
| SP-6 | Bestandsschutz für verbundene Tastaturen | Überprüfen Sie die angeschlossenen Tastaturen beim Start des Daemons | Bestandsschutz für bestehende Geräte; nur nachfolgende Hot-Plugs griffen |
(6) Penetration Testing Suite in der Docker-Umgebung (17 Prüfungen)
| Ausweis | Angriffsvektor | Simulationsdetails | Verteidigungs-/Erkennungskriterien |
|---|---|---|---|
| PENT-1 | C2-Exfiltration | Ausgehender HTTP/TCP-Traffic zu C2 unter Air-Gap versucht | Alle Pakete wurden bei Netfilter verworfen; Null Leckage |
| PENT-1b | FW-Löschung erzwingen | Löschregeln mit nft delete table inet roamswitch | Die Anti-Clobber-Selbstheilung stellt die Regeln innerhalb von Sekunden wieder her |
| PENT-1c | Luftspaltsichere Wiederherstellung | Problem mit authentifiziertem disable_air_gap IPC | Drop-Regeln entfernt; Markierungen gelöscht; Konnektivität wiederhergestellt |
| PENT-2 | /tmp Hintertür | Abgelegtes Backdoor-Skript in /tmp ausführen | Verweigert durch noexec Mount-Schutz (Permission denied) |
| PENT-2b | /dev/shm Gemeinsamer Speicher | Binäre Nutzlast ausführen, die in /dev/shm platziert ist | Blockiert durch noexec Reittierverteidigung |
| PENT-2c | Erhaltung des Benutzerbereichs | Skript im legitimen Benutzerverzeichnis (/home/tester/) ausführen | Ungehinderte Ausführung; Keine Unterbrechung des Arbeitsablaufs |
| PENT-3 | ptrace Memory Snooping | PTRACE_ATTACH als Ziel zum Extrahieren von Geheimnissen/Tokens | Abgelehnt von Yama LSM kernel.yama.ptrace_scope=1 |
| PENT-3b | Core Dump Secret Scraping | Lösen Sie einen Prozessabsturz aus, um einen Speicherauszug zu erhalten | Verhindert durch fs.suid_dumpable=0 |
| PENT-4 | Kanarische Manipulation | Zero-out-Kanarienvogel-Köderdatei in ~/Documents/ | Echtzeiterkennung von Größenanomalien und Hash-Änderungen |
| PENT-4b | Kanarisches Massenwischen | Massenlöschung von Canary-Decoy-Dateien | Das Verschwinden der Datei wurde sofort erkannt, was zu einem Vorfall führte |
| PENT-5 | Spoofing von IP-Adressen | Übertragen Sie Pakete mit gefälschter Quell-IP | Von rp_filter=1 gelöscht (Reverse-Path-Filter) |
| PENT-5b | SYN Flood DoS | Überfluten Sie halboffene TCP-Verbindungen | Statustabelle geschützt durch tcp_syncookies=1 |
| PENT-5c | ICMP-Route-Hijack | Fügen Sie gefälschte ICMP-Redirect-Pakete ein | Ignoriert wegen accept_redirects=0 |
| PENT-6 | Kyrillisches Homograph-Phishing | Navigieren Sie zu gооgle.com (kyrillischer Homograph) | Identifiziert durch LinkGuard, bewertet mit 40 (GEFÄHRLICH/Block) |
| PENT-6b | Roher IP- und Klartextverkehr | Direkte ausgehende Verbindung zur Raw-IP | Präzise als Sicherheitsrisikofaktor gekennzeichnet |
| PENT-7 | OpenAI-API-Schlüsselleck | Machen Sie das sk-proj-...-Token im Code oder in Protokollen verfügbar | Durch Shannon-Entropieanalyse erkannt und maskiert |
| PENT-7b | GitHub-Token-Leak | Offenlegen des persönlichen Tokens ghp_... im Code | Übereinstimmung durch Tokenmuster und Entropieüberprüfung |
| PENT-8 | Kernel-LPE (Frag Gap)-Preemption | Unprivilegierter unshare -U -r (CVE-2026-53362-Versuch) | Sofort abgelehnt von user.max_user_namespaces = 0 (Operation not permitted) |
| PENT-9 | eBPF-Bedrohungssensor und Prozess-Freeze | Kritischer/Notfallalarm, der über den Falco-eBPF-Socket eingespeist wird | Prozess über SIGSTOP innerhalb von Millisekunden eingefroren (Status: Ts); Air-Gap eingesetzt |
(7) Zusammenfassung der Penetrationstests (Standalone Hardened vs. eBPF Enhanced)
Zusammenfassung der Ergebnisse des vollständigen Penetrationstests, der in einer isolierten Docker-Umgebung durchgeführt wurde (Ziel: Ubuntu 24.04 mit RoamSwitch Client Edition; Angreifer: Nmap/curl/hping3; siehe offizieller Bericht docs/CLIENT_PENTEST_REPORT.ja.md):
| Verifizierungskategorie | Ohne Falco (Standalone Hardened) | Mit Falco (eBPF Enhanced) | Urteil der Verteidigung |
|---|---|---|---|
| Externer Port-Scan-Widerstand (Nmap SYN) | PASS (100 % gefiltert / DROP in Lockdown) | PASS (100 % gefiltert / DROP in Lockdown) | Total External Stealth |
| External Direct Access Cutoff (TCP/80, 3306) | PASS (Timeout-Abbruch / keine Antwort) | PASS (Timeout-Abbruch / keine Antwort) | Null eingehende Exposition |
| Kernel-LPE (Frag Gap)-Abschwächung | PASS (unshare über sysctl blockiert) | PASS (eBPF-Alarm + SIGSTOP Einfrieren + Luftspalt) | Defense-in-Depth bestätigt |
| Unautorisierte Porterkennung (Anomalie) | PASS (0.0.0.0 Bindung mit HOHEM Risiko gekennzeichnet) | PASS (0.0.0.0 Bindung mit HOHEM Risiko gekennzeichnet) | 100 % erkannt und geführt |
| Protokollaufblähung und CPU-Overhead-Verhinderung | Kein Protokoll-Footprint (deinstalliert) | PASS (95 % Rauschunterdrückung / 2 MB Puffer / 50 MB Obergrenze) | Desktop-optimiert |
C.3 Bekannte Einschränkungen
| Einschränkung | Auswirkungen | Schadensbegrenzung |
|---|---|---|
Auf einigen Kerneln liefert FAN_MARK_MOUNT auf tmpfs (/tmp) keine Ereignisse | Dateischreibvorgänge unter /tmp werden von fanotify nicht überwacht | /tmp ist kurzlebig und kein überwachter Benutzerordner; Ransomware zielt auf ~/. Markierungsfehler werden explizit protokolliert |
| Keine Fanotify-Zustellung für Container-Overlays/TMPFs | Die Erkennung von Entropieausbrüchen im Container kann nicht validiert werden | validiert auf echter Hardware (ext4); Der Kabelbaum überspringt automatisch über eine Sonde |
Die nftables-Operationen von RoamSwitch teilen sich den Netfilter-Speicherplatz mit Dockers iptables-nft | RoamSwitch-Regeloperationen können die NAT-Regeln von Docker beeinträchtigen | als betrieblicher Vorbehalt dokumentiert; isoliert in der dedizierten inet roamswitch-Tabelle, aber Operationen für den gesamten Regelsatz wie nft flush ruleset sollten vermieden werden |
| Der Link Guard sieht den DoH eines Browsers nur über TLS SNI; Auch das verbirgt Encrypted Client Hello (ECH). | Sobald ECH weit verbreitet ist, ist eine ECH-verwendende Verbindung zu einer ECH-unterstützenden Site nicht anhand des Hostnamens identifizierbar | Die lokale Blockliste und die Heuristik wirken weiterhin auf DNS/HTTP und Nicht-ECH-TLS. Der DNS-Bedrohungsschutz (§4.5, Opt-in) deckt den Resolver-Pfad ab |
Die Aktualität des täglichen Updates hängt vom Veröffentlichungsrhythmus ab, wenn updates.enabled = false | Bei deaktivierten Aktualisierungen ist der Feed nur so aktuell wie der letzte apt upgrade | die Entdeckungen mit dem höchsten Schweregrad (Markenhomograph) benötigen keine Zuführung; Melden Sie sich erneut an oder aktivieren Sie das DNS zum Schutz vor Bedrohungen, um eine stets aktuelle Abdeckung zu gewährleisten |