Lafine Systems Design · Documento tecnico

RoamSwitch per Linux
Libro bianco su architettura e sicurezza

Un documento tecnico che spiega cosa fa RoamSwitch per Linux al limite dei privilegi. Evita il linguaggio del marketing; le affermazioni possono essere verificate rispetto al comportamento effettivo del pacchetto distribuito e all'autocontrollo nell'appendice.

Versione v1.6.0 Ambito RoamSwitch for Linux 1.1.0 (hardening del kernel contro gli LPE / protezione runtime eBPF / blocco SIGSTOP dei processi attaccanti / ottimizzazione a basso overhead di Falco) Requisiti systemd + nftables Pubblicato 2026-09-06

§1

RoamSwitch per Linux è un'applicazione residente di sicurezza di rete e diagnostica di sistema che porta il modello di difesa della rete zero-trust di macOS RoamSwitch su Linux (ambienti systemd + nftables).

Questa edizione è destinata alle macchine client (workstation, laptop, computer a scheda singola) e presuppone un comportamento autonomo che segue la macchina mentre si sposta tra le reti. Un'edizione con server rinforzato/infrastruttura headless (RoamSwitch Server Edition: sempre attivo, con negazione predefinita, integrità FIM con percorso critico, webhook remoti e applicazione di policy statiche) viene fornita come build di server dedicato.

Identifica la rete Wi-Fi/cablata connessa tramite l'indirizzo MAC del gateway e cambia autonomamente il profilo firewall nftables attivo. Oltre a ciò, fornisce tre livelli di difesa man-in-the-middle su reti non attendibili: un tunnel VPN + kill-switch (WireGuard o Tailscale, la difesa primaria), un blocco ARP/NDP preventivo e rilevamento spoofing ARP — oltre al rilevamento ransomware comportamentale (fanotify + entropia di Shannon + canaries), una guardia passiva dei collegamenti che segnala o blocca le connessioni di phishing (NFQUEUE + SNI), una guardia delle anomalie delle porte, mitigazione BadUSB, kernel local privilegia escalation (LPE) preemption (mitigazione Frag Gap CVE-2026-53362), eBPF integrazione del sensore di minacce runtime (Falco / Tetragon) con congelamento dei processi in meno di un secondo (SIGSTOP) e isolamento della rete Air-Gap, una valutazione dello stato della sicurezza composta da 24 elementi e un server MCP (Model Context Protocol) integrato.

Questo whitepaper descrive l'architettura, il modello di minaccia e la progettazione di ciascun meccanismo di difesa e, in particolare, come il principio di "elaborazione completamente locale; l'unica cosa inviata dalla macchina è una richiesta di dati di rilevamento firmati, che non portano nulla su di te" è garantito a livello di codice. Evita il linguaggio del marketing; le affermazioni possono essere verificate rispetto al comportamento effettivo del pacchetto distribuito (binario) e all'autocontrollo nell'appendice. RoamSwitch per Linux è un freeware proprietario e il suo codice sorgente non è pubblicato (§11).

Principi di progettazione
PrincipioDettaglio
Telemetria zeroIl prodotto non invia nulla a nessuno su di te o sulla tua macchina. Non sono disponibili telemetria, analisi, segnalazione di arresti anomali, metriche di utilizzo, configurazione remota o server di attivazione della licenza.
Ricevi solo aggiornamentiL'unica richiesta in uscita effettuata dal prodotto è una volta al giorno GET di un manifest fisso e firmato da lafine.net/updates/v1: l'elenco dei siti truffa per la protezione dei collegamenti, la versione della firma ClamAV, l'ultima versione dell'app, le mappe CVE dei pacchetti (Homebrew/npm/PyPI/crates.io/RubyGems/Packagist/Go/Maven), la mappa CVE della verifica attiva delle vulnerabilità, e l'elenco dei nomi di pacchetti npm popolari usato per il rilevamento typosquatting. Non contiene stringhe di query, cookie, intestazioni identificative e nessuna informazione su di te. updates.enabled = false lo spegne completamente; il prodotto viene quindi eseguito su dati raggruppati senza contatto esterno.
Elaborazione completamente localeOgni valutazione, rilevamento e controllo viene completato sul computer locale. L'analisi della sicurezza degli URL e la scansione segreta valutano euristicamente il loro input senza trasmetterlo da nessuna parte.
Privilegio minimoLe operazioni privilegiate sono limitate a un demone root; l'interfaccia utente, la CLI e il server MCP li richiedono tramite un IPC con socket di dominio Unix. Il demone non apre alcun socket TCP/UDP; la protezione del collegamento utilizza solo il canale del verdetto AF_NETLINK NFQUEUE (kernel ↔ spazio utente, nessun pacchetto in uscita).
Fail chiusoAir-Gap (isolamento di emergenza) sopravvive al riavvio del demone e viene ripristinato in pochi secondi se le sue regole vengono eliminate esternamente.
Licenza offlineLe licenze Pro/Business vengono verificate esclusivamente tramite il controllo della firma Ed25519. Non si verifica alcuna chiamata a un server di attivazione.

§2

RoamSwitch per Linux è destinato principalmente a laptop/workstation mobile che effettua il roaming tra reti non attendibili.

Aggressori nel raggio d'azione

  • Un utente malintenzionato sulla stessa LAN: scansione delle porte su Wi-Fi condiviso, spoofing ARP/NDP (inclusi annunci di router non autorizzati) per un man-in-the-middle, DHCP non autorizzato, sniffing passivo dopo inondazione del MAC, accesso non autorizzato a un server di sviluppo o API LLM locale accidentalmente associato a 0.0.0.0.
  • Dispositivi USB dannosi (BadUSB) — impersonano una tastiera e immettono sequenze di tasti prima che lo schermo si blocchi; dispositivi di archiviazione di massa USB non registrati per l'esfiltrazione di dati o per il trasporto di malware.
  • Ransomware / malware senza file: entra tramite un file scaricato e crittografa in blocco i documenti dell'utente.
  • C2 e phishing basati su DNS: malware che utilizza la risoluzione dei nomi per raggiungere un server C2 o un sito di phishing.

