§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).
| Principio | Dettaglio |
|---|---|
| Telemetria zero | Il 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 aggiornamenti | L'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 locale | Ogni 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 minimo | Le 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 chiuso | Air-Gap (isolamento di emergenza) sopravvive al riavvio del demone e viene ripristinato in pochi secondi se le sue regole vengono eliminate esternamente. |
| Licenza offline | Le 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
| Componente | Privilegio | Ruolo |
|---|---|---|
| roamswitch-daemon | radice (systemd, Type=notify + WatchdogSec=30) | Tutte operazioni privilegiate. In qualità di scrittore singolo, controlla nftables, DNS e unità systemd. |
| roamswitch-app | utente di accesso | GUI GTK3 + vassoio AppIndicator. Solo modifica e visualizzazione della configurazione; ogni azione privilegiata passa attraverso IPC. |
| roamswitch (CLI) | utente di accesso | Front-end a guscio sottile che utilizza lo stesso socket IPC. |
| roamswitch-mcp | processo generato dal client AI | stdio 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").
| Profilo | Situazione | comportamento di nftables |
|---|---|---|
| aperto (attendibile) | Una rete domestica o aziendale registrata | policy accept. Traffico locale consentito. |
| bilanciato | Non registrato ma configurato come relativamente sicuro | Rifiuta 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 registrata | Tutti 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_linkguardaggancia il percorsooutpute 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 suAF_NETLINK; il demone non associa alcun socket e non genera alcun pacchetto. Le regole della coda trasportanobypass, 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
Hostin 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 marchio | Altri segnali sospetti |
|---|---|---|
off | non ispezionato | non ispezionato |
warn | connessione mantenuta fino a 8 s + una richiesta di approvazione consenti/blocca | solo 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
.confda 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
.confe lo memorizza in/etc/wireguard/roamswitch.conf(0600, interfacciaroamswitch). Non può vivere altrove: il profilo AppArmorwg-quicksu Ubuntu 24.04+ / Debian 13 nega awg-quickdi leggere un.confall'esterno di/etc/wireguard/— anche come root. Una configurazione a tunnel diviso (AllowedIPsnon0.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 aoifname), 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 tramitegetent ahosts), quindi non vi è alcuna finestra di perdita. Sewg-quick upfallisce, il kill switch rimane alzato.
(B) Backend Tailscale
- Per gli utenti che già utilizzano Tailscale. RoamSwitch not esegue
tailscale up/ login / installtailscaled— leggetailscale status --jsoned eseguetailscale 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 CGNAT100.64.0.0/10efd7a: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 conip -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/shma livello di montaggio e/a livello di file system tramiteFAN_CLASS_CONTENT(fallbackFAN_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 unexecveeffettivo èFAN_DENYe solo quandopre_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_exclusionsconfigurato 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 in0644e 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 suFAN_OPEN_PERMbloccherebbe 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) richiamafreshclamin 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 applicauser.max_user_namespaces = 0(okernel.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(o2) impedisce ai processi non autorizzati di collegarsi tramiteptraceo 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 = 0impedisce ai processi sensibili che causano arresti anomali di scrivere dump della memoria in testo normale su disco. - __X6
/tmp&/dev/shmnoexecMount Defense — Per prevenire attacchi drop-and-execute del payload, RoamSwitch rimonta/tmpe/dev/shmconnoexec,nosuid,nodevquando 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à
CriticaloEmergency(come LPE del kernel, escape dello spazio dei nomi o esecuzione di ransomware), il daemon esegueSIGSTOPsul PID dannoso per sospendere immediatamente l'esecuzione del processo (stato:Ts), distribuiscepolicy dropsuinet 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.
- Filtro gravità (
- 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
0in/sys/bus/usb/devices/*/authorizedper 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 diauthorized=0su qualsiasi dispositivo che espone un'interfaccia HID (bInterfaceClass 03) e il demone autorizza nuovamente qualsiasi dispositivo HIDauthorized==0all'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
EVIOCGRABsu/dev/input/eventNdi quel dispositivo (solo i nodi con un gestorekbdin/proc/bus/input/devices, corrispondente a VID:PID). Il nodo del mouse è intatto. Questo è l'equivalente Linux di macOSCGEventTap; 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.jsone 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).
| Categoria | Elementi di esempio |
|---|---|
| Disco/avvio | Crittografia LUKS/dm-crypt, UEFI Secure Boot |
| Controllo degli accessi | LSM (AppArmor/SELinux), controllo SSH/sudo configurazione |
| Indurimento del nocciolo | rafforzamento del sysctl, disabilitazione degli spazi dei nomi degli utenti non privilegiati (mitigazione del Frag Gap), controllo core-dump, noexec su /tmp e /dev/shm |
| Aggiornamenti | configurazione automatica dell'aggiornamento di sicurezza |
| Rete | Monitoraggio spoofing ARP, stato di blocco ARP/NDP del gateway, controllo delle porte esposte, potenza della crittografia Wi-Fi |
| Malware | ClamAV / fanotify (controlla anche che la guardia sia effettivamente in esecuzione) / monitoraggio dell'entropia / noexec |
| Navigatore | Impostazioni di Navigazione sicura Firefox/Chrome/Chromium |
| DNS/USB | DNS 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.
| Strumento | Scopo |
|---|---|
| get_security_report | Valutazione in 24 elementi, punteggio, raccomandazioni |
| get_porte_esposte | porte esposte e il relativo stato di blocco del firewall |
| get_guard_status | livello di protezione attuale e stato del modulo di difesa |
| audit_url_sicurezza | analisi euristica della sicurezza dell'URL (non recupera il target) |
| audit_secrets | rilevamento di chiavi/segreti API nel testo (non trasmette il testo) |
| audit_security_logs | aggregazione di log journald/auth locali |
| get_quarantine_status / get_canary_status | quarantena e stato delle Canarie |
| get_app_help | ricerca della base di conoscenza integrata |
| run_active_vuln_scan | Verifica 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_scan | Confronta 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_languages | Confronta 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_fim | Ricalcola l'hash di circa 150 file di sistema critici e lo confronta con la baseline salvata per verificarne l'integrità. |
| get_file_scan_guard_status | Restituisce la configurazione del File Scan Guard (ClamAV) e lo stato del vault di quarantena che utilizza. |
| get_port_anomaly_incidents | Restituisce 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_incidents | Restituisce lo stato di isolamento attuale della guardia runtime eBPF e la cronologia degli incidenti all'origine. |
| get_resource_guard_incidents | Restituisce 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_history | Restituisce 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_timeline | Unisce 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
- 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 seroamswitch-core,roamswitch-daemon,roamswitch-app,roamswitch-mcporoamswitchkitinseriscereqwest/hyper/ureq/rustls/native-tls/opensslo se qualsiasi file.rsall'esternoroamswitch-updaterutilizzaTcpStream/TcpListener/UdpSocket/to_socket_addrs/lookup_host. - Ispezione dell'albero delle dipendenze: è stato cercato l'intero
Cargo.lockper SDK di telemetria/analisi/segnalazione di arresti anomali (sentry,opentelemetry, …). roamswitch-updaterreview: 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.- Enumerazione sottoprocessi: ogni sito di chiamata
Command::new(...)è stato esaminato.
9.2 Risultati
| Elemento di controllo | Risultato |
|---|---|
| Pila HTTP/TLS | Presente solo in roamswitch-updater (ureq + rustls). Non in core / daemon / app / mcp / kit |
| SDK di telemetria/analisi/segnalazione di arresti anomali | Non presente da nessuna parte |
TcpStream / TcpListener / UdpSocket | Nessuna volta fuori roamswitch-updater |
| API socket in uso | AF_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 quotidiano | Uno 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 licenza | Verifica della firma Ed25519 offline. Nessuna comunicazione con un server di attivazione |
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:
| # | Operazione | Destinazione | Innesco | Cosa viene inviato |
|---|---|---|---|---|
| 1 | Daily updater — GET /v1/manifest e il file del feed quando la sua versione è cambiata | lafine.net/updates/v1 (CDN) | systemd timer, una volta ogni ~24 ore con un ritardo casuale. Spento quando updates.enabled = false o roamswitch-update.timer è disabilitato | un semplice HTTPS GET: nessuna stringa di query, nessun cookie, generico User-Agent, niente sull'utente o sulla macchina. Riceve un manifest firmato + feed |
| 1a | freshclam (aggiornamento di ClamAV), richiamato dall'aggiornamento quotidiano quando ClamAV è installato | il CDN del progetto ClamAV | come parte del numero 1 | traffico dello stesso ClamAV (un progetto separato); RoamSwitch lo avvia solo |
| 2 | ping -c1 -W1 | il gateway predefinito della LAN (link-local) | per aggiornare la cache ARP durante il rilevamento dello spoofing ARP | Solo richiesta eco ICMP. Nessuna risoluzione DNS, nessun carico utile |
| 3 | avviando 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 |
| 4 | risolverectl 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 sentinella | cambia solo l'impostazione del risolutore del sistema operativo; RoamSwitch stesso non invia alcuna query DNS |
| 5 | aggiornamenti del gestore pacchetti | i repository apt/dnf/zypper della distribuzione | quando 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 |
| 6 | VPN tunnel (§4) — Backend WireGuard: il tunnel wg-quick crea / Backend Tailscale: tailscale set --exit-node instrada tutto il traffico attraverso il nodo di uscita | l'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 predefinita | traffico 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.jsone 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
| Edizione | Per | Prezzo | Licenza |
|---|---|---|---|
| Edizione comunitaria | Uso personale di Linux | Gratuito | Freeware proprietario (EULA in bundle) |
| Business (pianificato) | Gestione flotta, distribuzione polizze, apt interno firmato, SLA per organizzazioni | Pagato | Licenza commerciale. Stesso binario + cancello di livello |
Gli acquirenti di macOS RoamSwitch Pro Lifetime ricevono funzionalità Business gratuite sulle proprie macchine Linux.
Distribuzione e filiera
| Canale | Dettaglio |
|---|---|
| APP | https://lafine.net/apt (stable main). Release firmato con una chiave RSA-4096 |
| giri al minuto | https://lafine.net/rpm (Fedora / openSUSE separato). repomd.xml Firmato GPG |
| AUR | roamswitch-bin (recupera il tarball delle versioni GitHub, verifica sha256) |
| tarball | amd64 / 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:
GET https://lafine.net/updates/v1/manifeste la sua firma staccata.- 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.
- 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).
- Se ClamAV è installato, invoca
freshclam. - 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
| Cassa | Scopo | Rete |
|---|---|---|
| serde/serde_json | serializzazione di configurazione e IPC | nessuno |
| Tokyo | runtime asincrono (features = ["full"], ma vengono utilizzati solo socket Unix) | nessuno (nessun TCP) |
| tracciamento/tracciamento-abbonato | registrazione (locale/journald) | nessuno |
| questo errore / comunque | gestione degli errori | nessuno |
| espressione regolare | analisi delle stringhe (diagnostica, ridimensionamento CSS) | nessuno |
| URL | Analisi URL (euristica audit_url_safety) | nessuno (non viene recuperato) |
| crono | gestione data/ora | nessuno |
| ed25519-dalek | verifica offline delle firme delle licenze | nessuno |
| base64/sha2 | token di licenza, hash canary | nessuno |
| libc | chown / kill / chiamate di sistema | nessuno |
| idna | decodifica host IDN/punycode per il rilevamento degli omografi | nessuno |
| nfq (solo demone) | Attacchi NFQUEUE per la protezione del collegamento: pure Rust, AF_NETLINK | nessuno (canale del verdetto, nessuna uscita) |
| aperto | chiama xdg-open per "Apri note di rilascio" | il processo stesso non comunica |
| GTK3/ksni (solo app) | GUI e vassoio | nessuno |
| ureq + rugginels (solo roamswitch-updater) | quello HTTPS GET dell'aggiornamento quotidiano | l'unico stack HTTP/TLS nell'albero; confinato al binario di aggiornamento |
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
| ID | Scenario | Metodo di verifica | Criterio di superamento |
|---|---|---|---|
| SP-3 | Abilitazione Air-Gap → caduta di uscita | Invia enable_air_gap IPC | policy drop applicato al hook di uscita; tutto il traffico in uscita bloccato |
| SP-3b | Eliminazione forzata e autoriparazione del firewall | Elimina regole tramite nft delete table inet roamswitch | L'autoguarigione anti-clobber ripristina le regole di caduta entro 5 secondi |
| SP-3c | Chiusura con errore al riavvio del demone | Uccidi il demone (SIGKILL) a metà Air-Gap e riavvia | La politica di rilascio in uscita persiste senza interruzioni durante il riavvio |
| SP-3d | Recupero Air-Gap autorizzato | Invia disable_air_gap IPC autorizzato | Politica di rilascio revocata, tutti i file marcatori rimossi, uscita ripristinata |
| SP-8 | Blocco ARP/NDP preventivo | Abilita in un ambiente gateway netns isolato → invia ARP gratuito falsificato | La voce vicina al gateway rimane PERMANENT; ARP falsificato ignorato |
| SP-9 | Kill-switch VPN (WireGuard) | Server Live WireGuard in reti separate, importa .conf → vpn_up | L'handshake viene completato fino a inet roamswitch_vpn; zero perdite sulla morte del tunnel |
| SP-10 | Kill-switch VPN (Tailscale) | Stub tailscale CLI + reti separate, tailscale0 IF | TCP/80 con testo in chiaro fuori tunnel e DNS locale bloccati; DERP e MagicDNS sono consentiti |
(2) Rafforzamento del kernel e del supporto
| ID | Scenario | Metodo di verifica | Criterio di superamento |
|---|---|---|---|
| SP-11a | Rafforzamento del sistema di rete | Esegui apply_kernel_sysctl_hardening IPC | rp_filter=1, tcp_syncookies=1, accept_redirects=0 raggiungono i valori target |
| SP-11b | Protezione della memoria e Yama LSM | Verifica ptrace_scope e suid_dumpable | kernel.yama.ptrace_scope=1 (snooping dei blocchi), fs.suid_dumpable=0 (nessun core dump) |
| SP-11c | /tmp & /dev/shm difesa noexec | Esegui apply_mount_hardening IPC | /tmp e /dev/shm rimontati noexec,nosuid,nodev; esecuzione negata |
| SP-11d | Esecuzione dell'utente legittimo preservata | Esegui 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
| ID | Scenario | Metodo di verifica | Criterio di superamento |
|---|---|---|---|
| SP-1 | Rilevamento manomissione Canary | Tronca o rinomina il file canary esca (.xlsx) in ~/Documents/ | La manomissione viene rilevata in pochi secondi, attivando immediatamente l'Air-Gap |
| SP-2 | Rilevamento burst di crittografia in blocco ransomware | Un singolo processo genera rapidamente più file ad alta entropia | Processo di lavoro incriminato congelato con SIGSTOP; L'Air-Gap è scattato |
| SP-2b | Nessun falso positivo su shred | Esegui shred -n 3 -u sui file di test | La corrispondenza nell'elenco consentito impedisce il rilevamento o il blocco di falsi positivi |
| SP-2c | Processi critici mai congelati | Convalida la logica di congelamento della destinazione durante il rilevamento del burst | I demoni critici (dockerd, systemd, containerd) non vengono mai bloccati |
| SP-4 | La stringa di test EICAR è di sola notifica | Scrivi 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-4b | Conferma prima la firma del malware reale | Scrivi una firma reale all'esterno delle cartelle controllate | Genera la finestra di dialogo di approvazione modale; messo in quarantena solo previa conferma dell'utente |
| SP-4c | Rafforzamento delle autorizzazioni di Quarantine Vault | Ispezionare le autorizzazioni della directory del vault e dei file di esempio | Directory del vault impostata su 0700, campioni in quarantena impostati su 0400 |
| SP-4d | Ripristino sicuro del file originale IPC privilegiato | Invia restore_quarantine_file IPC | File ripristinato nel percorso originale con autorizzazioni utente (0644) e aggiunto alle esclusioni |
(4) Protezione passiva dei collegamenti e difesa dal phishing
| ID | Scenario | Metodo di verifica | Criterio di superamento |
|---|---|---|---|
| SP-7 | mode = block applicazione rigorosa | Connettiti agli host elencati nei feed o blocklistExtra | Eliminato al livello TLS (analisi SNI); gli host sicuri non elencati raggiungono HTTP 200 |
| SP-7b | mode = warn attesa con chiusura in caso di errore | Connetti all'host di avviso senza risposta dell'utente (timeout 8 s) | Rilascia i pacchetti al timeout (fail-closed); consentito solo previa esplicita approvazione |
| SP-7c | mode = off smontaggio completo | Disabilita la protezione del collegamento | La tabella inet roamswitch_linkguard è stata completamente disinstallata |
(5) Mitigazione USB difettosa e controllo del dispositivo
| ID | Scenario | Metodo di verifica | Criterio di superamento |
|---|---|---|---|
| SP-6 | Nonno della tastiera connessa | Controlla le tastiere collegate all'avvio del demone | Dispositivi esistenti mantenuti; furono presi solo i successivi hot-plug |
(6) Suite di test di penetrazione nell'ambiente Docker (17 controlli)
| ID | Vettore di attacco | Dettagli della simulazione | Criteri di difesa/rilevamento |
|---|---|---|---|
| PENT-1 | Esfiltrazione C2 | Tentativo di uscita da HTTP/TCP a C2 sotto Air-Gap | Tutti i pacchetti vengono rilasciati su netfilter; zero perdite |
| PENT-1b | Cancellazione forzata del firmware | Elimina regole con nft delete table inet roamswitch | L'autoguarigione anti-clobber ripristina le regole in pochi secondi |
| PENT-1c | Ripristino sicuro del traferro | Problema autenticato disable_air_gap IPC | Regole di rilascio rimosse; marcatori cancellati; connettività ripristinata |
| PENT-2 | /tmp Porta sul retro | Esegui lo script backdoor rilasciato in /tmp | Negato dalla protezione del montaggio noexec (Permission denied) |
| PENT-2b | /dev/shm Memoria condivisa | Esegui il payload binario inserito in /dev/shm | Bloccato dalla difesa della cavalcatura noexec |
| PENT-2c | Preservazione dello spazio utente | Esegui script nella directory utente legittima (/home/tester/) | Esecuzione senza ostacoli; zero interruzioni del flusso di lavoro |
| PENT-3 | ptrace Snooping della memoria | PTRACE_ATTACH a cui mirare per estrarre segreti/token | Negato da Yama LSM kernel.yama.ptrace_scope=1 |
| PENT-3b | Raschiatura segreta del core dump | Attiva l'arresto anomalo del processo per ottenere il core dump della memoria | Impedito da fs.suid_dumpable=0 |
| PENT-4 | Manomissione delle Canarie | File esca per canarini zero-out in ~/Documents/ | Rilevamento in tempo reale di anomalie dimensionali e modifiche dell'hash |
| PENT-4b | Pulizia alla rinfusa delle Canarie | Eliminazione di massa dei file esca dei canarini | La scomparsa del file è stata rilevata immediatamente, sollevando un incidente |
| PENT-5 | Spoofing dell'indirizzo IP | Trasmettere pacchetti con IP di origine falsificato | Eliminato da rp_filter=1 (filtro percorso inverso) |
| PENT-5b | SYN Flood DoS | Connessioni TCP semiaperte inondate | Tabella degli stati protetta da tcp_syncookies=1 |
| PENT-5c | Dirottamento del percorso ICMP | Iniettare pacchetti di reindirizzamento ICMP falsi | Ignorato a causa di accept_redirects=0 |
| PENT-6 | Phishing con omografo cirillico | Passare a gооgle.com (omografo cirillico) | Identificato da LinkGuard, punteggio 40 (PERICOLOSO/blocco) |
| PENT-6b | Traffico IP non elaborato e testo non crittografato | Connessione in uscita diretta all'IP non elaborato | Accuratamente contrassegnato come fattore di rischio per la sicurezza |
| PENT-7 | Perdita della chiave API OpenAI | Esporre il token sk-proj-... nel codice o nei log | Rilevato tramite analisi entropica di Shannon e mascherato |
| PENT-7b | Perdita di token GitHub | Esporre ghp_... token personale nel codice | Corrispondente al modello di token e alla verifica entropica |
| PENT-8 | Prelazione LPE (Frag Gap) del kernel | Non privilegiato unshare -U -r (tentativo CVE-2026-53362) | Rifiutato immediatamente da user.max_user_namespaces = 0 (Operation not permitted) |
| PENT-9 | Sensore di minaccia eBPF e blocco del processo | Avviso critico/di emergenza inviato tramite la presa Falco eBPF | Processo 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 verifica | Senza 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 CPU | Impronta zero log (disinstallato) | PASS (riduzione del rumore del 95% / buffer da 2 MB / limite di 50 MB) | Ottimizzato per desktop |
C.3 Limitazioni note
| Limitazione | Impatto | Mitigazione |
|---|---|---|
Su alcuni kernel, FAN_MARK_MOUNT su tmpfs (/tmp) non fornisce eventi | le 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/tmpfs | Il rilevamento del burst di entropia all'interno del contenitore non può essere convalidato | validato su hardware reale (ext4); il cablaggio salta automaticamente tramite una sonda |
Le operazioni nftables di RoamSwitch condividono lo spazio netfilter con iptables-nft di Docker | Le operazioni delle regole RoamSwitch possono interferire con le regole NAT di Docker | documentato 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 questo | una volta che ECH è stato ampiamente distribuito, una connessione che utilizza ECH a un sito che supporta ECH non è identificabile dal nome host | la 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 = false | con gli aggiornamenti disattivati, il feed è aggiornato solo quanto l'ultimo apt upgrade | i 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 |