Bringen Sie RoamSwitchs Diagnosen direkt in Ihre eigene Mac- oder Linux-App
RoamSwitchKit (macOS) und roamswitch-linux-kit (Linux) sind kostenlose Open-Source-Clients, mit denen Ihr Swift- oder Rust-Code direkt dieselben Sicherheitsdiagnosen abfragen kann, die RoamSwitch selbst berechnet. Bauen Sie „Ist dieses Netzwerk gerade sicher?“ in Ihre eigene App ein, ohne ARP-Überwachung oder Portscans selbst zu implementieren.
🔒 Warum es sicher ist
- Nur lesend: Es gibt keine API zum Umschalten der Sperre, zum Isolieren eines Ports oder zum Auswerfen eines Geräts. Eine App, die dieses Paket einbindet, kann RoamSwitchs Einstellungen nicht ohne Zustimmung des Nutzers ändern.
- Vollständig lokal: Die mit RoamSwitch gelieferte Binärdatei (macOS: RoamSwitchMCPServer / Linux: roamswitch-mcp) wird als Unterprozess gestartet und kommuniziert ausschließlich über Standard-E/A. Es wird keinerlei Telemetrie gesendet. Mit einem externen Host kommuniziert nur run_npm_audit_signatures (npm-Registry), das Opt-in ist und auf dem Mac Pro-exklusiv. run_active_vuln_scan (standardmäßig deaktiviert) prüft nur 127.0.0.1, und get_exposed_ports sendet auf dem Mac nur einen HTTP-GET pro erreichbarem Port an 127.0.0.1, um die Header zu prüfen. Zur Ermittlung der MAC-Adresse des Gateways können die Diagnose-Tools auf dem Mac einen ICMP-Ping, normalerweise einen (bei nicht auflösbarer MAC einige), an das Gateway im LAN senden. Unter Linux senden get_security_report und verify_security_findings nichts ins LAN und lesen das Gateway nur aus lokalen Caches (andere Tools, die die Gateway-MAC neu auflösen, etwa get_guard_status, können einen Ping senden).
- Kostenlos und Open Source: veröffentlicht unter der MIT-Lizenz — jeder kann den Quellcode einsehen und frei einbinden.
Eine Zeile in Ihrem Paketmanager
Fügen Sie es einfach zu den Dependencies Ihrer Package.swift hinzu. Voraussetzung sind macOS 12+, Swift 5.9+ sowie eine installierte RoamSwitch-Version 1.3.0 oder neuer.
dependencies: [
.package(url: "https://github.com/lafine1211/RoamSwitchKit.git", from: "1.0.0")
]
Fügen Sie es einfach zu den Dependencies Ihrer Cargo.toml hinzu. Voraussetzung ist ein stabiler Rust-Toolchain (2021 Edition, tokio-Async-Runtime) sowie eine installierte RoamSwitch-for-Linux-Version (die die Binärdatei roamswitch-mcp mitbringt).
[dependencies]
roamswitch-linux-kit = { git = "https://github.com/lafine1211/roamswitch-linux-kit", tag = "v0.1.0" }
Diagnosen mit wenigen Methoden abrufen
import RoamSwitchKit
let client = try RoamSwitchClient()
let report = try await client.securityReport()
print(report.score, report.grade)
let ports = try await client.exposedPorts()
for port in ports.ports where port.overallRisk == "high" {
print(port.processName, port.port)
}
let status = try await client.guardStatus()
print(status.activeSecurityLevelLabel, status.isCurrentNetworkTrusted)
let urlReport = try await client.auditURLSafety(url: "https://apple.com.login-verify.xyz")
print(urlReport.score, urlReport.riskLevel) // e.g. 20, "dangerous"
use roamswitch_linux_kit::RoamSwitchClient;
let client = RoamSwitchClient::new(None, None)?;
let report = client.security_report().await?;
println!("{} ({})", report.score, report.grade);
let ports = client.exposed_ports(false).await?;
for port in ports.ports.iter().filter(|p| p.overall_risk.as_deref() == Some("high")) {
println!("{} {}", port.process_name, port.port);
}
let status = client.guard_status().await?;
println!("{} {}", status.active_security_level_label, status.is_current_network_trusted);
let url_report = client.audit_url_safety("https://apple.com.login-verify.xyz").await?;
println!("{} {}", url_report.score, url_report.risk_level); // e.g. 20, "dangerous"
Schreibgeschützte Methoden
securityReport()
Liefert eine bewertete, umfassende Prüfung über 18 Kriterien — FileVault, SIP, Gatekeeper, Firewall, WLAN-Verschlüsselungsstärke, ARP-Spoofing, offene Ports und mehr — mit Empfehlungen für alles, was fehlschlägt.
exposedPorts(includeLocalOnly:)
Listet jeden aktuell lauschenden Port auf und liefert für alles, was über localhost hinaus offen ist, eine detaillierte Prüfung einschließlich bekannter gefährlicher Dienste (Redis, MongoDB usw.). Auf dem Mac sendet es pro erreichbarem Port einen HTTP-GET an 127.0.0.1, um die Header zu prüfen.
guardStatus()
Ruft den Status von Port-Guard, ARP-Schutz, USB-Guard, Bluetooth-Guard, Web/Mail-Download-Schutz, DNS-Bedrohungsschutz und die Sicherheitsstufe ab.
auditURLSafety(url:)
Analysiert verdächtige Links oder Kurz-URLs lokal auf Phishing, Unicode-Homographen und riskante TLDs (Zero Telemetry).
Weitere schreibgeschützte Methoden
| Methode | Kurzbeschreibung |
|---|---|
auditSecurityLogs(hours:) | Wertet aktuelle Sicherheitslogs aus (Mac: fehlgeschlagene Sudo-Authentifizierungen, SSH-Brute-Force-Versuche, Gatekeeper-Blockaden, XProtect-Erkennungen usw. / Linux: fehlgeschlagene Sudo-Authentifizierungen, SSH-Brute-Force, Firewall-Blockaden, AppArmor-Ablehnungen, ClamAV-Erkennungen usw.), maskiert automatisch sensible Daten wie API-Schlüssel und Tokens und liefert zusätzlich Ergebnisse der Log-Template-basierten Erkennung neuer Muster sowie der Häufigkeitsanomalie-Erkennung (statistische Spitzen). Unter Linux bedeutet eine Zählung von 0 nicht, dass nichts passiert ist, wenn das Journal nicht gelesen werden konnte (zum Beispiel wegen eines Timeouts); journalReadComplete ist dann false und journalError nennt den Grund. |
activeVulnScan() | Zerstörungsfreie aktive Schwachstellenprüfung, ausschließlich auf 127.0.0.1. Es wird kein anderer Host kontaktiert, aber das Tool sendet Netzwerkanfragen; es ist daher standardmäßig deaktiviert und muss in den Einstellungen per Opt-in aktiviert werden. |
packageCveScan() | Gleicht installierte Pakete (Mac: Homebrew / Linux: dpkg, dnf, zypper, pacman) mit einer lokalen CVE-Zuordnung ab. Es findet überhaupt keine Netzwerkkommunikation statt. Unter Linux wird bei nicht lesbarer oder zeitüberschrittener Paketliste nicht „kein Treffer“ gemeldet, sondern complete ist false und incompleteReason nennt den Grund (ein unvollständiges Ergebnis ist kein sauberes Ergebnis). Unter Ubuntu (20.04, 22.04, 24.04, 26.04) werden die Ubuntu-eigenen Daten verwendet und nach Quellpaketname und Quellversion abgeglichen; geprüft werden nur CVEs mit CVSS 7,0 oder höher, für die Ubuntu bereits eine Korrektur veröffentlicht hat, daher bedeutet „kein Treffer“ nicht, dass es keine bekannten CVEs gibt. Das Ergebnis enthält zusätzlich ecosystem und release, jeder Treffer trägt binary (den installierten Binärpaketnamen); Korrekturen, die nur über Ubuntu Pro verfügbar sind, sind mit proOnly markiert. Ubuntu-Derivate (Linux Mint, Pop!_OS und andere) und nicht unterstützte Versionen liefern complete = false mit dem Grund in incompleteReason und werden nicht auf die Debian-Daten umgestellt. |
packageCveScanLanguages(watchedFolders:) | 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. |
canaryStatus() | Liefert den Zustand der Ransomware-Köderdateien (Canary) sowie bis zu die 50 jüngsten erkannten Vorfälle. |
portAnomalyIncidents() | 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. |
runtimeThreatStatus() | Gibt an, ob dieser Mac wegen eines XProtect-Malwarefunds per Air-Gap isoliert wurde, und nennt den auslösenden Vorfall. Bei aktivem Air-Gap zuerst prüfen. |
notificationHistory() | Gibt den Verlauf der von RoamSwitch gesendeten Benachrichtigungen (Sicherheitslog-Auffälligkeiten, ClickFix-Erkennungen u. a.) der letzten 7 Tage zurück, neueste zuerst. |
Die Felder aller Rückgabetypen sind als reine Swift-Deklarationen in der README auf GitHub und in AGENTS.md dokumentiert.
security_report()
Liefert eine Bewertung und Empfehlungen aus einer 27-Punkte-Prüfung, die LUKS/dm-crypt-Festplattenverschlüsselung, UEFI Secure Boot, AppArmor/SELinux, sudo/SSH-Konfiguration, ARP-Spoofing und offene Ports abdeckt.
exposed_ports(include_local_only)
Listet jeden aktuell lauschenden Port auf und liefert für alles, was über localhost hinaus offen ist, eine detaillierte Prüfung einschließlich bekannter gefährlicher Dienste (Redis, MongoDB usw.). Auf dem Mac sendet es pro erreichbarem Port einen HTTP-GET an 127.0.0.1, um die Header zu prüfen.
guard_status()
Ruft den Status von Port-Guard, ARP-Schutz, USB-Guard, Bluetooth-Guard, Web/Mail-Download-Schutz, DNS-Bedrohungsschutz und die Sicherheitsstufe ab.
audit_url_safety(url)
Analysiert verdächtige Links oder Kurz-URLs lokal auf Phishing, Unicode-Homographen und riskante TLDs (Zero Telemetry).
Weitere schreibgeschützte Methoden
| Methode | Kurzbeschreibung |
|---|---|
server_security_report() | Führt statt der Desktop-Prüfung das 34-Punkte-Profil der Server Edition aus (Kernel-Härtung, Container-Isolation, Kernel-CVE-Exposition, eBPF LSM). |
run_active_vuln_scan() | Zerstörungsfreie aktive Schwachstellenprüfung, ausschließlich auf 127.0.0.1. Es wird kein anderer Host kontaktiert, aber das Tool sendet Netzwerkanfragen; es ist daher standardmäßig deaktiviert und muss in den Einstellungen per Opt-in aktiviert werden. |
audit_secrets(text) | Erkennt offengelegte API-Schlüssel und private Schlüssel in Text, Dateien oder Verzeichnisbäumen (Treffer werden in der Ausgabe maskiert). |
audit_security_logs(hours) | Wertet aktuelle Sicherheitslogs aus (Mac: fehlgeschlagene Sudo-Authentifizierungen, SSH-Brute-Force-Versuche, Gatekeeper-Blockaden, XProtect-Erkennungen usw. / Linux: fehlgeschlagene Sudo-Authentifizierungen, SSH-Brute-Force, Firewall-Blockaden, AppArmor-Ablehnungen, ClamAV-Erkennungen usw.), maskiert automatisch sensible Daten wie API-Schlüssel und Tokens und liefert zusätzlich Ergebnisse der Log-Template-basierten Erkennung neuer Muster sowie der Häufigkeitsanomalie-Erkennung (statistische Spitzen). Unter Linux bedeutet eine Zählung von 0 nicht, dass nichts passiert ist, wenn das Journal nicht gelesen werden konnte (zum Beispiel wegen eines Timeouts); journalReadComplete ist dann false und journalError nennt den Grund. |
get_app_help(query, topic) | Durchsucht die vollständige offizielle RoamSwitch-Wissensdatenbank zu allen Funktionen, Warnmeldungen, Einstellungen und Problembehebungen direkt auf dem Mac und liefert präzise Anweisungen. |
quarantine_status() | Liefert den Inhalt des Malware-Quarantäne-Tresors: ursprünglicher Pfad, erkannter Bedrohungsname, Zeitpunkt und Größe. |
canary_status() | Liefert den Zustand der Ransomware-Köderdateien (Canary) sowie bis zu die 50 jüngsten erkannten Vorfälle. |
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. Unter Linux wird bei nicht lesbarer oder zeitüberschrittener Paketliste nicht „kein Treffer“ gemeldet, sondern complete ist false und incompleteReason nennt den Grund (ein unvollständiges Ergebnis ist kein sauberes Ergebnis). Unter Ubuntu (20.04, 22.04, 24.04, 26.04) werden die Ubuntu-eigenen Daten verwendet und nach Quellpaketname und Quellversion abgeglichen; geprüft werden nur CVEs mit CVSS 7,0 oder höher, für die Ubuntu bereits eine Korrektur veröffentlicht hat, daher bedeutet „kein Treffer“ nicht, dass es keine bekannten CVEs gibt. Das Ergebnis enthält zusätzlich ecosystem und release, jeder Treffer trägt binary (den installierten Binärpaketnamen); Korrekturen, die nur über Ubuntu Pro verfügbar sind, sind mit proOnly markiert. Ubuntu-Derivate (Linux Mint, Pop!_OS und andere) und nicht unterstützte Versionen liefern complete = false mit dem Grund in incompleteReason und werden nicht auf die Debian-Daten umgestellt. |
package_cve_scan_languages(watched_folders) | 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. Bei Ausführung als root enthält das Ergebnis außerdem ein zusätzliches Feld, recentIntrusionContext: zu jeder jüngsten Änderung den Prozess, der sie vorgenommen hat (Konto, ausführbare Datei, Befehl), und die SSH-Anmeldung, zu der er gehört (Quelle, Anmeldezeit, Authentifizierungsmethode), oder den Grund, warum das nicht ermittelt werden konnte. |
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. In der Server Edition trägt jeder Eintrag außerdem die Zeit von der Erkennung bis zur Reaktion in Millisekunden (detect_to_receive_ms, receive_to_action_ms, detect_to_action_ms), und das Ergebnis enthält den Zustand des Falco-Heartbeats (heartbeat). |
get_ssh_guard_incidents(), das Zustand und Verlauf des SSH-Brute-Force-Schutzes (Server Edition sowie Client Edition, solange sshd läuft) zurückgibt, existiert im internen Crate von RoamSwitch (roamswitchkit), wurde aber noch nicht in das öffentliche roamswitch-linux-kit übernommen.
Die Felder aller Rückgabetypen sind als reine Rust-Deklarationen in der README auf GitHub dokumentiert.
So lässt es sich einbinden
Die folgenden Beispiele verwenden Swift (macOS). roamswitch-linux-kit (Linux) bietet dieselben Methoden (in snake_case) für das gleiche Ergebnis.
Sync- & Backup-Apps
Pausiert die Hintergrundsynchronisierung automatisch bei Verbindung mit einem nicht vertrauenswürdigen Netzwerk.
let status = try await client.guardStatus()
if !status.isCurrentNetworkTrusted {
syncEngine.pauseBackgroundSync()
}
Passwort-Manager
Verkürzt die automatische Sperrzeit in nicht vertrauenswürdigen Netzwerken und passt das Verhalten an die aktive Schutzstufe an.
let status = try await client.guardStatus() let lockTimeout: TimeInterval = status.isCurrentNetworkTrusted ? 300 : 30 vault.setAutoLockTimeout(lockTimeout)
Entwicklertools & Automatisierung
Warnt, wenn ein Entwicklungsserver beginnt, auf 0.0.0.0 zu lauschen, oder erstellt Shortcuts-artige Workflows, die auf das Netzwerkvertrauen reagieren.
let ports = try await client.exposedPorts(includeLocalOnly: false)
for port in ports.ports where [3000, 5173, 8000, 11434, 1234].contains(port.port) {
print("⚠️ Dev/AI server exposed on port \(port.port)")
}
Links in E-Mail- & Chat-Apps vorab prüfen
Scannt Links in eingehenden Nachrichten automatisch, bevor sie angezeigt werden, und warnt nur bei gefährlichen.
let result = try await client.auditURLSafety(url: link)
if result.riskLevel == "dangerous" || result.riskLevel == "suspicious" {
showWarningBanner(for: link, score: result.score)
}
Sicherheitsprüfung per Rechtsklick-Menü & Kurzbefehle
In das Dienste-Menü im Finder oder in macOS Kurzbefehle einbinden, um eine kopierte URL mit einer Aktion zu prüfen.
// Aufgerufen aus einem macOS Shortcuts (App Intent)- oder Dienste-Menü-Handler
let report = try await client.auditURLSafety(url: pasteboardURL)
return "\(report.riskLevel.uppercased()) (\(report.score)/100)"
IT-Asset-Management & MDM-Dashboards
Sammelt Scores von allen Macs im Unternehmen und zeigt sie als Liste mit Warnungen in einem Admin-Dashboard an.
let report = try await client.securityReport() try await mdmAPI.reportScore(deviceID: deviceID, score: report.score, grade: report.grade)
Über die SDKs
Q. Ist es kostenlos nutzbar?
A. Ja. Sowohl RoamSwitchKit (macOS) als auch roamswitch-linux-kit (Linux) werden kostenlos unter der MIT-Lizenz veröffentlicht. Beide setzen voraus, dass RoamSwitch selbst (die Diagnose-Engine) installiert ist, aber die SDKs selbst kosten nichts.
Q. Kann es die Einstellungen eines Nutzers ändern?
A. Nein. Es ist schreibgeschützt — es gibt keine implementierte API zum Umschalten der Sperre, Isolieren von Ports oder Ähnliches. Eine App, die dieses Paket einbindet, kann RoamSwitchs Schutzeinstellungen nicht ohne Zustimmung des Nutzers ändern.
Q. Was passiert, wenn RoamSwitch nicht installiert ist?
A. Der entsprechende Fehler wird zurückgegeben (macOS: RoamSwitchClientError.appNotInstalled / Linux: RoamSwitchClientError::AppNotInstalled). Wir empfehlen, dies elegant zu behandeln — z. B. die Funktion auszublenden — statt es als fatalen Fehler zu behandeln.
Q. Was, wenn ich RoamSwitch selbst mit meinem Produkt bündeln und weitervertreiben möchte?
A. Die SDK-Integration (Inhalt dieser Seite) bleibt frei nutzbar. Für das Bündeln und den Weitervertrieb von RoamSwitch selbst ist eine OEM-Lizenz erforderlich — hier zu OEM- & Partner-Bundling Kontakt aufnehmen.