Fuori portata

  • Un utente malintenzionato che possiede già il root; rootkit a livello di kernel o firmware.
  • Attacchi che rimuovono fisicamente il disco (il dominio della crittografia dell'intero disco; RoamSwitch diagnostica se la crittografia è presente ma non crittografa).
  • Controllo della condivisione wireless di prossimità in stile AirDrop (nessun meccanismo nativo del sistema operativo su Linux; non supportato).

§3

RoamSwitch per Linux è implementato in Rust in sette crate. Tutte le comunicazioni con il demone passano attraverso /run/roamswitch/roamswitch.sock (un socket di dominio Unix). Non esiste un socket TCP/UDP in ascolto nel demone, nell'app o nel server MCP. L'unica cosa che l'app binds è un singolo socket Unix per impedire una seconda istanza.

# Spazio utente (non privilegiato)
roamswitch-app      Tray GTK3 + AppIndicator
roamswitch (CLI)    Frontend shell leggero
roamswitch-mcp      stdio JSON-RPC (avviato dai client IA)
      │
      │  AF_UNIX  /run/roamswitch/roamswitch.sock  (solo IPC locale)
      ▼
roamswitch-daemon   root / systemd Type=notify + WatchdogSec=30
  · Controllo dei profili nftables (tabella inet roamswitch)
  · Ciclo sentinel (rilevamento di rete e applicazione dei profili)
  · Tunnel VPN + kill-switch (WireGuard: wg-quick / roamswitch_vpn, Tailscale: roamswitch_ts)
  · Blocco preventivo ARP/NDP (fissaggio della tabella neigh) / rilevamento
  · Guardia anomalie porte (roamswitch_dev_guard)
  · Guardia fanotify (ransomware / malware)
  · Guardia link (NFQUEUE — inet roamswitch_linkguard)
  · Motore canary / Vault di quarantena
  · Hardening del kernel contro gli LPE (disabilitazione userns, Yama LSM)
  · Integrazione runtime eBPF (/var/run/roamswitch/events.sock)
  · Blocco SIGSTOP dei processi attaccanti in millisecondi e collegamento con Air-Gap
  · Monitoraggio USB (evdev EVIOCGRAB — BadUSB) / coda di approvazione
  · Verifica della licenza Ed25519

roamswitch-updater  Un helper systemd-timer autonomo. L'unico crate
                    con uno stack HTTP/TLS (GET giornaliero di un manifest firmato)
roamswitch-core     Libreria di logica pura (condivisa da tutti i crate)
roamswitchkit       SDK client MCP
Separazione dei privilegi
ComponentePrivilegioRuolo
roamswitch-daemonradice (systemd, Type=notify + WatchdogSec=30)Tutte operazioni privilegiate. In qualità di scrittore singolo, controlla nftables, DNS e unità systemd.
roamswitch-apputente di accessoGUI GTK3 + vassoio AppIndicator. Solo modifica e visualizzazione della configurazione; ogni azione privilegiata passa attraverso IPC.
roamswitch (CLI)utente di accessoFront-end a guscio sottile che utilizza lo stesso socket IPC.
roamswitch-mcpprocesso generato dal client AIstdio JSON-RPC. Fornisce informazioni diagnostiche di sola lettura.

Tutte le comunicazioni con il demone passano attraverso /run/roamswitch/roamswitch.sock (una directory con autorizzazioni equivalenti a 0700). La configurazione utente viene archiviata come testo semplice JSON in ~/.config/roamswitch/config.json. Il demone legge /home/*/.config/roamswitch/config.json con privilegi di root (funziona con HOME=/root). La configurazione non lascia mai la macchina; non è prevista la registrazione dell'account e nessuna sincronizzazione cloud.

§4

Il ciclo sentinella (ciclo di 5 secondi per impostazione predefinita) legge il MAC del gateway predefinito da /proc/net/arp e ip neigh e lo confronta con i MAC registrati in config.json. Viene utilizzato il MAC anziché l'SSID perché un SSID è banalmente falsificato. La notifica sul desktop mostrata quando si cambia profilo indica il motivo per lo scambio ("una rete non registrata" / "l'impostazione per la rete registrata X" / "nessuna connessione di rete").

Profili
ProfiloSituazionecomportamento di nftables
aperto (attendibile)Una rete domestica o aziendale registratapolicy accept. Traffico locale consentito.
bilanciatoNon registrato ma configurato come relativamente sicuroRifiuta per impostazione predefinita in entrata. Sono consentite solo le connessioni stabilite e lo; esposizione del porto esposto monitorata.
blocco (protezione assenza)Wi-Fi pubblica/rete non registrataTutti i pacchetti in entrata sono stati eliminati di nascosto. Servizi di condivisione arrestati automaticamente (attivazione).

Tutte le regole sono isolate in una tabella nftables dedicata denominata inet roamswitch e non entrano mai in conflitto con altre configurazioni del firewall (ufw/firewalld). La scadenza dell'override manuale (1 ora/2 ore/4 ore/fino a mezzanotte/fino alla cancellazione/fino alla successiva disconnessione) viene applicata dal demone come singolo scrittore. La GUI non scrive mai una scadenza; rilegge config.json il demone ha riscritto al tick successivo e lo riflette nell'interfaccia utente (evitando un conflitto).

Air-Gap (isolamento della rete di emergenza)

Una modalità di isolamento totale che imposta policy drop (priorità -100) su entrambi gli hook di input e output della tabella inet roamswitch, consentendo solo lo.

  • Fail closed — al riavvio del demone, il rilevamento del file marker (/run/roamswitch/airgap.active) riafferma l'isolamento.
  • Self-healing: se un processo esterno elimina le regole con nft delete table, il ciclo sentinella si riapplica entro pochi secondi.
  • Scadenza automatica — 600 secondi dopo l'attivazione (identico a macOS maxAirGapDuration) l'isolamento si risolve automaticamente, prevenendo una perdita permanente di connettività a causa di un clic errato.
table inet roamswitch {
    chain input {
        type filter hook input priority -100; policy <accept|drop>;
        iif "lo" accept
        ct state established,related accept
        # balanced/lockdown: tutto il resto viene scartato (drop)
    }
    chain output {
        type filter hook output priority -100; policy <accept|drop>;
        # policy drop solo durante l'Air-Gap; sono consentiti solo lo e ct established
    }
}

Protezione passiva dei collegamenti (rilevamento delle connessioni phishing)

Il demone controlla dove stanno andando le connessioni in uscita e segnala (o, per il ristretto gruppo "chiaramente di phishing", blocca) le connessioni a host pericolosi. Sostituisce il vecchio controllo Incolla un URL, che richiedeva all'utente di agire.

  • Interception: una tabella nftables dedicata inet roamswitch_linkguard aggancia il percorso output e accoda le domande DNS e le connessioni web nuove/precoci a un lavoratore dello spazio utente tramite NFQUEUE. NFQUEUE è un canale di verdetto kernel↔userspace su AF_NETLINK; il demone non associa alcun socket e non genera alcun pacchetto. Le regole della coda trasportano bypass, quindi se il lavoratore non sta correndo, il traffico passa senza ostacoli (Air-Gap rimane l'hard stop separato).
  • Hostname source: il nome della domanda DNS, TLS ClientHello SNI (quindi un browser che utilizza DoH è ancora coperto dal nome host) e l'intestazione HTTP Host in testo normale. Encrypted ClientHello (ECH), una volta ampiamente distribuito, è un noto punto cieco.
  • Verdict (roamswitch-core, logica pura): un host viene controllato rispetto al feed locale di phishing/minacce e a una serie di euristiche offline: IDN/omografo confondibile di un marchio protetto, token del marchio in un dominio non ufficiale, host IP non elaborato, TLD ad alto rischio.
Modalità (linkGuard.mode)Colpo del feed o omografo del marchioAltri segnali sospetti
offnon ispezionatonon ispezionato
warnconnessione mantenuta fino a 8 s + una richiesta di approvazione consenti/bloccasolo notifica
block (predefinito)connessione interrotta + una finestra di dialogo di autorizzazione (una volta per host)solo notifica

Solo un feed hit o un host omografo del marchio vengono bloccati; tutto ciò che viene segnalato solo dall'euristica è un avvertimento. modalità warn mantiene la connessione a un host pericoloso per un massimo di 8 secondi mentre lo chiede all'utente; se il blocco scade senza risposta è fail-closed (i pacchetti vengono scartati e il verdetto non viene memorizzato nella cache) — non si risponde "questo sito è OK?" non deve significare "sì" e il tentativo successivo richiede nuovamente. La modalità block mostra una notifica e una finestra di dialogo di autorizzazione per host (un browser che apre molte connessioni allo stesso host bloccato non inonda più le notifiche). In una finestra di dialogo di approvazione pericolosa, il pulsante predefinito è "Continua a bloccare" e "Consenti" è indicato come la scelta silenziosa e non predefinita. Un host bloccato può essere consentito in modo permanente o per cinque minuti dalla notifica (linkGuard.allowlist).

DNS viene ispezionato, mai contraffatto: una domanda DNS nella blocklist produce solo una notifica; l'applicazione avviene alla successiva connessione TCP, quindi RoamSwitch non inserisce mai una risposta DNS sintetica. feed è un elenco compilato di domini phishing/truffa, fornito nel pacchetto e aggiornato dal programma di aggiornamento quotidiano (§11). Senza feed presente, l'euristica offline continua a essere eseguita. La firma Ed25519 del file feed viene controllata prima del caricamento; un feed errato o mancante non riesce a "solo euristica", mai a "consentire tutto".

Tunnel VPN + kill switch (la difesa MITM primaria)

Protezione anti-MITM che non dipende dall'integrità del livello 2. Su una rete non attendibile, un tunnel crittografato sempre attivo verso un endpoint attendibile rende irrilevanti lo spoofing ARP/NDP locale, il DHCP non autorizzato e lo sniffing passivo: l'aggressore vede solo il testo cifrato. Il blocco ARP/NDP e il rilevamento di seguito sono secondari rispetto a questa funzionalità.

Due backend tra cui scegliere: "WireGuard (file di configurazione)" o "Tailscale (nodo di uscita)". RoamSwitch non implementa alcuna crittografia propria e non è un provider VPN. Entrambi i backend sono dipendenze opzionali; se assente la GUI mostra il comando di installazione.

(A) Backend WireGuard

  • Non viene fornito alcun server VPN: utilizza una configurazione WireGuard fornita dall'utente: un .conf da un provider come Mullvad, IVPN o Proton VPN o il server WireGuard dell'utente (un VPS o un server domestico). Non viene fornita alcuna configurazione predefinita.
  • Config: il demone convalida .conf e lo memorizza in /etc/wireguard/roamswitch.conf (0600, interfaccia roamswitch). Non può vivere altrove: il profilo AppArmor wg-quick su Ubuntu 24.04+ / Debian 13 nega a wg-quick di leggere un .conf all'esterno di /etc/wireguard/ — anche come root. Una configurazione a tunnel diviso (AllowedIPs non 0.0.0.0/0 / ::/0) è contrassegnata come "non tutto il traffico è protetto".
  • Kill-switch — una tabella nftables dedicata inet roamswitch_vpn (policy drop, entrambi gli hook) rilascia tutto tranne il loopback, l'interfaccia tunnel (roamswitch, abbinata a oifname), UDP all'IP dell'endpoint bloccato, DHCP e ICMP. Viene installato prima che il tunnel venga attivato (l'endpoint viene prima risolto in IP fissi tramite getent ahosts), quindi non vi è alcuna finestra di perdita. Se wg-quick up fallisce, il kill switch rimane alzato.

(B) Backend Tailscale

  • Per gli utenti che già utilizzano Tailscale. RoamSwitch not esegue tailscale up / login / install tailscaled — legge tailscale status --json ed esegue tailscale set --exit-node=<node> / --exit-node= (cancella).
  • È richiesto un nodo di uscita: la protezione anti-MITM vale solo con un nodo di uscita che instrada tutto il traffico. Senza alcuna configurazione, la protezione non è armata e l'interfaccia utente avverte "non protetto". Se il nodo scelto va offline, la protezione viene disattivata automaticamente e l'utente viene avvisato (instradare tutto attraverso un nodo morto manderebbe in blackhole la connessione).
  • Kill-switch (inet roamswitch_ts, policy drop) — Il trasporto di Tailscale non può essere bloccato su un singolo IP endpoint (relè DERP + peer roaming), quindi questo è più flessibile rispetto a quello WireGuard. Permette: loopback, l'interfaccia tunnel (tailscale0), gli intervalli CGNAT 100.64.0.0/10 e fd7a:115c:a1e0::/48, STUN (udp/3478), DERP (tcp/443), udp/41641, DHCP, ICMP, MagicDNS (100.100.100.100:53), connessioni stabilite. Tutto il resto (UDP arbitrario, DNS su un risolutore locale, SMB, mDNS, HTTP in testo normale, TCP arbitrario) viene eliminato.
  • Avvertenze sul kill-switch — (1) elenco di consentimenti più ampio rispetto al backend WireGuard (udp/3478, tcp/443, l'intero CGNAT /10). (2) Un utente malintenzionato sul percorso vede ancora i metadati (che Tailscale è in uso, la regione DERP, i tempi) e può rilasciare/ritardare, ma non può leggere il carico utile nel tunnel. (3) Quando l'UDP diretto viene bloccato, la riservatezza si basa sul DERP TLS con certificato bloccato di Tailscale. (4) Con MagicDNS disattivato + un risolutore locale, il DNS si interrompe mentre è armato (avviso UI). (5) È necessario effettuare l'accesso ai portali captive prima dell'abilitazione.

Common: inserito solo quando vpn_on_untrusted_enabled e la rete non è attendibile (level != open). Su una rete affidabile il nodo di uscita viene cancellato e il kill switch rimosso (mai tailscale down). Disattivato per impostazione predefinita, attivalo. Il tunnel WireGuard/il trasporto Tailscale va all'endpoint VPN/tailnet dell'utente e non è correlato all'infrastruttura di lafine (§9).

Blocco preventivo ARP/NDP

Nel momento in cui si accede a una rete non attendibile, gli indirizzi MAC dell'infrastruttura on-link che un utente malintenzionato MITM dovrebbe impersonare vengono inseriti nella tabella dei vicini del kernel come PERMANENT voci (statiche). Una volta bloccato, il kernel ignora le risposte ARP contraffatte/gli annunci dei vicini.

  • Che cosa è pinned — (1) il gateway predefinito IPv4, (2) il router predefinito IPv6 (spesso un indirizzo fe80:: link-local), (3) qualsiasi risolutore DNS on-link (un risolutore pubblico viene raggiunto tramite il gateway e viene ignorato). I vicini IPv6 sono bloccati con ip -6 neigh replace ... nud permanent.
  • Le reti attendibili non vengono mai bloccate, quindi il riavvio del router domestico non può creare un buco nero all'utente. Ricollegato su ogni switch di rete (TOFU); alla successiva riconnessione viene rilevato un failover legittimo. Le voci appuntate vengono registrate in /var/lib/roamswitch/arp_lock.json.
  • Attivo per impostazione predefinita (criteri della Community Edition; stessa ripartizione della build di macOS Pro). Alterna: gateway_arp_lock_enabled.

Rilevamento spoofing ARP (notifica prima)

Monitora /proc/net/arp per la mappatura di un IP su più MAC e per una modifica improvvisa sospetta del MAC del gateway. In lockdown: taglia tutto il traffico (Air-Gap) + avvisa. Su reti bilanciate/attendibili: notifica senza interrompere; l'utente attiva l'Air-Gap di emergenza da RoamSwitch. Ciò (a) impedisce a un utente malintenzionato di utilizzare come arma un singolo pacchetto ARP contraffatto provocando un'interruzione autoinflitta e (b) impedisce a un riavvio del router o al roaming del punto di accesso di attivarlo per errore. Alterna: arp_spoof_guard_enabled.

Guardia delle anomalie del porto

Contiene automaticamente una porta di ascolto appena esposta alla LAN esterna (una backdoor, C2 o un server di sviluppo/API LLM locale accidentalmente collegata a 0.0.0.0). Il verdetto è baseline-relative, non "numero di porta pericoloso". All'abilitazione, gli eseguibili attualmente esposti vengono appresi come "conosciuti"; successivamente viene contrassegnato solo un eseguibile esposto appena apparso (identità = percorso dell'eseguibile, snap normalizzati su snap:<name>). I demoni di sistema non rientrano nell'ambito. Il contenimento avviene tramite la tabella inet roamswitch_dev_guard: rilascia TCP su quella porta da qualsiasi cosa tranne lo: la macchina stessa continua a utilizzarla. Dopo il contenimento automatico, viene presentata una notifica desktop immediata e una finestra di dialogo di conferma ("Consenti questa porta" / "Mantieni bloccato"), consentendo l'inserimento permanente nella whitelist con un clic. Dalla schermata di diagnostica della porta è inoltre possibile consentire qualsiasi porta individualmente e ricatturare la linea di base. Attivo per impostazione predefinita. Alterna: port_anomaly_guard_enabled. Portato da macOS.

Rilevamento rischi Docker e protezione anti-bypass del firewall

Le porte pubblicate da Docker (-p) presentano un problema noto di bypass del firewall standard dell'host, pertanto vengono inserite permanentemente regole di ispezione nella catena DOCKER-USER, bloccando qualsiasi traffico esterno non esplicitamente consentito (nessuna configurazione richiesta, attivo per impostazione predefinita). Inoltre, docker events viene monitorato in tempo reale per rilevare istantaneamente l'avvio di un container --privileged o il mount di /var/run/docker.sock — un rischio di escape dal container — e avvisarti immediatamente. Poiché questo segnala una configurazione a rischio e non una compromissione confermata, si tratta solo di una notifica, senza blocco automatico.

Scanner per la fuga di segreti e chiavi API

Rileva chiavi API (OpenAI, Anthropic, AWS, GitHub, Slack, Stripe e altre) e chiavi private SSH tramite entropia di Shannon e corrispondenza di pattern. roamswitch audit-secrets <text|file|directory> analizza testo e file, oltre a un'intera directory in modo ricorsivo (escludendo .git, node_modules e simili; i file superiori a 2MB o che sembrano binari vengono saltati). La stessa funzionalità è disponibile anche tramite lo strumento MCP audit_secrets e il metodo audit_secrets_directory() dell'SDK Python. Il contenuto non viene mai trasmesso altrove.

Procedura guidata di configurazione iniziale e interfaccia utente di conferma

Il pacchetto viene spedito /etc/xdg/autostart/roamswitch.desktop, quindi la procedura guidata di configurazione viene avviata al primo accesso dopo l'installazione (successivamente è solo residente nel vassoio). L'abilitazione/disabilitazione di una guardia di sicurezza mostra una finestra di dialogo di conferma per le stesse guardie della build macOS (anomalia porta, contenimento automatico ARP, archivio USB, tastiera USB difettosa, Bluetooth). Le decisioni relative all'ora dell'evento (una tastiera USB sconosciuta, un'unità USB non registrata, una porta sconosciuta bloccata automaticamente, un Air-Gap di emergenza) vengono presentate come finestre di dialogo modali.

§5

Rilevamento di burst di entropia di Shannon · Scansione YARA

Gli eventi di scrittura vengono tracciati per PID. Se un singolo processo crea 20 o più file distinct con entropia ≥ 7,92 entro 5 secondi, viene trattato come crittografia di massa ransomware: il processo viene congelato con SIGSTOP e viene attivato Air-Gap.

  • Separazione completa della scansione YARA e del monitoraggio dell'entropia: l'ispezione malware YARA viene applicata a tutti i file scritti senza eccezioni (zero bypass, scansione ~/.cache/, node_modules/, /tmp/ e archivi). Nel frattempo, l'analisi del ransomware Entropy Burst esclude i formati naturalmente compressi (.zip, .tgz, .tar.gz, .gz, .png, .jpg, .mp4, .wasm) e i gestori di pacchetti verificati (npm, npx, cargo, rustc, dpkg, apt, tar) che operano negli alberi di build/cache per eliminare i blocchi SIGSTOP falsi positivi.
  • Sovrascritture ripetute dello stesso file (ad esempio i tre passaggi di shred) contano come un evento.
  • Protezione dei processi critici: i PID vengono controllati rispetto a un elenco hardcoded NEVER_FREEZE (systemd, dockerd, NetworkManager, sshd, gnome-shell, …) e non vengono mai congelati, impedendo un blocco a livello di macchina.

Canarini (file esca)

I file esca vengono inseriti nelle cartelle Documenti, Desktop, Download e Immagini dell'utente e in una directory dedicata e confrontati con una linea di base SHA-256 su un ciclo di 3 secondi. Qualsiasi ridenominazione, cancellazione, troncamento o modifica del contenuto attiva immediatamente Air-Gap. Poiché il demone viene eseguito come root, enumera /home/* e distribuisce canarini nelle directory di ogni utente reale.

monitoraggio fanotify · Quarantine Vault · ClamAV

  • Il demone monitora /home, /var/tmp, /dev/shm a livello di montaggio e / a livello di file system tramite FAN_CLASS_CONTENT (fallback FAN_CLASS_NOTIF).
  • Notifica prima, nessuna quarantena silenziosa. Un semplice successo YARA / ClamAV non viene mai messo in quarantena silenziosamente o FAN_DENY'd. Una firma reale solleva una richiesta modale in /run/roamswitch/approvals.json (Quarantena/Consenti/Più tardi); nulla entra nel caveau finché l'utente non conferma. Solo un execve effettivo è FAN_DENY e solo quando pre_exec_blocking_enabled è attivo. L'approvazione scade in caso di fail-open.
  • Le firme di test come EICAR vengono solo registrate nella cronologia: la stringa di test standard del settore non genera alcuna notifica, solo una voce nella cronologia delle notifiche, e non viene mai messa in quarantena o bloccata, sia nella protezione fanotify che nella protezione download.
  • Un elenco di percorsi scan_exclusions configurato dall'utente (percorsi assoluti, applicati in modo ricorsivo; sussume l'eredità clamav_exclusions) è rispettato sia dagli scanner YARA che da ClamAV. Sia "Consenti" nel prompt che "Ripristina" nella scheda Quarantena vengono aggiunti, quindi lo stesso file non viene contrassegnato nuovamente.
  • Il malware reale rilevato e confermato viene trasferito in ~/.local/share/roamswitch/quarantine/. Il caveau è 0700; ogni campione è 0400 (sola lettura, non eseguibile). Durante il ripristino, il file ritorna in 0644 e viene assegnato al proprietario della directory di destinazione.
  • Il ciclo permesso-evento esegue zero I/O del filesystem — la configurazione viene letta da un thread in background dedicato in uno snapshot Mutex<GuardConfig>; gli accessori hot-path si limitano a bloccare e copiare. Questa è un'invariante di progettazione: il blocco su FAN_OPEN_PERM bloccherebbe la macchina.
  • Quando ClamAV è presente, gli eseguibili appena scaricati (.sh, .deb, .elf, …) e i modelli AI pericolosi (.pkl, .pt) vengono scansionati rispetto al DB locale. ClamAV è una dipendenza opzionale; le altre difese funzionano senza di essa. Una volta installato, l'aggiornamento quotidiano (§11) richiama freshclam in modo che il database delle firme rimanga aggiornato.

Prelazione e rafforzamento dell'escalation dei privilegi locali del kernel (LPE).

Quando un utente malintenzionato o un malware riesce a prendere piede in un utente non privilegiato, la difesa approfondita impedisce di sfruttare le vulnerabilità del kernel Linux per ottenere privilegi root.

  • Disabilitazione degli spazi dei nomi degli utenti non privilegiati (mitigazione Frag Gap CVE-2026-53362) — Molte vulnerabilità LPE del kernel Linux moderno si basano su utenti non privilegiati che chiamano unshare(CLONE_NEWUSER) per creare spazi dei nomi utente isolati, accedendo successivamente a strutture del kernel non inizializzate o sottosistemi di rete legacy con funzionalità di spazio dei nomi elevate. RoamSwitch valuta e applica user.max_user_namespaces = 0 (o kernel.unprivileged_userns_clone = 0) tramite il rafforzamento o la configurazione guidata con un clic. Ciò chiude la superficie di attacco dai processi non privilegiati anche con kernel zero-day senza patch.
  • Yama LSM Memory Protection — L'applicazione di kernel.yama.ptrace_scope = 1 (o 2) impedisce ai processi non autorizzati di collegarsi tramite ptrace o di leggere la memoria tramite /proc/$pid/mem, salvaguardando le sessioni del browser e le chiavi private GPG/SSH.
  • Core Dump Suppression — L'impostazione fs.suid_dumpable = 0 impedisce ai processi sensibili che causano arresti anomali di scrivere dump della memoria in testo normale su disco.
  • __X6/tmp & /dev/shm noexec Mount Defense — Per prevenire attacchi drop-and-execute del payload, RoamSwitch rimonta /tmp e /dev/shm con noexec,nosuid,nodev quando si connette a reti non attendibili.

Sensore di minacce runtime eBPF e congelamento autonomo dei processi (protezione eBPF desktop)

Il demone client RoamSwitch include l'integrazione nativa con i moderni sensori eBPF nel kernel (Falco/Tetragon/BTF).

# Rilevamento delle minacce runtime eBPF e flusso di intercettazione autonoma
[Processo malevolo (LPE/malware)]
    │ Esecuzione di syscall illegale (tentativo di sfruttamento Frag Gap)
    ▼
[Kernel Linux (probe eBPF)]
    │ Buffer circolare eBPF (design compatto da 2 MB)
    ▼
[Falco (RoamSwitch Optimized)]
    │ Socket UNIX diretto in memoria (/var/run/roamswitch/events.sock)
    ▼
[roamswitch-daemon (root)]
    ├─► ① Blocco del processo attaccante in millisecondi: kill(pid, SIGSTOP) [stato: Ts]
    ├─► ② Interruzione completa della rete: nftables input/output drop [Air-Gap attivato]
    └─► ③ Avviso di emergenza desktop: modale GTK3 e notifica libnotify
  • Direct UNIX Domain Socket IPC (/var/run/roamswitch/events.sock) — Gli avvisi da Falco o altri sensori eBPF vengono ricevuti direttamente su un socket UNIX in memoria senza scrivere sui registri del disco, eliminando la latenza I/O del disco e consentendo trasferimenti di risposta in meno di un secondo.
  • Mitigazione multilivello autonoma (congelamento del processo e air-gap) — Quando viene ricevuto un evento con priorità Critical o Emergency (come LPE del kernel, escape dello spazio dei nomi o esecuzione di ransomware), il daemon esegue SIGSTOP sul PID dannoso per sospendere immediatamente l'esecuzione del processo (stato: Ts), distribuisce policy drop su inet roamswitch (Air-Gap) e attiva una notifica immediata sul desktop.
  • Ottimizzazione a basso overhead per desktop e prevenzione della crescita eccessiva dei log (RoamSwitch Optimized) — per contenere il consumo della batteria, il carico della CPU e l'esaurimento del disco su laptop e workstation, è incluso un profilo ottimizzato (99-roamswitch-optimized.yaml):
    • Filtro gravità (priority: warning): filtra il 95% degli eventi di avviso/informazione di routine.
    • Kernel Early Drop (drop_failed_exit: true) — Elimina le uscite syscall non riuscite direttamente nel driver del kernel, dimezzando i cambi di contesto e il carico della CPU.
    • Buffer circolare compatto (cpus_for_each_buffer: 2) — Riduce la dimensione del buffer circolare a 2 MB, mantenendo la RAM residente a 30–50 MB e l'utilizzo della CPU <1%.
    • Limite rotazione registro obbligatorio (/etc/logrotate.d/roamswitch-falco): impone un limite rigoroso di 50 MB con rotazione compressa di 7 generazioni.
  • Resilienza ibrida (modalità standalone vs. eBPF) — Senza Falco, RoamSwitch protegge il sistema tramite kernel sysctl (user.max_user_namespaces = 0), profili di roaming nftables, fanotify tracciamento dell'entropia e canary. Con Falco, la telemetria comportamentale interna al kernel intercetta gli exploit zero-day avanzati e blocca i processi degli aggressori in tempo reale.

§6

Gli eventi USB vengono monitorati; vengono monitorati i dispositivi di tipo tastiera (HID) e gli archivi di massa USB. Off per impostazione predefinita (spedizione isEnabled = false, corrispondente a macOS USBKeyboardGuard / USBStorageGuard). Accedere dalla procedura guidata di prima esecuzione o dalla scheda USB; l'abilitazione mostra una finestra di dialogo di conferma.

Tastiera USB non autorizzata (iniezione di tasti)

  • Nessuna de-autorizzazione della porta fisica a livello di kernel (importante). La vecchia implementazione (≤1.0.6) scriveva 0 in /sys/bus/usb/devices/*/authorized per una tastiera non registrata, disconnettendola fisicamente. Su un ricevitore combinato tastiera+mouse (comune su un Raspberry Pi o un mini PC) questo disconnette anche il mouse, bloccando una macchina senza input integrato. RoamSwitch ora rifiuta definitivamente la scrittura di authorized=0 su qualsiasi dispositivo che espone un'interfaccia HID (bInterfaceClass 03) e il demone autorizza nuovamente qualsiasi dispositivo HID authorized==0 all'avvio per autoriparare le macchine con una versione precedente bloccata.
  • Le sequenze di tasti vengono rilasciate nel software. Quando viene rilevata una tastiera non registrata, viene acquisito un evdev esclusivo EVIOCGRAB su /dev/input/eventN di quel dispositivo (solo i nodi con un gestore kbd in /proc/bus/input/devices, corrispondente a VID:PID). Il nodo del mouse è intatto. Questo è l'equivalente Linux di macOS CGEventTap; il dispositivo rimane alimentato.
  • Safety: la presa viene presa solo se c'è un'altra tastiera su cui digitare (integrata o USB approvata e collegata), quindi una macchina con un'unica nuova tastiera non viene mai bloccata.
  • Finestra di dialogo di approvazione: insieme al grab, una richiesta di approvazione viene accodata in /run/roamswitch/approvals.json e la GUI mostra una modale (Consenti/Nega). Consenti inserisce il dispositivo nella whitelist e rilascia la cattura. Fail-open dopo 3 minuti.

Memoria di massa USB non autorizzata

Quando viene inserito un dispositivo di archiviazione di massa USB non registrato (senza interfaccia HID), la protezione è abilitata e la rete non è attendibile/in blocco, viene mantenuta con authorized=0 (sicuro per un dispositivo non HID) e viene visualizzata una finestra di dialogo di approvazione. Consentire riautorizzazioni e whitelist; Negare lo mantiene. La build di macOS è stata allineata a questo modello di "attesa di sola lettura + richiesta di approvazione" nella versione 1.7.4.

Identificazione e nonno

L'HID è determinato da bInterfaceClass == "03" e dalla riga Handlers= in /proc/bus/input/devices. Un ricevitore combinato (un VID:PID con sia una sezione kbd che una sezione mouse) viene unito da VID:PID. Una tastiera non registrata presente all'avvio del demone è stata preservata; viene presa solo una tastiera collegata a caldo in seguito.

§7

LinuxHealthChecker in roamswitch-core valuta 24 item e produce un punteggio da 0 a 100, un voto da A a F e un consiglio per item. Dal dashboard GTK, dalla CLI (roamswitch status) e da MCP (get_security_report), il titolo, i dettagli e i consigli di tutti i 24 elementi vengono visualizzati nella lingua dell'utente (10 lingue).

Categorie di valutazione
CategoriaElementi di esempio
Disco/avvioCrittografia LUKS/dm-crypt, UEFI Secure Boot
Controllo degli accessiLSM (AppArmor/SELinux), controllo SSH/sudo configurazione
Indurimento del nocciolorafforzamento del sysctl, disabilitazione degli spazi dei nomi degli utenti non privilegiati (mitigazione del Frag Gap), controllo core-dump, noexec su /tmp e /dev/shm
Aggiornamenticonfigurazione automatica dell'aggiornamento di sicurezza
ReteMonitoraggio spoofing ARP, stato di blocco ARP/NDP del gateway, controllo delle porte esposte, potenza della crittografia Wi-Fi
MalwareClamAV / fanotify (controlla anche che la guardia sia effettivamente in esecuzione) / monitoraggio dell'entropia / noexec
NavigatoreImpostazioni di Navigazione sicura Firefox/Chrome/Chromium
DNS/USBDNS di protezione dalle minacce, stato zero-trust del bus USB

Ogni controllo si basa sulla lettura di file locali e sull'output dei comandi (getenforce, mokutil, resolvectl, ss, …). Non esiste alcuna query esterna di alcun tipo.

Classificazione basata sul trust. Rafforzamento che RoamSwitch deliberatamente non applicare su una rete (domestica) attendibile: bloccando il MAC del gateway come PERMANENTE (che ostruirebbe la LAN al riavvio del router), rimontando /tmp e /dev/shm noexec (che interrompe le build dei pacchetti e alcuni programmi di installazione) e DNS di protezione dalle minacce con l'impostazione predefinita ambito: viene visualizzato in verde con una spiegazione anziché in rosso "non rafforzato" e indica che viene applicato automaticamente su una rete non attendibile. La verità del runtime proviene da /run/roamswitch/state.json (active_level / network_trusted / fanotify_ready), scritto ogni ciclo dal demone. L'elemento fanotify controlla che la guardia sia effettivamente contrassegnata e in esecuzione (/run/roamswitch/fanotify.ready), non semplicemente che il kernel la supporti. L'elemento delle porte esposte legge il profilo live del demone (l'hardcode MCP è scomparso).

Rafforzamento per elemento. Gli elementi non riusciti che hanno una correzione automatica (kernel sysctl / Yama / core dump, /tmp noexec, USB zero-trust, blocco ARP del gateway, DNS di protezione dalle minacce, riavvio del demone quando la protezione fanotify è disattivata) hanno un pulsante "🔧 Rafforza" nel dashboard GTK. Il demone viene eseguito come root, quindi non è necessario pkexec tranne che per il riavvio del demone.

§8

roamswitch-mcp parla JSON-RPC su stdio ed è generato da client AI come Claude Desktop, Cursor e Antigravity. Ogni strumento è di sola lettura e completamente locale.

Strumenti esposti
StrumentoScopo
get_security_reportValutazione in 24 elementi, punteggio, raccomandazioni
get_porte_esposteporte esposte e il relativo stato di blocco del firewall
get_guard_statuslivello di protezione attuale e stato del modulo di difesa
audit_url_sicurezzaanalisi euristica della sicurezza dell'URL (non recupera il target)
audit_secretsrilevamento di chiavi/segreti API nel testo (non trasmette il testo)
audit_security_logsaggregazione di log journald/auth locali
get_quarantine_status / get_canary_statusquarantena e stato delle Canarie
get_app_helpricerca della base di conoscenza integrata
run_active_vuln_scanVerifica attiva delle vulnerabilità, non distruttiva e limitata a 127.0.0.1. L'unico strumento che usa la rete: disattivato per impostazione predefinita, richiede l'attivazione nelle impostazioni.
run_package_cve_scanConfronta i pacchetti installati (Mac: Homebrew / Linux: dpkg, dnf, zypper, pacman) con una mappa CVE locale. Non avviene alcuna comunicazione di rete.
run_package_cve_scan_languagesConfronta i file di lock delle dipendenze di npm, PyPI, crates.io, RubyGems, Packagist, Go e Maven con la stessa mappa CVE locale. Non avviene alcuna comunicazione di rete.
verify_fimRicalcola l'hash di circa 150 file di sistema critici e lo confronta con la baseline salvata per verificarne l'integrità.
get_file_scan_guard_statusRestituisce la configurazione del File Scan Guard (ClamAV) e lo stato del vault di quarantena che utilizza.
get_port_anomaly_incidentsRestituisce lo stato della baseline della protezione dalle porte anomale, le porte attualmente bloccate in automatico e fino ai 50 incidenti più recenti. La risposta indica esplicitamente che le porte attualmente bloccate sono un'istantanea dello stato attuale, priva di timestamp, distinta dalla cronologia degli incidenti, che invece è dotata di timestamp.
get_ebpf_incidentsRestituisce lo stato di isolamento attuale della guardia runtime eBPF e la cronologia degli incidenti all'origine.
get_resource_guard_incidentsRestituisce la cronologia della guardia contro l'esaurimento delle risorse e le anomalie di processo (memory leak, crash loop), con un livello di confidenza.
get_notification_historyRestituisce la cronologia delle notifiche inviate da RoamSwitch (anomalie di controllo dei log di sicurezza, rilevamenti ClickFix e altro) degli ultimi 7 giorni, le più recenti per prime.
get_incident_timelineUnisce i rilevamenti di tutte le guardie in un'unica linea temporale, con la genealogia dei processi e i tag MITRE ATT&CK (sperimentale).

Il server MCP non apre alcuna connessione di rete propria: si collega al socket Unix del daemon tramite roamswitchkit oppure richiama direttamente la logica di roamswitch-core. L'unica eccezione è run_active_vuln_scan, disattivato per impostazione predefinita, che invia sonde non distruttive a 127.0.0.1, cioè all'host stesso.

Un'attribuzione errata scoperta — e corretta — durante un'esercitazione con un LLM locale
Nel settembre 2026, durante un'esercitazione (fire drill) in cui a un LLM locale (Qwen 3.8 27B) è stato chiesto di indagare su un incidente tramite questo server MCP, abbiamo scoperto un caso in cui il modello ha interpretato male i dati restituiti da get_port_anomaly_incidents, includendo erroneamente un blocco di porta vecchio e non correlato nella narrazione di un incidente in corso. La causa: un'istantanea priva di timestamp delle porte attualmente bloccate veniva restituita nella stessa risposta della cronologia reale degli incidenti, dotata di timestamp, senza nulla che distinguesse le due cose. La correzione aggiunge campi di nota espliciti che indicano quale campo rappresenti una linea temporale e quale sia solo un'istantanea. Rieseguendo lo stesso scenario con lo stesso modello dopo la correzione, il modello ha citato il testo della nota e ha esplicitamente rifiutato di attribuire la vecchia porta all'incidente attuale. L'efficacia della correzione è stata verificata sia con un test di regressione automatizzato sia con una nuova esecuzione del vero LLM locale.

§9

RoamSwitch per Linux effettua esattamente un tipo di richiesta in uscita: l'GET dell'aggiornamento quotidiano di un manifest firmato (§11). Tutto il resto (ogni valutazione, rilevamento e audit) viene completato localmente. RoamSwitch per Linux è un freeware proprietario e la sua fonte non è pubblicata, pertanto le ispezioni riportate di seguito sono state eseguite da lafine; i risultati sono in 9.2 e i passaggi nell'Appendice C sono riproducibili solo dal pacchetto distribuito.

9.1 Metodo di verifica

  1. Isolamento dei crate: uno stack HTTP/TLS è consentito in solo un crate, roamswitch-updater, che crea il binario di aggiornamento autonomo basato su timer. scripts/audit_no_network.sh (eseguito in CI, gating) non riesce la compilazione se roamswitch-core, roamswitch-daemon, roamswitch-app, roamswitch-mcp o roamswitchkit inserisce reqwest / hyper / ureq / rustls / native-tls / openssl o se qualsiasi file .rs all'esterno roamswitch-updater utilizza TcpStream / TcpListener / UdpSocket / to_socket_addrs / lookup_host.
  2. Ispezione dell'albero delle dipendenze: è stato cercato l'intero Cargo.lock per SDK di telemetria/analisi/segnalazione di arresti anomali (sentry, opentelemetry, …).
  3. roamswitch-updater review: il suo obiettivo di richiesta singolo, l'assenza di una stringa di query/cookie/intestazioni identificative e la verifica Ed25519 di tutto ciò che scarica.
  4. Enumerazione sottoprocessi: ogni sito di chiamata Command::new(...) è stato esaminato.

9.2 Risultati

Risultati dell'audit
Elemento di controlloRisultato
Pila HTTP/TLSPresente solo in roamswitch-updater (ureq + rustls). Non in core / daemon / app / mcp / kit
SDK di telemetria/analisi/segnalazione di arresti anomaliNon presente da nessuna parte
TcpStream / TcpListener / UdpSocketNessuna volta fuori roamswitch-updater
API socket in usoAF_UNIX (IPC locale); AF_NETLINK (canale verdetto NFQUEUE, nftables e controllo ip neigh — nessuna uscita); AF_INET solo in roamswitch-updater. Il tunnel VPN (§4), quando abilitato, è wg-quick (backend WireGuard) o tailscaled (backend Tailscale) — un sottoprocesso, non il demone — che invia il traffico all'endpoint/tailnet dell'utente
Aggiornamento quotidianoUno GET https://lafine.net/updates/v1/manifest ogni ~24 ore. Nessuna stringa di query, nessun cookie, User-Agent generico, nessun identificatore. Tutti i payload verificati Ed25519. updates.enabled = false lo disabilita completamente
Tunnel VPN (§4)Disattivato per impostazione predefinita. Se abilitato, wg-quick crea un tunnel WireGuard su l'endpoint nell'.conf dell'utente, non correlato a lafine. Risoluzione del nome host dell'endpoint tramite getent ahosts (glibc NSS), non un'API socket Rust
Attivazione della licenzaVerifica della firma Ed25519 offline. Nessuna comunicazione con un server di attivazione
Conclusione

RoamSwitch per Linux avvia esattamente un tipo di richiesta in uscita: un download giornaliero di sola ricezione dei dati di rilevamento firmati che non contiene informazioni sull'utente o sulla macchina. Nient'altro nel prodotto contatta mai un server esterno.

9.3 Elenco completo delle operazioni rivolte all'esterno

Ogni operazione che potrebbe far sì che un pacchetto lasci la macchina locale, direttamente o indirettamente:

#OperazioneDestinazioneInnescoCosa viene inviato
1Daily updaterGET /v1/manifest e il file del feed quando la sua versione è cambiatalafine.net/updates/v1 (CDN)systemd timer, una volta ogni ~24 ore con un ritardo casuale. Spento quando updates.enabled = false o roamswitch-update.timer è disabilitatoun semplice HTTPS GET: nessuna stringa di query, nessun cookie, generico User-Agent, niente sull'utente o sulla macchina. Riceve un manifest firmato + feed
1afreshclam (aggiornamento di ClamAV), richiamato dall'aggiornamento quotidiano quando ClamAV è installatoil CDN del progetto ClamAVcome parte del numero 1traffico dello stesso ClamAV (un progetto separato); RoamSwitch lo avvia solo
2ping -c1 -W1 il gateway predefinito della LAN (link-local)per aggiornare la cache ARP durante il rilevamento dello spoofing ARPSolo richiesta eco ICMP. Nessuna risoluzione DNS, nessun carico utile
3avviando il browser di sistema (xdg-open)https://lafine.net/... (sito del prodotto)solo quando l'utente fa clic su un pulsante come "Apri note di rilascio"il processo RoamSwitch non apre alcun socket; trasmette l'URL al browser del sistema operativo
4risolverectl dns — (non avviene alcuna comunicazione)DNS di protezione dalle minacce su una rete non attendibile (opt-in). <iface> indica ogni scheda NIC fisica che trasporta un percorso predefinito (cablato + wireless contemporaneamente; lo / tailscale* / wg* / docker* / veth* esclusi); applicato anche su una rete attendibile quando dns_scope = always_on; riconciliato ogni ciclo sentinellacambia solo l'impostazione del risolutore del sistema operativo; RoamSwitch stesso non invia alcuna query DNS
5aggiornamenti del gestore pacchettii repository apt/dnf/zypper della distribuzionequando l'utente esegue apt upgrade, ecc. oppure fa clic sul pulsante "Aggiorna ora" della GUI (che esegue apt-get / dnf / zypper tramite pkexec)RoamSwitch legge l'output apt-cache policy locale e avvia il gestore pacchetti; estraneo a lafine
6VPN tunnel (§4) — Backend WireGuard: il tunnel wg-quick crea / Backend Tailscale: tailscale set --exit-node instrada tutto il traffico attraverso il nodo di uscital'endpoint VPN/tailnet dell'utente (WireGuard: l'endpoint in .conf; Tailscale: il nodo di uscita scelto e i relè DERP)quando vpn_on_untrusted_enabled e la rete non sono attendibili. Disattivato per impostazione predefinitatraffico WireGuard/Tailscale crittografato; la destinazione è il server VPN/tailnet dell'utente, non correlato a lafine. Risoluzione dell'endpoint WireGuard tramite getent ahosts (glibc NSS); Tailscale è guidato da tailscaled (un processo separato)

Tutte le altre funzionalità di RoamSwitch: controllo nftables, blocco ARP/NDP della tabella vicina (ip neigh, nessuna uscita di pacchetti), protezione del collegamento (solo NFQUEUE, AF_NETLINK), scansione delle porte (analisi dell'output ss), monitoraggio ARP, valutazione dello stato, monitoraggio dell'entropia, canary, fanotify, monitoraggio USB (evdev grab), quarantena, controllo dei log, controllo URL e segreti - viene completato utilizzando solo locale letture di file e analisi dell'output del sottoprocesso. Il tunnel VPN §4 è l'unica "comunicazione in uscita configurata esplicitamente dall'utente" e la sua destinazione è il server VPN dell'utente: nessun flusso di dati verso l'infrastruttura di lafine.

§10

  • Nessun account: nessuna registrazione utente, nessun accesso, nessun indirizzo email mai richiesto.
  • La configurazione è solo locale — archiviata in testo normale in ~/.config/roamswitch/config.json e non lascia mai la macchina. Non c'è sincronizzazione cloud.
  • I risultati della valutazione sono solo locali: i report sulla sicurezza e i risultati del controllo del registro vengono visualizzati solo sullo schermo e, se l'utente lo desidera, esportati in un file locale.
  • Le chiavi di licenza vengono verificate offline: i token di licenza Pro/Business contengono una firma Ed25519 e vengono verificati con una chiave pubblica. Non viene effettuata alcuna query su un server lafine.
  • No crash reporting: in caso di panico, nessuna traccia dello stack viene inviata da nessuna parte.
  • L'aggiornamento quotidiano non invia nulla su di te: nessuna stringa di query, nessun cookie, nessun identificatore di dispositivo o installazione, un generico User-Agent. Si tratta di un download, non di un report. I verdetti di protezione del collegamento, gli host bloccati e i risultati della scansione vengono scritti solo nella visualizzazione dell'attività locale/registrati nel journal, mai trasmessi.

§11

Edizioni
EdizionePerPrezzoLicenza
Edizione comunitariaUso personale di LinuxGratuitoFreeware proprietario (EULA in bundle)
Business (pianificato)Gestione flotta, distribuzione polizze, apt interno firmato, SLA per organizzazioniPagatoLicenza commerciale. Stesso binario + cancello di livello

Gli acquirenti di macOS RoamSwitch Pro Lifetime ricevono funzionalità Business gratuite sulle proprie macchine Linux.

Distribuzione e filiera

CanaleDettaglio
APPhttps://lafine.net/apt (stable main). Release firmato con una chiave RSA-4096
giri al minutohttps://lafine.net/rpm (Fedora / openSUSE separato). repomd.xml Firmato GPG
AURroamswitch-bin (recupera il tarball delle versioni GitHub, verifica sha256)
tarballamd64 / aarch64 .tar.gz + .sha256 su GitHub Rilasci
  • Pinned glibc floor — i binari di rilascio sono compilati all'interno di un contenitore Debian 12 (bookworm, glibc 2.36). Ciò impedisce mancata corrispondenza della versione del simbolo su Debian 12/Ubuntu 22.04 e versioni successive. Un passaggio CI "verifica glibc floor" fallisce la compilazione se viene introdotta una dipendenza che richiede più di 2.36.
  • Gestione delle chiavi di firma — la chiave privata per la firma del repository apt/rpm esiste solo in un segreto crittografato di GitHub Actions; solo la chiave pubblica è impegnata nel repository.

11.3 L'aggiornamento quotidiano

roamswitch-updater è un binario autonomo eseguito da un timer systemd (roamswitch-update.timer, OnCalendar=daily con un ritardo randomizzato di 3 ore e Persistent=true). È l'unico componente che raggiunge la rete. Ogni corsa:

  1. GET https://lafine.net/updates/v1/manifest e la sua firma staccata.
  2. Verifica la firma Ed25519 del manifest con una chiave di firma del feed di minacce dedicata, separata dalla chiave di aggiornamento dell'app Sparkle. Il feed viene firmato nuovamente quotidianamente dal CI lato server, in modo che la chiave privata risieda in un segreto del CI; inserirlo nel feed significa che una perdita consente a un utente malintenzionato solo di fornire una blocklist errata (sinkhole/avviso: nessun percorso del codice, nessun percorso di aggiornamento dell'app). La chiave di firma dell'aggiornamento dell'app non lascia mai il portachiavi di macOS. Un manifest che non viene verificato viene scartato: il programma di aggiornamento non ricorre mai ai dati non firmati.
  3. Se la versione del feed delle minacce è cambiata, scarica il feed, verifica la sua firma SHA-256 ed Ed25519 e installalo atomicamente per la protezione del collegamento (§4).
  4. Se ClamAV è installato, invoca freshclam.
  5. Registra l'ultima versione dell'app per una notifica (il programma di aggiornamento non installa mai l'app; su Linux l'utente esegue apt upgrade).

Il fallimento di qualsiasi passaggio (offline, firma errata, freshclam mancante) viene registrato come updates.lastError e il processo esce comunque da 0, quindi l'esecuzione del timer non genera mai una notifica di errore systemd. L'intero meccanismo è disabilitato da updates.enabled = false in updates.json o da systemctl disable --now roamswitch-update.timer; il prodotto viene quindi eseguito sui dati raggruppati nel pacchetto. Il feed delle minacce viene fornito anche all'interno del pacchetto, quindi una nuova installazione ha un feed funzionante prima che il programma di aggiornamento venga eseguito e apt upgrade lo aggiorna anche con il programma di aggiornamento disabilitato.

§12

  • OS: Ubuntu 22.04 / 24.04 e successive, Debian 12 e successive, Linux Mint / Pop!_OS / elementare / Zorin, Raspberry Pi OS 64-bit (Bookworm), Ubuntu per Raspberry Pi
  • Architettura: x86_64 / aarch64
  • Richiesto: systemd, nftables, iproute2 (ip neigh — il blocco ARP/NDP) (inserito automaticamente dalle dipendenze .deb / .rpm)
  • Opzionale: clamav (scansione malware), nmcli (rilevamento crittografia Wi-Fi), libnotify (notifiche desktop), wireguard-tools (il backend WireGuard del tunnel VPN + kill-switch, §4), tailscale (il suo backend Tailscale, §4), polkit / pkexec (esecuzione di un aggiornamento dalla GUI)
  • Non supportato: distribuzioni non systemd (Alpine/Void/Devuan)
  • Display: 1280×720 o superiore (la finestra e il carattere si adattano automaticamente alle dimensioni dello schermo, supportando piccoli display Raspberry Pi)

Appendice A

CassaScopoRete
serde/serde_jsonserializzazione di configurazione e IPCnessuno
Tokyoruntime asincrono (features = ["full"], ma vengono utilizzati solo socket Unix)nessuno (nessun TCP)
tracciamento/tracciamento-abbonatoregistrazione (locale/journald)nessuno
questo errore / comunquegestione degli errorinessuno
espressione regolareanalisi delle stringhe (diagnostica, ridimensionamento CSS)nessuno
URLAnalisi URL (euristica audit_url_safety)nessuno (non viene recuperato)
cronogestione data/oranessuno
ed25519-dalekverifica offline delle firme delle licenzenessuno
base64/sha2token di licenza, hash canarynessuno
libcchown / kill / chiamate di sistemanessuno
idnadecodifica host IDN/punycode per il rilevamento degli omografinessuno
nfq (solo demone)Attacchi NFQUEUE per la protezione del collegamento: pure Rust, AF_NETLINKnessuno (canale del verdetto, nessuna uscita)
apertochiama xdg-open per "Apri note di rilascio"il processo stesso non comunica
GTK3/ksni (solo app)GUI e vassoionessuno
ureq + rugginels (solo roamswitch-updater)quello HTTPS GET dell'aggiornamento quotidianol'unico stack HTTP/TLS nell'albero; confinato al binario di aggiornamento
Punto chiave

Nessun client HTTP, stack TLS o SDK di telemetria viene visualizzato in roamswitch-core, roamswitch-daemon, roamswitch-app, roamswitch-mcp o roamswitchkit. ureq + rustls sono presenti solo in roamswitch-updater (scripts/audit_no_network.sh lo impone in CI). Non esiste un SDK di telemetria da nessuna parte.

Appendice B

table inet roamswitch {                 # Firewall del profilo (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: tutto il resto viene scartato (drop)
    }
    chain output {
        type filter hook output priority -100; policy <accept|drop>;
        # policy drop solo durante l'Air-Gap; sono consentiti solo lo e ct established
    }
}

table inet roamswitch_linkguard {        # §4.5 — indipendente dalla tabella dei profili
    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 Guardia anomalie porte / isolamento manuale delle porte, tabella separata
    chain input {
        type filter hook input priority -10; policy accept;
        iif != "lo" tcp dport { … } drop
    }
}

table inet roamswitch_vpn {              # §4 Kill-switch del backend WireGuard
    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; … }  # simmetrico
}

table inet roamswitch_ts {               # §4 Kill-switch del backend Tailscale (più permissivo)
    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 (anche il lato v6 è simmetrico)
        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                    # Connessione diretta WireGuard
        tcp dport 443 accept                      # Fallback DERP
        ct state established,related accept
    }
    chain input  { type filter hook input priority -150; policy drop; … }  # simmetrico
}

Il pinning ARP/NDP del gateway / router IPv6 / risolutore DNS (§4) viene eseguito nella tabella dei vicini del kernel (ip neigh replace … nud permanent), non in nftables. Le voci appuntate vengono registrate in /var/lib/roamswitch/arp_lock.json.

Appendice C

Ogni affermazione contenuta in questo documento può essere verificata sul proprio computer. I comandi seguenti vengono eseguiti su un host con il pacchetto roamswitch installato.

C.1 Verifica del traffico in uscita

I binari demone/app/MCP non collegano alcuna libreria HTTP/TLS:

for b in roamswitch-daemon roamswitch-app roamswitch-mcp; do
  ldd "$(command -v $b)" | grep -iE 'ssl|crypto|nghttp|curl' && echo "  ^ in $b"
done
# → Nessun output. Lo stack HTTP/TLS è collegato staticamente solo a roamswitch-updater.

Il demone in esecuzione non contiene socket Internet:

sudo lsof -p "$(pgrep -x roamswitch-daemon)" -a -i
# → Nessun output = zero connessioni Internet TCP/UDP
sudo lsof -p "$(pgrep -x roamswitch-daemon)" -a -U | grep roamswitch
# → Solo /run/roamswitch/roamswitch.sock (la guardia link aggiunge un socket AF_NETLINK,
#   ma è un canale del kernel, non un socket internet)

L'unica uscita attribuibile a RoamSwitch è l'aggiornamento quotidiano:

watch -n 5 'sudo ss -tupn | grep -E "roamswitch-(daemon|app|mcp)" || echo "(none)"'
# → Sempre "(none)". Nessuno di questi tre apre mai un socket internet.
systemctl list-timers roamswitch-update.timer
sudo systemctl start roamswitch-update.service
journalctl -u roamswitch-update.service -n 20 --no-pager
# → Una singola richiesta HTTPS GET a lafine.net/updates/v1, poi termina.

Disabilitalo e conferma il silenzio totale:

sudo systemctl disable --now roamswitch-update.timer
# oppure modifica /var/lib/roamswitch/updates.json impostando "enabled": false
sudo strace -f -e trace=network -p "$(pgrep -x roamswitch-daemon)" 2>&1 | grep -i 'connect('
# → Si connette solo ad AF_UNIX / AF_NETLINK. AF_INET / AF_INET6 non compaiono mai.

C.2 Verifica della difesa riproducibile (Docker Test Suite)

Tutti i meccanismi di rilevamento, controllo e difesa di RoamSwitch (applicazione Air-Gap, autoriparazione dopo clobbering del firewall, manomissione canary ransomware, /tmp noexec, Yama LSM, intercettazione di phishing omografo e rilevamento di perdite di credenziali - 17 elementi in totale) possono essere riprodotti in modo sicuro e verificati al 100% in un contenitore isolato senza influire sulle reti o sui file host, utilizzando la suite di test Docker ufficiale fornita nel supporto pubblico repository (roamswitch-support

# Recupera e riproduci la suite di verifica (verifica automatizzata all'interno di un container isolato, usando il pacchetto di distribuzione ufficiale)
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

Il contenitore di test recupera automaticamente il pacchetto di distribuzione ufficiale dal repository APT (lafine.net/apt) e valuta ciascuno dei seguenti elementi di test sistematici (SP-1–11, PENT-1–7) all'interno di una rete isolata e monta lo spazio dei nomi.

(1) Difesa della rete autonoma e autoriparazione del gap aereo

IDScenarioMetodo di verificaCriterio di superamento
SP-3Abilitazione Air-Gap → caduta di uscitaInvia enable_air_gap IPCpolicy drop applicato al hook di uscita; tutto il traffico in uscita bloccato
SP-3bEliminazione forzata e autoriparazione del firewallElimina regole tramite nft delete table inet roamswitchL'autoguarigione anti-clobber ripristina le regole di caduta entro 5 secondi
SP-3cChiusura con errore al riavvio del demoneUccidi il demone (SIGKILL) a metà Air-Gap e riavviaLa politica di rilascio in uscita persiste senza interruzioni durante il riavvio
SP-3dRecupero Air-Gap autorizzatoInvia disable_air_gap IPC autorizzatoPolitica di rilascio revocata, tutti i file marcatori rimossi, uscita ripristinata
SP-8Blocco ARP/NDP preventivoAbilita in un ambiente gateway netns isolato → invia ARP gratuito falsificatoLa voce vicina al gateway rimane PERMANENT; ARP falsificato ignorato
SP-9Kill-switch VPN (WireGuard)Server Live WireGuard in reti separate, importa .confvpn_upL'handshake viene completato fino a inet roamswitch_vpn; zero perdite sulla morte del tunnel
SP-10Kill-switch VPN (Tailscale)Stub tailscale CLI + reti separate, tailscale0 IFTCP/80 con testo in chiaro fuori tunnel e DNS locale bloccati; DERP e MagicDNS sono consentiti

(2) Rafforzamento del kernel e del supporto

IDScenarioMetodo di verificaCriterio di superamento
SP-11aRafforzamento del sistema di reteEsegui apply_kernel_sysctl_hardening IPCrp_filter=1, tcp_syncookies=1, accept_redirects=0 raggiungono i valori target
SP-11bProtezione della memoria e Yama LSMVerifica ptrace_scope e suid_dumpablekernel.yama.ptrace_scope=1 (snooping dei blocchi), fs.suid_dumpable=0 (nessun core dump)
SP-11c/tmp & /dev/shm difesa noexecEsegui apply_mount_hardening IPC/tmp e /dev/shm rimontati noexec,nosuid,nodev; esecuzione negata
SP-11dEsecuzione dell'utente legittimo preservataEsegui script nella directory home standard (~/)Funziona senza ostacoli senza interrompere i flussi di lavoro legittimi di sviluppatore/amministratore

(3) Difesa e protezione da malware e ransomware multilivello

IDScenarioMetodo di verificaCriterio di superamento
SP-1Rilevamento manomissione CanaryTronca o rinomina il file canary esca (.xlsx) in ~/Documents/La manomissione viene rilevata in pochi secondi, attivando immediatamente l'Air-Gap
SP-2Rilevamento burst di crittografia in blocco ransomwareUn singolo processo genera rapidamente più file ad alta entropiaProcesso di lavoro incriminato congelato con SIGSTOP; L'Air-Gap è scattato
SP-2bNessun falso positivo su shredEsegui shred -n 3 -u sui file di testLa corrispondenza nell'elenco consentito impedisce il rilevamento o il blocco di falsi positivi
SP-2cProcessi critici mai congelatiConvalida la logica di congelamento della destinazione durante il rilevamento del burstI demoni critici (dockerd, systemd, containerd) non vengono mai bloccati
SP-4La stringa di test EICAR è di sola notificaScrivi la stringa di test EICAR in ~/Downloads/Nessuna notifica, solo una voce nella cronologia delle notifiche; il file non viene mai messo in quarantena automatica
SP-4bConferma prima la firma del malware realeScrivi una firma reale all'esterno delle cartelle controllateGenera la finestra di dialogo di approvazione modale; messo in quarantena solo previa conferma dell'utente
SP-4cRafforzamento delle autorizzazioni di Quarantine VaultIspezionare le autorizzazioni della directory del vault e dei file di esempioDirectory del vault impostata su 0700, campioni in quarantena impostati su 0400
SP-4dRipristino sicuro del file originale IPC privilegiatoInvia restore_quarantine_file IPCFile ripristinato nel percorso originale con autorizzazioni utente (0644) e aggiunto alle esclusioni

(4) Protezione passiva dei collegamenti e difesa dal phishing

IDScenarioMetodo di verificaCriterio di superamento
SP-7mode = block applicazione rigorosaConnettiti agli host elencati nei feed o blocklistExtraEliminato al livello TLS (analisi SNI); gli host sicuri non elencati raggiungono HTTP 200
SP-7bmode = warn attesa con chiusura in caso di erroreConnetti all'host di avviso senza risposta dell'utente (timeout 8 s)Rilascia i pacchetti al timeout (fail-closed); consentito solo previa esplicita approvazione
SP-7cmode = off smontaggio completoDisabilita la protezione del collegamentoLa tabella inet roamswitch_linkguard è stata completamente disinstallata

(5) Mitigazione USB difettosa e controllo del dispositivo

IDScenarioMetodo di verificaCriterio di superamento
SP-6Nonno della tastiera connessaControlla le tastiere collegate all'avvio del demoneDispositivi esistenti mantenuti; furono presi solo i successivi hot-plug

(6) Suite di test di penetrazione nell'ambiente Docker (17 controlli)

IDVettore di attaccoDettagli della simulazioneCriteri di difesa/rilevamento
PENT-1Esfiltrazione C2Tentativo di uscita da HTTP/TCP a C2 sotto Air-GapTutti i pacchetti vengono rilasciati su netfilter; zero perdite
PENT-1bCancellazione forzata del firmwareElimina regole con nft delete table inet roamswitchL'autoguarigione anti-clobber ripristina le regole in pochi secondi
PENT-1cRipristino sicuro del traferroProblema autenticato disable_air_gap IPCRegole di rilascio rimosse; marcatori cancellati; connettività ripristinata
PENT-2/tmp Porta sul retroEsegui lo script backdoor rilasciato in /tmpNegato dalla protezione del montaggio noexec (Permission denied)
PENT-2b/dev/shm Memoria condivisaEsegui il payload binario inserito in /dev/shmBloccato dalla difesa della cavalcatura noexec
PENT-2cPreservazione dello spazio utenteEsegui script nella directory utente legittima (/home/tester/)Esecuzione senza ostacoli; zero interruzioni del flusso di lavoro
PENT-3ptrace Snooping della memoriaPTRACE_ATTACH a cui mirare per estrarre segreti/tokenNegato da Yama LSM kernel.yama.ptrace_scope=1
PENT-3bRaschiatura segreta del core dumpAttiva l'arresto anomalo del processo per ottenere il core dump della memoriaImpedito da fs.suid_dumpable=0
PENT-4Manomissione delle CanarieFile esca per canarini zero-out in ~/Documents/Rilevamento in tempo reale di anomalie dimensionali e modifiche dell'hash
PENT-4bPulizia alla rinfusa delle CanarieEliminazione di massa dei file esca dei canariniLa scomparsa del file è stata rilevata immediatamente, sollevando un incidente
PENT-5Spoofing dell'indirizzo IPTrasmettere pacchetti con IP di origine falsificatoEliminato da rp_filter=1 (filtro percorso inverso)
PENT-5bSYN Flood DoSConnessioni TCP semiaperte inondateTabella degli stati protetta da tcp_syncookies=1
PENT-5cDirottamento del percorso ICMPIniettare pacchetti di reindirizzamento ICMP falsiIgnorato a causa di accept_redirects=0
PENT-6Phishing con omografo cirillicoPassare a gооgle.com (omografo cirillico)Identificato da LinkGuard, punteggio 40 (PERICOLOSO/blocco)
PENT-6bTraffico IP non elaborato e testo non crittografatoConnessione in uscita diretta all'IP non elaboratoAccuratamente contrassegnato come fattore di rischio per la sicurezza
PENT-7Perdita della chiave API OpenAIEsporre il token sk-proj-... nel codice o nei logRilevato tramite analisi entropica di Shannon e mascherato
PENT-7bPerdita di token GitHubEsporre ghp_... token personale nel codiceCorrispondente al modello di token e alla verifica entropica
PENT-8Prelazione LPE (Frag Gap) del kernelNon privilegiato unshare -U -r (tentativo CVE-2026-53362)Rifiutato immediatamente da user.max_user_namespaces = 0 (Operation not permitted)
PENT-9Sensore di minaccia eBPF e blocco del processoAvviso critico/di emergenza inviato tramite la presa Falco eBPFProcesso congelato tramite SIGSTOP entro millisecondi (stato: Ts); Air-Gap schierato

(7) Riepilogo dei test di penetrazione (Standalone Hardened vs. eBPF Enhanced)

Riepilogo dei risultati del test di penetrazione completo eseguito in un ambiente Docker isolato (destinazione: Ubuntu 24.04 con RoamSwitch Client Edition; Attaccante: Nmap / curl / hping3; vedere il rapporto ufficiale docs/CLIENT_PENTEST_REPORT.ja.md):

Categoria di verificaSenza Falco (Standalone Hardened)Con Falco (eBPF potenziato)Verdetto della difesa
Resistenza scansione porta esterna (Nmap SYN)PASS (Filtrato al 100% / DROP in Lockdown)PASS (Filtrato al 100% / DROP in Lockdown)Invisibilità esterna totale
Interruzione accesso diretto esterno (TCP/80, 3306)PASS (Eliminazione timeout/risposta zero)PASS (Eliminazione timeout/risposta zero)Esposizione in entrata zero
Mitigazione LPE del kernel (Frag Gap)PASS (unshare bloccato tramite sysctl)PASS (avviso eBPF + SIGSTOP congelamento + Air-Gap)Difesa in profondità verificata
Rilevamento porta non autorizzata (anomalia)PASS (0.0.0.0 vincolo contrassegnato con rischio ALTO)PASS (0.0.0.0 vincolo contrassegnato con rischio ALTO)100% rilevato e guidato
Prevenzione del sovraccarico del registro e del sovraccarico della CPUImpronta zero log (disinstallato)PASS (riduzione del rumore del 95% / buffer da 2 MB / limite di 50 MB)Ottimizzato per desktop

C.3 Limitazioni note

LimitazioneImpattoMitigazione
Su alcuni kernel, FAN_MARK_MOUNT su tmpfs (/tmp) non fornisce eventile scritture di file in /tmp non sono monitorate da fanotify/tmp è temporaneo e non è una cartella utente monitorata; il ransomware prende di mira ~/. Gli errori di contrassegno vengono registrati esplicitamente
Nessuna notifica di consegna su contenitori overlayfs/tmpfsIl rilevamento del burst di entropia all'interno del contenitore non può essere convalidatovalidato su hardware reale (ext4); il cablaggio salta automaticamente tramite una sonda
Le operazioni nftables di RoamSwitch condividono lo spazio netfilter con iptables-nft di DockerLe operazioni delle regole RoamSwitch possono interferire con le regole NAT di Dockerdocumentato come avvertimento operativo; isolato nella tabella dedicata inet roamswitch, ma le operazioni con l'intero set di regole come nft flush ruleset dovrebbero essere evitate
La protezione dei collegamenti vede il DoH di un browser solo tramite TLS SNI; Anche Encrypted Client Hello (ECH) nasconde questouna volta che ECH è stato ampiamente distribuito, una connessione che utilizza ECH a un sito che supporta ECH non è identificabile dal nome hostla blocklist locale e l'euristica agiscono ancora su DNS/HTTP e TLS non ECH; La protezione dalle minacce DNS (§4.5, opt-in) copre il percorso del risolutore
L'aggiornamento giornaliero dell'aggiornamento dipende dalla cadenza di rilascio quando updates.enabled = falsecon gli aggiornamenti disattivati, il feed è aggiornato solo quanto l'ultimo apt upgradei rilevamenti di gravità più elevata (omografo del marchio) non necessitano di feed; riattiva o abilita il DNS di protezione dalle minacce, per una copertura sempre aggiornata