Lafine Systems Conception · Document technique

RoamSwitch pour Linux
Livre blanc sur l'architecture et la sécurité

Un document technique expliquant ce que RoamSwitch pour Linux fait au niveau de sa limite de privilèges. Cela évite le langage marketing ; les réclamations peuvent être vérifiées par rapport au comportement réel du package distribué et à l'auto-vérification en annexe.

Version v1.6.0 Champ d'application RoamSwitch for Linux 1.1.0 (durcissement LPE du noyau / protection runtime eBPF / gel SIGSTOP des processus attaquants / optimisation à faible surcharge de Falco) Prérequis systemd + nftables Publié 2026-09-06

§1

RoamSwitch pour Linux est une application résidente de sécurité réseau et de diagnostic système qui apporte le modèle de défense réseau sans confiance de macOS RoamSwitch à Linux (environnements systemd + nftables).

Cette édition cible machines client (postes de travail, ordinateurs portables, ordinateurs monocarte) et suppose un comportement autonome qui suit la machine lorsqu'elle se déplace entre les réseaux. Une édition serveur/infrastructure sans tête renforcée (RoamSwitch Server Edition — refus par défaut permanent, intégrité FIM du chemin critique, webhooks à distance et application de politiques statiques) est fournie sous la forme d'une version de serveur dédiée.

Il identifie le réseau Wi-Fi/filaire connecté par son adresse MAC de passerelle et commute de manière autonome le profil de pare-feu nftables actif. En plus de cela, il fournit trois couches de défense de type « man-in-the-middle » sur les réseaux non fiables : un tunnel VPN + un kill-switch (WireGuard ou Tailscale, la défense principale), un verrouillage ARP/NDP préventif et Détection d'usurpation d'identité ARP — ainsi qu'une détection comportementale des ransomwares (fanotify + Shannon entropy + canaries), une protection de lien passive qui signale ou bloque les connexions de phishing (NFQUEUE + SNI), une protection contre les anomalies de port, une atténuation BadUSB, une préemption d'élévation de privilèges locaux (LPE) du noyau (atténuation Frag Gap CVE-2026-53362) , intégration du capteur de menace d'exécution eBPF (Falco / Tetragon) avec gel des processus en moins d'une seconde (SIGSTOP) et réseau Air-Gap isolation, une évaluation de l'état de sécurité en 24 éléments et un serveur MCP (Model Context Protocol) intégré.

Ce livre blanc décrit l'architecture, le modèle de menace et la conception de chaque mécanisme de défense – et, en particulier, comment le principe du « traitement entièrement local ; la seule chose envoyée depuis la machine est une demande de données de détection signées, ne contenant rien sur vous » est garanti au niveau du code. Cela évite le langage marketing ; les réclamations peuvent être vérifiées par rapport au comportement réel du package distribué (binaire) et à l'auto-vérification en annexe. RoamSwitch pour Linux est un logiciel gratuit propriétaire et son code source n'est pas publié (§11).

Principes de conception
PrincipeDétail
Zéro télémétrieLe produit n'envoie rien sur vous ou votre machine à qui que ce soit. Il n'y a pas de télémétrie, d'analyse, de rapport d'erreur, de métriques d'utilisation, de configuration à distance ou de serveur d'activation de licence.
Recevoir uniquement les mises à jourLa seule demande sortante effectuée par le produit est un GET une fois par jour d'un manifeste fixe et signé de lafine.net/updates/v1 - la liste des sites frauduleux pour le Link Guard, la version de signature ClamAV, la dernière version de l'application, les cartes CVE des paquets (Homebrew/npm/PyPI/crates.io/RubyGems/Packagist/Go/Maven), la carte CVE de la vérification active des vulnérabilités, ainsi que la liste des noms de paquets npm populaires utilisée pour la détection de typosquatting. Il ne contient aucune chaîne de requête, aucun cookie, aucun en-tête d'identification et aucune information vous concernant. updates.enabled = false l'éteint complètement ; le produit fonctionne ensuite sur des données groupées sans aucun contact externe.
Traitement entièrement localChaque évaluation, détection et audit s'exécute jusqu'à son terme sur la machine locale. L'analyse de la sécurité des URL et l'analyse secrète évaluent leurs entrées de manière heuristique sans les transmettre nulle part.
Moin de privilègeLes opérations privilégiées sont confinées à un démon root ; l'interface utilisateur, la CLI et le serveur MCP les demandent via un IPC de socket de domaine Unix. Le démon n'ouvre aucun socket TCP/UDP ; le Link Guard utilise uniquement le canal de verdict AF_NETLINK NFQUEUE (noyau ↔ espace utilisateur, pas de sortie de paquet).
Échec ferméAir-Gap (isolation d'urgence) survit à un redémarrage du démon et est réaffirmé en quelques secondes si ses règles sont supprimées de l'extérieur.
Licence hors ligneLes licences Pro/Business sont vérifiées uniquement par la vérification de signature Ed25519. Aucun appel à un serveur d'activation n'a lieu.

§2

RoamSwitch pour Linux cible principalement les ordinateurs portables/stations de travail mobiles qui se déplacent entre des réseaux non fiables.

Attaquants visés

  • Un attaquant sur le même LAN — analyse de port sur le Wi-Fi partagé, usurpation d'identité ARP/NDP (y compris les publicités de routeur malveillantes) à la recherche d'un homme du milieu, DHCP malveillant, détection passive après une inondation MAC, accès non autorisé à un serveur de développement ou à une API LLM locale accidentellement liée à 0.0.0.0.
  • Périphériques USB malveillants (BadUSB) — usurpant l'identité d'un clavier et injectant des frappes avant le verrouillage de l'écran ; stockage de masse USB non enregistré pour l'exfiltration de données ou pour transporter des logiciels malveillants.
  • Ransomware / malware sans fichier — entrant via un fichier téléchargé et cryptant en masse les documents de l'utilisateur.
  • C2 basé sur DNS et phishing — malware utilisant la résolution de nom pour atteindre un serveur C2 ou un site de phishing.

Hors de portée

  • Un attaquant qui détient déjà racine ; rootkits au niveau du noyau ou du micrologiciel.
  • Attaques qui suppriment physiquement le disque (le domaine du chiffrement complet du disque ; RoamSwitch diagnostique si le chiffrement est présent mais ne chiffre pas).
  • Contrôle de partage sans fil de proximité de type AirDrop (pas de mécanisme natif du système d'exploitation sous Linux ; non pris en charge).

§3

RoamSwitch pour Linux est implémenté dans Rust sur sept caisses. Toutes les communications avec le démon passent par /run/roamswitch/roamswitch.sock (un socket de domaine Unix). Il n'y a pas de socket TCP/UDP d'écoute dans le démon, l'application ou le serveur MCP. La seule chose que l'application binds est un seul socket Unix pour empêcher une deuxième instance.

# Espace utilisateur (non privilégié)
roamswitch-app      Icône GTK3 + AppIndicator
roamswitch (CLI)    Frontend shell léger
roamswitch-mcp      stdio JSON-RPC (lancé par les clients IA)
      │
      │  AF_UNIX  /run/roamswitch/roamswitch.sock  (IPC local uniquement)
      ▼
roamswitch-daemon   root / systemd Type=notify + WatchdogSec=30
  · Contrôle des profils nftables (table inet roamswitch)
  · Boucle sentinelle (détection réseau et application des profils)
  · Tunnel VPN + coupe-circuit (WireGuard : wg-quick / roamswitch_vpn, Tailscale : roamswitch_ts)
  · Verrouillage préventif ARP/NDP (fixation de la table neigh) / détection
  · Garde d'anomalie de port (roamswitch_dev_guard)
  · Garde fanotify (ransomware / malware)
  · Garde de lien (NFQUEUE — inet roamswitch_linkguard)
  · Moteur de canari / Vault de quarantaine
  · Durcissement LPE du noyau (désactivation userns, Yama LSM)
  · Intégration runtime eBPF (/var/run/roamswitch/events.sock)
  · Gel SIGSTOP des processus attaquants à la milliseconde & couplage Air-Gap
  · Surveillance USB (evdev EVIOCGRAB — BadUSB) / file d'approbation
  · Vérification de licence Ed25519

roamswitch-updater  Un assistant de minuterie systemd autonome. Le seul crate
                    avec une pile HTTP/TLS (GET quotidien d'un manifeste signé)
roamswitch-core     Bibliothèque de logique pure (partagée par tous les crates)
roamswitchkit       SDK client MCP
Séparation privilégiée
ComposantPrivilègeRôle
démon roamswitchracine (systemd, Type=notify + WatchdogSec=30)Toutes opérations privilégiées. En tant qu'écrivain unique, contrôle les unités nftables, DNS et systemd.
application roamswitchutilisateur de connexionInterface graphique GTK3 + plateau AppIndicator. Édition et visualisation de la configuration uniquement ; chaque action privilégiée passe par IPC.
commutateur itinérant (CLI)utilisateur de connexionFront-end à coque fine utilisant le même socket IPC.
roamswitch-mcpprocessus généré par le client IAstdio JSON-RPC. Fournit des informations de diagnostic en lecture seule.

Toutes les communications avec le démon passent par /run/roamswitch/roamswitch.sock (un répertoire avec des autorisations équivalentes à 0700). La configuration utilisateur est stockée sous forme de texte brut JSON à ~/.config/roamswitch/config.json. Le démon lit /home/*/.config/roamswitch/config.json avec les privilèges root (il s'exécute avec HOME=/root). La configuration ne quitte jamais la machine ; il n'y a pas d'enregistrement de compte ni de synchronisation cloud.

§4

La boucle sentinelle (cycle de 5 secondes par défaut) lit le MAC de la passerelle par défaut à partir de /proc/net/arp et ip neigh et le compare aux MAC enregistrés dans config.json. MAC est utilisé plutôt que SSID car un SSID est usurpé de manière triviale. La notification sur le bureau affichée lorsque le profil change indique la raison pour le changement (« un réseau non enregistré » / « votre paramètre pour le réseau X enregistré » / « aucune connexion réseau »).

Profils
ProfilSituationcomportement des nftables
ouvert (de confiance)Un réseau domestique ou d'entreprise enregistrépolicy accept. Circulation locale autorisée.
équilibréNon enregistré mais configuré comme relativement sûrRefus par défaut entrant. Seules les connexions établies et lo sont autorisées ; L'exposition aux ports exposés est surveillée.
verrouillage (protection contre les absences)Wi-Fi public/réseau non enregistréTous les paquets entrants ont été supprimés furtivement. Services de partage arrêtés automatiquement (opt-in).

Toutes les règles sont isolées dans une table nftables dédiée nommée inet roamswitch et n'entrent jamais en collision avec une autre configuration de pare-feu (ufw / pare-feu). L'expiration du remplacement manuel (1 heure/2 heures/4 heures/jusqu'à minuit/jusqu'à effacement/jusqu'à la prochaine déconnexion) est appliquée par le démon en tant qu'écrivain unique. L'interface graphique n'écrit jamais d'expiration ; il relit le config.json que le démon a réécrit au tick suivant et le reflète dans l'interface utilisateur (en évitant un conflit).

Air-Gap (isolation d'urgence du réseau)

Un mode d'isolation totale qui définit policy drop (priorité -100) sur les hooks d'entrée et de sortie de la table inet roamswitch, autorisant uniquement lo.

  • Fail fermé — au redémarrage du démon, la détection du fichier marqueur (/run/roamswitch/airgap.active) réaffirme l'isolement.
  • Auto-guérison — si un processus externe supprime les règles avec nft delete table, la boucle sentinelle s'applique à nouveau en quelques secondes.
  • Expiration automatique — 600 secondes après l'activation (identique au macOS maxAirGapDuration), l'isolement se lève automatiquement, évitant ainsi une perte permanente de connectivité due à un mauvais clic.
table inet roamswitch {
    chain input {
        type filter hook input priority -100; policy <accept|drop>;
        iif "lo" accept
        ct state established,related accept
        # balanced/lockdown : tout le reste est droppé
    }
    chain output {
        type filter hook output priority -100; policy <accept|drop>;
        # policy drop uniquement pendant l'Air-Gap ; seuls lo et ct established sont autorisés
    }
}

Protection de lien passive (détection de connexion par phishing)

Le démon surveille où vont les connexions sortantes et signale – ou, pour le groupe restreint de « clairement phishing », bloque – les connexions vers des hôtes dangereux. Il remplace l'ancien vérificateur coller une URL, qui obligeait l'utilisateur à agir.

  • Interception — une table nftables dédiée inet roamswitch_linkguard connecte le chemin output et met en file d'attente les questions DNS et les nouvelles/premières connexions Web à un travailleur de l'espace utilisateur via NFQUEUE. NFQUEUE est un canal de verdict noyau↔espace utilisateur sur AF_NETLINK ; le démon ne lie aucune socket et ne génère aucun paquet. Les règles de file d'attente portent bypass, donc si le travailleur ne court pas, le trafic passe sans entrave (Air-Gap reste l'arrêt dur séparé).
  • Hostname sources — le nom de la question DNS, le TLS ClientHello SNI (donc un navigateur utilisant DoH est toujours couvert par le nom d'hôte) et l'en-tête HTTP Host en texte brut. Encrypted ClientHello (ECH), autrefois largement déployé, est un angle mort connu.
  • Verdict (roamswitch-core, logique pure) — un hôte est comparé au flux local de phishing/menace et à un ensemble d'heuristiques hors ligne : IDN/homographe prêt à confusion d'une marque protégée, jeton de marque dans un domaine non officiel, hôte IP brut, TLD à haut risque.
Mode (linkGuard.mode)Coup de fil ou homographe de marqueAutres signaux suspects
offnon inspecténon inspecté
warnconnexion maintenue jusqu'à 8 s + une invite d'approbation d'autorisation/blocagenotification uniquement
block (par défaut)connexion abandonnée + une boîte de dialogue d'autorisation (une fois par hôte)notification uniquement

Seul un accès à un flux ou un hôte d'homographe de marque est bloqué en dur ; tout ce que l'heuristique signale à elle seule est un avertissement. Le mode warn maintient la connexion à un hôte dangereux pendant 8 secondes maximum pendant qu'il le demande à l'utilisateur ; si la mise en attente expire sans réponse, c'est fail-closed (les paquets sont abandonnés et le verdict n'est pas mis en cache) — ne répond pas « ce site est-il OK ? » ne doit pas signifier « oui », et la prochaine tentative vous demandera à nouveau. Le mode block affiche une notification et une boîte de dialogue d'autorisation par hôte (un navigateur ouvrant de nombreuses connexions au même hôte bloqué n'inonde plus les notifications). Dans une boîte de dialogue d'approbation dangereuse, le bouton par défaut est « Continuer le blocage » et « Autoriser » est conçu comme le choix silencieux, autre que celui par défaut. Un hôte bloqué peut être autorisé de manière permanente ou pendant cinq minutes à compter de la notification (linkGuard.allowlist).

DNS est inspecté, jamais contrefait : une question DNS sur liste noire produit uniquement une notification ; l'application se produit lors de la connexion TCP suivante, donc RoamSwitch n'injecte jamais de réponse DNS synthétique. Le feed est une liste compilée de domaines de phishing/arnaque, livrée dans le package et actualisée par le programme de mise à jour quotidien (§11). En l’absence de flux, l’heuristique hors ligne s’exécute toujours. La signature Ed25519 du fichier de flux est vérifiée avant le chargement ; un flux défectueux ou manquant ne parvient pas à « uniquement heuristique », mais jamais à « tout autoriser ».

Tunnel VPN + kill-switch (la principale défense MITM)

Protection anti-MITM qui ne dépend pas de l'intégrité de la couche 2. Sur un réseau non fiable, un tunnel chiffré permanent vers un point de terminaison approuvé rend l'usurpation d'identité ARP/NDP locale, le DHCP malveillant et le reniflage passif inutiles : l'attaquant ne voit que le texte chiffré. Le verrouillage ARP/NDP et la détection ci-dessous sont secondaires à cette fonctionnalité.

Deux backends parmi lesquels choisir — « WireGuard (fichier de configuration) » ou « Tailscale (nœud de sortie) ». RoamSwitch n'implémente aucune cryptographie propre et n'est pas un fournisseur VPN. Les deux backends sont des dépendances facultatives ; en cas d'absence, l'interface graphique affiche la commande d'installation.

(A) Back-end WireGuard

  • Aucun serveur VPN n'est fourni — utilise une configuration WireGuard fournie par l'utilisateur : un .conf d'un fournisseur tel que Mullvad, IVPN ou Proton VPN, ou le propre serveur WireGuard de l'utilisateur (un VPS ou un serveur domestique). Aucune configuration par défaut n'est livrée.
  • Config — le démon valide le .conf et le stocke dans /etc/wireguard/roamswitch.conf (0600, interface roamswitch). Il ne peut pas vivre ailleurs : le profil AppArmor wg-quick sur Ubuntu 24.04+ / Debian 13 refuse à wg-quick de lire un .conf en dehors de /etc/wireguard/ — même en tant que root. Une configuration de tunnel divisé (AllowedIPs et non 0.0.0.0/0 / ::/0) est signalée comme « tout le trafic n'est pas protégé ».
  • Kill-switch — une table nftables dédiée inet roamswitch_vpn (policy drop, les deux hooks) supprime tout sauf le bouclage, l'interface du tunnel (roamswitch, correspondant à oifname), UDP vers l'IP du point de terminaison épinglé, DHCP et ICMP. Il est installé avant que le tunnel soit activé (le point de terminaison est résolu en adresses IP fixes via getent ahosts en premier), il n'y a donc pas de fenêtre de fuite. Si wg-quick up échoue, le kill-switch reste actif.

(B) Backend Tailscale

  • Pour les utilisateurs qui exécutent déjà Tailscale. RoamSwitch not exécute tailscale up / se connecte / installe tailscaled — il lit tailscale status --json et exécute tailscale set --exit-node=<node> / --exit-node= (clair).
  • Un nœud de sortie est requis — la protection anti-MITM n'est valable qu'avec un nœud de sortie qui achemine tout le trafic. Si aucune n'est configurée, la protection n'est pas armée et l'interface utilisateur avertit « non protégé ». Si le nœud choisi se déconnecte, la protection est automatiquement désarmée et l'utilisateur averti (tout router via un nœud mort entraînerait un trou noir dans la connexion).
  • Kill-switch (inet roamswitch_ts, policy drop) — Le transport de Tailscale ne peut pas être épinglé à une seule adresse IP de point final (relais DERP + homologues itinérants), il est donc plus lâche que celui de WireGuard. Il permet : le bouclage, l'interface tunnel (tailscale0), les gammes CGNAT 100.64.0.0/10 et fd7a:115c:a1e0::/48, STUN (udp/3478), DERP (tcp/443), udp/41641, DHCP, ICMP, MagicDNS (100.100.100.100:53), les connexions établies. Tout le reste (UDP arbitraire, DNS vers un résolveur local, SMB, mDNS, HTTP en texte brut, TCP arbitraire) est supprimé.
  • Kill-switch mises en garde — (1) liste blanche plus large que le backend WireGuard (udp/3478, tcp/443, l'ensemble du CGNAT /10). (2) Un attaquant sur le chemin voit toujours les métadonnées (que Tailscale est utilisé, la région DERP, le timing) et peut les supprimer/retarder – mais ne peut pas lire la charge utile tunnelisée. (3) Lorsque l'UDP direct est bloqué, la confidentialité repose alors sur le DERP TLS à certificat épinglé de Tailscale. (4) Avec MagicDNS désactivé + un résolveur local, le DNS s'interrompt lorsqu'il est armé (avertissement de l'interface utilisateur). (5) Les portails captifs doivent être connectés avant d'être activés.

Common — armé uniquement lorsque vpn_on_untrusted_enabled et que le réseau n'est pas fiable (level != open). Sur un réseau de confiance, le nœud de sortie est effacé et le kill-switch supprimé (jamais tailscale down). Désactivé par défaut, inscrivez-vous. Le tunnel WireGuard / transport Tailscale va vers le propre point de terminaison VPN / tailnet de l'utilisateur et n'est pas lié à l'infrastructure de lafine (§9).

Verrouillage préventif ARP/NDP

Au moment où un réseau non fiable est rejoint, les adresses MAC de l'infrastructure de liaison qu'un attaquant MITM devrait usurper l'identité sont épinglées dans la table voisine du noyau sous la forme d'entrées PERMANENT (statiques). Une fois épinglé, le noyau ignore les réponses ARP/publicités voisines falsifiées.

  • Qu'est-ce qui est épinglé — (1) la passerelle IPv4 par défaut, (2) le routeur IPv6 par défaut (souvent une adresse fe80:: de lien local), (3) tout résolveur DNS en liaison (un résolveur public est atteint via la passerelle et est ignoré). Les voisins IPv6 sont épinglés avec ip -6 neigh replace ... nud permanent.
  • Les réseaux de confiance ne sont jamais épinglés — donc un redémarrage du routeur domestique ne peut pas mettre l'utilisateur dans un trou noir. Ré-épinglé sur chaque commutateur réseau (TOFU) ; un basculement légitime est détecté lors de la prochaine reconnexion. Les entrées épinglées sont enregistrées dans /var/lib/roamswitch/arp_lock.json.
  • Activé par défaut (politique de l'édition communautaire ; même répartition que la version macOS Pro). Basculer : gateway_arp_lock_enabled.

Détection d'usurpation d'identité ARP (notifier d'abord)

Surveille /proc/net/arp pour un mappage IP vers plusieurs MAC et pour un changement soudain suspect du MAC de la passerelle. En confinement : couper tout trafic (Air-Gap) + notifier. Sur les réseaux équilibrés/de confiance : notifier sans couper ; l'utilisateur déclenche l'Air-Gap d'urgence depuis RoamSwitch. Cela (a) empêche un attaquant de transformer un seul paquet ARP usurpé en une panne auto-infligée, et (b) empêche le redémarrage d'un routeur ou l'itinérance d'un point d'accès de le déclencher par erreur. Basculer : arp_spoof_guard_enabled.

Garde d'anomalie de port

Contient automatiquement un port d'écoute nouvellement exposé au réseau local externe (une porte dérobée, C2 ou un serveur de développement/API LLM locale lié accidentellement à 0.0.0.0). Le verdict est baseline-relative, et non « numéro de port dangereux ». Lors de l'activation, les exécutables actuellement exposés sont appris comme « connus » ; par la suite, seul un exécutable exposé nouvellement apparu est signalé (identité = le chemin de l'exécutable, snaps normalisés en snap:<name>). Les démons système sont hors de portée. Le confinement s'effectue via la table inet roamswitch_dev_guard : déposez TCP sur ce port à partir de tout sauf de lo – la machine elle-même continue de l'utiliser. Lors du confinement automatique, une boîte de dialogue immédiate de notification et de confirmation sur le bureau (« Autoriser ce port » / « Garder bloqué ») s'affiche, permettant une mise sur liste blanche permanente en un clic. N'importe quel port peut également être autorisé individuellement et la ligne de base récupérée à partir de l'écran de diagnostic des ports. Activé par défaut. Basculer : port_anomaly_guard_enabled. Porté depuis macOS.

Détection des risques Docker & protection contre le contournement du pare-feu

Les ports publiés par Docker (-p) sont connus pour contourner le pare-feu standard de l'hôte ; des règles d'inspection sont donc insérées en permanence dans la chaîne DOCKER-USER, bloquant tout trafic externe non explicitement autorisé (aucune configuration requise, actif par défaut). De plus, docker events est surveillé en temps réel afin de détecter instantanément le démarrage d'un conteneur --privileged ou un montage /var/run/docker.sock — un risque d'évasion de conteneur — et de vous avertir immédiatement. Comme cela signale une configuration à risque et non une compromission confirmée, il s'agit uniquement d'une notification, sans blocage automatique.

Scanner de fuites de secrets et de clés API

Détecte les clés API (OpenAI, Anthropic, AWS, GitHub, Slack, Stripe, etc.) et les clés privées SSH grâce à l'entropie de Shannon combinée à une correspondance de motifs. roamswitch audit-secrets <text|fichier|répertoire> analyse du texte et des fichiers, ainsi qu'un répertoire entier de façon récursive (en ignorant .git, node_modules, etc. ; les fichiers de plus de 2 Mo ou ressemblant à du binaire sont ignorés). La même fonctionnalité est également disponible via l'outil MCP audit_secrets et la méthode audit_secrets_directory() du SDK Python. Le contenu n'est jamais transmis nulle part.

Assistant de configuration de première exécution et interface utilisateur de confirmation

Le package est livré /etc/xdg/autostart/roamswitch.desktop, donc l'assistant d'installation se lance lors de la première connexion après l'installation (il réside ensuite uniquement dans la barre d'état). L'activation/la désactivation d'un agent de sécurité affiche une boîte de dialogue de confirmation pour les mêmes gardes que la version macOS (anomalie de port, confinement automatique ARP, stockage USB, clavier BadUSB, Bluetooth). Les décisions au moment de l'événement (un clavier USB inconnu, une clé USB non enregistrée, un port inconnu bloqué automatiquement, un Air-Gap d'urgence) sont présentées sous forme de dialogues modaux.

§5

Détection de rafales d'entropie de Shannon · Balayage YARA

Les événements d'écriture sont suivis par PID. Si un seul processus crée 20 fichiers distinct ou plus avec une entropie ≥ 7,92 dans les 5 secondes, il est traité comme un cryptage groupé par ransomware : le processus est gelé avec SIGSTOP et Air-Gap est déclenché.

  • Séparation complète de l'analyse YARA et du suivi de l'entropie — L'inspection des logiciels malveillants YARA est appliquée à tous les fichiers écrits sans exception (contournement du zéro, analyse ~/.cache/, node_modules/, /tmp/ et archives). Pendant ce temps, l’analyse des rafales d’entropie des ransomwares exclut les formats naturellement compressés (.zip, .tgz, .tar.gz, .gz, .png, .jpg, .mp4, .wasm) et les gestionnaires de paquets vérifiés (npm, npx, cargo, rustc, dpkg, apt, tar). fonctionnant dans les arbres de construction/cache pour éliminer les gels SIGSTOP faussement positifs.
  • Les écrasements répétés du même fichier (par exemple les trois passes de shred) comptent comme un événement.
  • Protection contre les processus critiques — Les PID sont vérifiés par rapport à une liste NEVER_FREEZE codée en dur (systemd, dockerd, NetworkManager, sshd, gnome-shell, …) et ne sont jamais gelés, évitant ainsi un blocage à l'échelle de la machine.

Canaris (fichiers leurres)

Les fichiers leurres sont placés dans les dossiers Documents, Bureau, Téléchargements et Images de l'utilisateur et dans un répertoire dédié, et comparés à une référence SHA-256 sur un cycle de 3 secondes. Tout changement de nom, suppression, troncature ou changement de contenu déclenche immédiatement Air-Gap. Étant donné que le démon s'exécute en tant que root, il énumère /home/* et déploie des canaris dans les répertoires de chaque utilisateur réel.

surveillance fanotify · Coffre-fort de quarantaine · ClamAV

  • Le démon surveille /home, /var/tmp, /dev/shm au niveau du montage et / au niveau du système de fichiers via FAN_CLASS_CONTENT (repli FAN_CLASS_NOTIF).
  • Notifier d'abord, pas de quarantaine silencieuse. Un simple hit YARA / ClamAV n'est jamais mis en quarantaine silencieusement ou FAN_DENY'd. Une vraie signature déclenche une requête modale dans /run/roamswitch/approvals.json (Quarantaine / Autoriser / Plus tard) ; rien n'entre dans le coffre-fort jusqu'à ce que l'utilisateur confirme. Seul un execve réel est FAN_DENY, et seulement lorsque pre_exec_blocking_enabled est activé. Le délai d’approbation expire en cas d’ouverture.
  • Les signatures de test telles que EICAR sont uniquement journalisées — la chaîne de test standard de l'industrie ne déclenche aucune notification, seulement une entrée dans l'historique des notifications, et n'est jamais mise en quarantaine ou bloquée, à la fois dans la garde fanotify et dans la garde de téléchargement.
  • Une liste de chemins scan_exclusions configurée par l'utilisateur (chemins absolus, appliqués de manière récursive ; elle englobe l'ancien clamav_exclusions) est honorée par les scanners YARA et ClamAV. « Autoriser » à l'invite et « Restaurer » dans l'onglet Quarantaine s'y ajoutent tous deux, de sorte que le même fichier n'est pas re-marqué.
  • Les logiciels malveillants réels détectés et confirmés sont déplacés vers ~/.local/share/roamswitch/quarantine/. Le coffre-fort est 0700 ; chaque échantillon est 0400 (lecture seule, non exécutable). Lors de la restauration, le fichier revient à 0644 et est transmis au propriétaire du répertoire de destination.
  • La boucle d'événement d'autorisation n'effectue aucune E/S sur le système de fichiers — la configuration est lue par un thread d'arrière-plan dédié dans un instantané Mutex<GuardConfig> ; les accesseurs hot-path se contentent de verrouiller et de copier. Il s'agit d'un invariant de conception : bloquer sur FAN_OPEN_PERM gèlerait la machine.
  • Lorsque ClamAV est présent, les exécutables nouvellement téléchargés (.sh, .deb, .elf, …) et les modèles d'IA dangereux (.pkl, .pt) sont analysés par rapport à la base de données locale. ClamAV est une dépendance facultative  ; les autres défenses fonctionnent sans cela. Lorsqu'il est installé, le programme de mise à jour quotidien (§11) appelle freshclam pour que la base de données de signatures reste à jour.

Préemption et renforcement de l'élévation de privilèges locaux (LPE) du noyau

Lorsqu'un attaquant ou un logiciel malveillant prend pied sur un utilisateur non privilégié, la défense en profondeur empêche d'exploiter les vulnérabilités du noyau Linux pour obtenir les privilèges root.

  • Désactivation des espaces de noms d'utilisateurs non privilégiés (atténuation Frag Gap CVE-2026-53362) — De nombreuses vulnérabilités LPE du noyau Linux moderne reposent sur des utilisateurs non privilégiés appelant unshare(CLONE_NEWUSER) pour créer des espaces de noms d'utilisateurs isolés, accédant ensuite à des structures de noyau non initialisées ou à des sous-systèmes réseau existants avec des capacités d'espace de noms élevées. RoamSwitch évalue et applique user.max_user_namespaces = 0 (ou kernel.unprivileged_userns_clone = 0) via un assistant de renforcement ou de configuration en un clic. Cela ferme la surface d'attaque des processus non privilégiés, même avec des noyaux zéro jour non corrigés.
  • Yama LSM Memory Protection — L'application de kernel.yama.ptrace_scope = 1 (ou 2) empêche les processus non autorisés de se connecter via ptrace ou de lire la mémoire via /proc/$pid/mem, protégeant ainsi les sessions du navigateur et les clés privées GPG/SSH.
  • Core Dump Suppression — Le paramètre fs.suid_dumpable = 0 empêche les processus sensibles de planter d'écrire des vidages de mémoire en texte brut sur le disque.
  • /tmp & /dev/shm noexec Mount Defense — Pour empêcher les attaques par suppression et exécution de charge utile, RoamSwitch remonte /tmp et /dev/shm avec noexec,nosuid,nodev lors de la connexion à des réseaux non fiables.

Capteur de menace d'exécution eBPF et gel des processus autonomes (Desktop eBPF Guard)

Le démon client RoamSwitch inclut une intégration native avec les capteurs eBPF modernes du noyau (Falco / Tetragon / BTF).

# Détection des menaces runtime eBPF et flux d'interception autonome
[Processus malveillant (LPE/malware)]
    │ Exécution d'appel système illégal (tentative d'exploitation Frag Gap)
    ▼
[Noyau Linux (sonde eBPF)]
    │ Tampon circulaire eBPF (conception compacte de 2 Mo)
    ▼
[Falco (RoamSwitch Optimized)]
    │ Socket UNIX direct en mémoire (/var/run/roamswitch/events.sock)
    ▼
[roamswitch-daemon (root)]
    ├─► ① Gel du processus attaquant à la milliseconde : kill(pid, SIGSTOP) [état : Ts]
    ├─► ② Coupure réseau complète : nftables input/output drop [Air-Gap activé]
    └─► ③ Alerte d'urgence de bureau : modal GTK3 & notification libnotify
  • Direct UNIX Domain Socket IPC (/var/run/roamswitch/events.sock) — Les alertes de Falco ou d'autres capteurs eBPF sont reçues directement sur un socket UNIX en mémoire sans écrire dans les journaux de disque, éliminant ainsi la latence d'E/S disque et permettant des transferts de réponse en moins d'une seconde.
  • Atténuation multicouche autonome (gel du processus et espace d'air) — Lorsqu'un événement avec la priorité Critical ou Emergency (tel que le LPE du noyau, l'échappement d'un espace de noms ou l'exécution d'un ransomware) est reçu, le démon exécute SIGSTOP sur le PID incriminé pour suspendre immédiatement l'exécution du processus (état : Ts), déploie policy drop sur inet roamswitch (Air-Gap) et déclenche une notification immédiate sur le bureau.
  • Réglage à faible surcharge pour ordinateurs de bureau et prévention de la croissance excessive des journaux (RoamSwitch Optimized) — pour limiter la consommation de batterie, la charge CPU et l'épuisement du disque sur les ordinateurs portables et les stations de travail, un profil optimisé (99-roamswitch-optimized.yaml) est fourni :
    • Severity Filtering (priority: warning) — Filtre 95 % des événements d'avis/informations de routine.
    • Kernel Early Drop (drop_failed_exit: true) — Supprime les sorties d'appel système ayant échoué directement dans le pilote du noyau, réduisant de moitié les changements de contexte et la charge du processeur.
    • Compact Ring Buffer (cpus_for_each_buffer: 2) — Réduit la taille du tampon en anneau à 2 Mo, en maintenant la RAM résidente entre 30 et 50 Mo et l'utilisation du processeur <1 %.
    • Capuchon obligatoire de rotation des journaux (/etc/logrotate.d/roamswitch-falco) — Applique un plafond strict de 50 Mo avec une rotation compressée sur 7 générations.
  • Résilience hybride (mode autonome ou eBPF) — Sans Falco, RoamSwitch protège le système via le sysctl du noyau (user.max_user_namespaces = 0), les profils itinérants nftables, le suivi d'entropie fanotify et les canaris. Avec Falco, la télémétrie comportementale approfondie du noyau intercepte les exploits avancés du jour zéro et gèle les processus des attaquants en temps réel.

§6

Les événements USB sont surveillés ; Les appareils de classe clavier (HID) et le stockage de masse USB sont suivis. Désactivé par défaut (expédition isEnabled = false, correspondant au macOS USBKeyboardGuard / USBStorageGuard). Inscrivez-vous à partir de l'assistant de première exécution ou de l'onglet USB ; l'activation affiche une boîte de dialogue de confirmation.

Clavier USB malveillant (injection de frappe)

  • Aucune désautorisation de port physique au niveau du noyau (important). L'ancienne implémentation (≤1.0.6) écrivait 0 en /sys/bus/usb/devices/*/authorized pour un clavier non enregistré, en le déconnectant physiquement. Sur un récepteur combiné clavier + souris (commun sur un Raspberry Pi ou un mini PC), cela déconnecte également la souris, verrouillant ainsi une machine sans entrée intégrée. RoamSwitch refuse désormais catégoriquement d'écrire authorized=0 sur tout périphérique exposant une interface HID (bInterfaceClass 03), et le démon réautorise tout périphérique HID authorized==0 au démarrage pour auto-réparer les machines dont la version précédente est maçonnée.
  • Les frappes sont supprimées dans le logiciel. Lors de la détection d'un clavier non enregistré, un evdev exclusif EVIOCGRAB est pris sur le /dev/input/eventN de cet appareil (uniquement les nœuds avec un gestionnaire kbd dans /proc/bus/input/devices, correspondant à VID:PID). Le nœud de la souris est intact. Il s'agit de l'équivalent Linux de macOS CGEventTap ; l'appareil reste alimenté.
  • Safety — la saisie n'est effectuée que s'il existe un autre clavier sur lequel taper (un clavier intégré ou un clavier USB approuvé et connecté), de sorte qu'une machine avec un seul nouveau clavier n'est jamais verrouillée.
  • Boîte de dialogue d'approbation — à côté de la saisie, une demande d'approbation est mise en file d'attente dans /run/roamswitch/approvals.json et l'interface graphique affiche un modal (Autoriser/Refuser). Autoriser l'appareil sur la liste blanche et libérer la capture. Ouverture après 3 minutes.

Stockage de masse USB malveillant

Lorsqu'un périphérique de stockage de masse USB non enregistré (pas d'interface HID) est inséré, que la protection est activée et que le réseau n'est pas fiable/verrouillé, il est maintenu avec authorized=0 (sans danger pour un périphérique non HID) et une boîte de dialogue d'approbation s'affiche. Autoriser les réautorisations et les listes blanches ; Deny le maintient en place. La version macOS a été alignée sur ce modèle « conserver la lecture seule + invite d'approbation » dans la version 1.7.4.

Identification et droits acquis

HID est déterminé à partir de bInterfaceClass == "03" et de la ligne Handlers= dans /proc/bus/input/devices. Un récepteur combo (un VID:PID avec à la fois une section kbd et une section souris) est fusionné par VID:PID. Un clavier non enregistré présent au démarrage du démon bénéficie de droits acquis  ; seul un clavier branché à chaud est ensuite récupéré.

§7

Le LinuxHealthChecker dans roamswitch-core évalue 24 éléments et produit un score de 0 à 100, une note A à F et des conseils par élément. À partir du tableau de bord GTK, la CLI (roamswitch status) et le MCP (get_security_report), le titre, les détails et la recommandation des 24 éléments apparaissent dans la langue de l'utilisateur (10 langues).

Catégories d'évaluation
CatégorieExemples d'éléments
Disque/démarrageCryptage LUKS/dm-crypt, démarrage sécurisé UEFI
Contrôle d'accèsLSM (AppArmor / SELinux), audit de configuration SSH / sudo
Durcissement du noyauRenforcement de sysctl, désactivation des espaces de noms d'utilisateurs non privilégiés (atténuation Frag Gap), contrôle du core-dump, noexec sur /tmp et /dev/shm
Mises à jourconfiguration automatique des mises à jour de sécurité
RéseauSurveillance de l'usurpation d'identité ARP, état de verrouillage ARP/NDP de la passerelle, audit des ports exposés, force de cryptage Wi-Fi
Logiciel malveillantClamAV / fanotify (vérifie également que le garde est réellement en cours d'exécution) / surveillance de l'entropie / noexec
NavigateurParamètres de navigation sécurisée Firefox / Chrome / Chromium
DNS/USBDNS de protection contre les menaces, état zéro confiance du bus USB

Chaque vérification est basée sur la lecture des fichiers locaux et du résultat de la commande (getenforce, mokutil, resolvectl, ss,…). Il n'y a aucune requête externe d'aucune sorte.

Classement conforme à la confiance. Le renforcement que RoamSwitch n'applique délibérément pas sur un réseau (domestique) de confiance - en épinglant le MAC de la passerelle comme PERMANENT (ce qui perturberait le réseau local lors d'un redémarrage du routeur), en remontant /tmp et /dev/shm noexec (ce qui interrompt les builds de packages et certains installateurs) et le DNS de protection contre les menaces dans la portée par défaut - est affiché en vert avec une explication plutôt qu’un rouge « non durci », et note qu’il s’applique automatiquement sur un réseau non fiable. La vérité d'exécution vient de /run/roamswitch/state.json (active_level / network_trusted / fanotify_ready), écrite à chaque cycle par le démon. L'élément fanotify vérifie que le garde est réellement marqué et exécuté (/run/roamswitch/fanotify.ready), pas seulement que le noyau le prend en charge. L'élément de ports exposés lit le profil en direct du démon (le code dur MCP a disparu).

Renforcement par élément. Les éléments défaillants qui ont un correctif automatisé (noyau sysctl / Yama / core dumps, /tmp noexec, USB zero-trust, épinglage ARP de passerelle, DNS de protection contre les menaces, redémarrage du démon lorsque la garde fanotify est en panne) comportent un bouton « 🔧 Harden » dans le tableau de bord GTK. Le démon s'exécute en tant que root, donc aucun pkexec n'est nécessaire, sauf pour le redémarrage du démon.

§8

roamswitch-mcp parle JSON-RPC sur stdio et est généré par des clients IA tels que Claude Desktop, Cursor et Antigravity. Chaque outil est lecture seule et entièrement local.

Outils exposés
OutilObjectif
get_security_reportÉvaluation en 24 éléments, score et recommandations
get_exposed_portsports exposés et leur état de blocage du pare-feu
get_guard_statusniveau de protection actuel et état du module de défense
audit_url_sécuritéanalyse heuristique de la sécurité des URL (ne récupère pas la cible)
audit_secretsdétection des clés API/secrets dans le texte (ne transmet pas le texte)
audit_security_logsagrégation des journaux journald/auth locaux
get_quarantine_status / get_canary_statusquarantaine et état des Canaries
get_app_helprecherche dans la base de connaissances intégrée
run_active_vuln_scanVérification active de vulnérabilités, non destructive et limitée à 127.0.0.1. Le seul outil qui utilise le réseau : désactivé par défaut, il exige un consentement explicite dans les réglages.
run_package_cve_scanCompare les paquets installés (Mac : Homebrew / Linux : dpkg, dnf, zypper, pacman) à une carte CVE locale. Aucune communication réseau n'a lieu.
run_package_cve_scan_languagesCompare les fichiers de verrouillage de dépendances npm, PyPI, crates.io, RubyGems, Packagist, Go et Maven à la même carte CVE locale. Aucune communication réseau n'a lieu.
verify_fimRecalcule l'empreinte d'environ 150 fichiers système critiques et la compare à la référence enregistrée pour détecter toute altération.
get_file_scan_guard_statusRenvoie la configuration du File Scan Guard (ClamAV) et l'état du coffre de quarantaine associé.
get_port_anomaly_incidentsRenvoie l'état de référence de la protection contre les ports anormaux, les ports actuellement bloqués automatiquement et les 50 incidents les plus récents. La réponse précise explicitement que les ports actuellement bloqués sont un instantané de l'état présent, sans horodatage, distinct de l'historique des incidents qui, lui, est horodaté.
get_ebpf_incidentsRenvoie l'état d'isolation actuel du garde d'exécution eBPF et l'historique des incidents à son origine.
get_resource_guard_incidentsRenvoie l'historique du garde contre l'épuisement des ressources et les anomalies de processus (fuites mémoire, boucles de plantage), avec un niveau de confiance.
get_notification_historyRenvoie l'historique des notifications envoyées par RoamSwitch (anomalies d'audit des journaux de sécurité, détections ClickFix, etc.) des 7 derniers jours, les plus récentes en premier.
get_incident_timelineRegroupe les détections de tous les gardes dans une chronologie unique, avec la filiation des processus et des étiquettes MITRE ATT&CK (expérimental).

Le serveur MCP n'ouvre lui-même aucune connexion réseau : il se connecte au socket Unix du démon via roamswitchkit ou appelle directement la logique de roamswitch-core. La seule exception est run_active_vuln_scan, désactivé par défaut, qui envoie des sondes non destructives vers 127.0.0.1, c'est-à-dire l'hôte lui-même.

Une erreur d'attribution découverte — et corrigée — lors d'un exercice avec un LLM local
En septembre 2026, lors d'un exercice (fire drill) où un LLM local (Qwen 3.8 27B) devait enquêter sur un incident via ce serveur MCP, nous avons découvert un cas où le modèle avait mal interprété les données renvoyées par get_port_anomaly_incidents et intégré à tort un ancien blocage de port, sans rapport avec l'incident, dans le récit d'un incident en cours. La cause : un instantané sans horodatage des ports actuellement bloqués était renvoyé dans la même réponse que l'historique réel et horodaté des incidents, sans que rien ne distingue les deux. Le correctif ajoute des champs de note explicites indiquant lequel des deux champs constitue une chronologie et lequel n'est qu'un instantané. En relançant le même scénario avec le même modèle après correction, celui-ci a cité le texte de la note et a explicitement refusé d'attribuer l'ancien port à l'incident en cours. L'efficacité du correctif a été vérifiée à la fois par un test de non-régression automatisé et par une nouvelle exécution avec le véritable LLM local.

§9

RoamSwitch pour Linux effectue exactement un type de requête sortante : le GET du programme de mise à jour quotidienne d'un manifeste signé (§11). Tout le reste (chaque évaluation, détection et audit) s'effectue localement. RoamSwitch pour Linux est un logiciel gratuit propriétaire et sa source n'est pas publiée, les inspections ci-dessous ont donc été effectuées par lafine ; les résultats sont en 9.2 et les étapes de l'annexe C sont reproductibles à partir du seul package distribué.

9.1 Méthode d'audit

  1. Crate isolation — une pile HTTP/TLS est autorisée dans one crate only, roamswitch-updater, qui construit le binaire de mise à jour autonome piloté par minuterie. scripts/audit_no_network.sh (exécuté dans CI, gating) échoue la construction si roamswitch-core, roamswitch-daemon, roamswitch-app, roamswitch-mcp ou roamswitchkit extrait reqwest / hyper / ureq / rustls / native-tls / openssl, ou si un fichier .rs en dehors de roamswitch-updater utilise TcpStream / TcpListener / UdpSocket / to_socket_addrs / lookup_host.
  2. Inspection de l'arborescence des dépendances — le Cargo.lock complet a été recherché pour les SDK de télémétrie/analyse/rapport de crash (sentry, opentelemetry, …).
  3. roamswitch-updater review — sa cible de requête unique, l'absence de chaîne de requête/cookies/en-têtes d'identification et sa vérification Ed25519 de tout ce qu'il télécharge.
  4. Énumération des sous-processus — chaque site d'appel Command::new(...) a été examiné.

9.2 Résultats

Résultats de l'audit
Élément d'auditRésultat
Pile HTTP/TLSPrésent en roamswitch-updater uniquement (ureq + rustls). Pas en core / daemon / app / mcp / kit
SDK de télémétrie/analyse/rapport d'accidentsAbsent nulle part
TcpStream / TcpListener / UdpSocketPas une seule occurrence en dehors de roamswitch-updater
API de socket utiliséesAF_UNIX (IPC local) ; AF_NETLINK (canal de verdict NFQUEUE, nftables et contrôle ip neigh — pas de sortie) ; AF_INET uniquement en roamswitch-updater. Le tunnel VPN (§4), lorsqu'il est activé, est wg-quick (backend WireGuard) ou tailscaled (backend Tailscale) — un sous-processus, pas le démon — envoyant le trafic vers le propre point de terminaison/tailnet de l'utilisateur
Mise à jour quotidienneUn GET https://lafine.net/updates/v1/manifest toutes les ~24 h. Pas de chaîne de requête, pas de cookies, User-Agent générique, pas d'identifiant. Toutes les charges utiles Ed25519-vérifiées. updates.enabled = false le désactive complètement
Tunnel VPN (§4)Désactivé par défaut. Lorsqu'il est activé, wg-quick crée un tunnel WireGuard vers le point de terminaison dans le propre .conf de l'utilisateur — sans rapport avec lafine. Résolution du nom d'hôte du point de terminaison via getent ahosts (glibc NSS), pas une API de socket Rust
Activation de la licenceVérification de la signature Ed25519 hors ligne. Aucune communication avec un serveur d'activation
Conclusion

RoamSwitch pour Linux lance exactement un type de requête sortante : un téléchargement quotidien, en réception uniquement, de données de détection signées qui ne contiennent aucune information sur l'utilisateur ou la machine. Rien d'autre dans le produit ne contacte jamais un serveur externe.

9.3 Liste complète des opérations orientées vers l'extérieur

Toute opération pouvant faire quitter la machine locale à un paquet, directement ou indirectement :

#FonctionnementDestinationDéclencheurCe qui est envoyé
1Daily updaterGET /v1/manifest et le fichier de flux lorsque sa version a changélafine.net/updates/v1 (CAN)Minuterie systemd, une fois toutes les ~24 h avec un délai aléatoire. Éteint lorsque updates.enabled = false ou roamswitch-update.timer est désactivéun simple HTTPS GET : pas de chaîne de requête, pas de cookies, générique User-Agent, rien sur l'utilisateur ou la machine. Reçoit un manifeste signé + un flux
1afreshclam (le propre programme de mise à jour de ClamAV), invoqué par le programme de mise à jour quotidien lorsque ClamAV est installéle CDN du projet ClamAVdans le cadre du #1le trafic de ClamAV lui-même (un projet distinct) ; RoamSwitch le lance uniquement
2ping -c1 -W1 la passerelle LAN par défaut (link-local)pour actualiser le cache ARP lors de la détection d'usurpation d'identité ARPDemande d'écho ICMP uniquement. Pas de résolution DNS, pas de charge utile
3lancement du navigateur système (xdg-open)https://lafine.net/... (site produit)uniquement lorsque l'utilisateur clique sur un bouton tel que « Ouvrir les notes de version »le processus RoamSwitch n'ouvre aucun socket ; il transmet l'URL au navigateur du système d'exploitation
4solvectl dns — (aucune communication n'a lieu)DNS de protection contre les menaces sur un réseau non fiable (opt-in). <iface> est chaque carte réseau physique transportant une route par défaut (filaire + sans fil à la fois ; lo / tailscale* / wg* / docker* / veth* exclus) ; également appliqué sur un réseau de confiance lorsque dns_scope = always_on ; réconcilié chaque cycle sentinellecela modifie uniquement le paramètre du résolveur du système d'exploitation ; RoamSwitch lui-même n'envoie aucune requête DNS
5mises à jour du gestionnaire de paquetsles dépôts apt / dnf / zypper de la distributionlorsque l'utilisateur exécute apt upgrade, etc., ou clique sur le bouton de l'interface graphique « Mettre à niveau maintenant » (qui exécute apt-get / dnf / zypper via pkexec)RoamSwitch lit la sortie locale apt-cache policy et lance le gestionnaire de packages ; sans rapport avec lafine
6Tunnel VPN (§4) — Backend WireGuard : le tunnel wg-quick construit / Backend Tailscale : tailscale set --exit-node achemine tout le trafic via le nœud de sortiele point de terminaison VPN / tailnet de l'utilisateur (WireGuard : le point de terminaison dans le .conf ; Tailscale : le nœud de sortie choisi et les relais DERP)lorsque vpn_on_untrusted_enabled et que le réseau n'est pas fiable. Désactivé par défauttrafic WireGuard/Tailscale crypté ; la destination est le propre serveur VPN/tailnet de l’utilisateur, sans rapport avec lafine. Résolution des points de terminaison WireGuard via getent ahosts (glibc NSS) ; Tailscale est piloté par tailscaled (un processus distinct)

Toutes les autres fonctionnalités de RoamSwitch : contrôle nftables, épinglage ARP/NDP de la table voisine (ip neigh, pas de sortie de paquets), protection des liens (NFQUEUE, AF_NETLINK uniquement), analyse des ports (analyse de la sortie ss), surveillance ARP, évaluation de l'état, surveillance de l'entropie, canaris, fanotify, surveillance USB (prise en charge evdev), quarantaine, audit des journaux, audit des URL et des secrets - se termine en utilisant uniquement les lectures de fichiers locaux et analyse de la sortie du sous-processus. Le tunnel VPN §4 est la seule « communication sortante que l'utilisateur a explicitement configurée », et sa destination est le propre serveur VPN de l'utilisateur — aucun flux de données vers l'infrastructure de lafine.

§10

  • Aucun compte — aucune inscription d'utilisateur, aucune connexion, aucune adresse e-mail jamais demandée.
  • La configuration est locale uniquement — stockée en texte brut à ~/.config/roamswitch/config.json et ne quitte jamais la machine. Il n'y a pas de synchronisation cloud.
  • Les résultats de l'évaluation sont locaux uniquement — les rapports de sécurité et les résultats d'audit des journaux sont uniquement affichés à l'écran et, si l'utilisateur le souhaite, exportés vers un fichier local.
  • Les clés de licence sont vérifiées hors ligne — Les jetons de licence Pro/Business contiennent une signature Ed25519 et sont vérifiés avec une clé publique. Aucune requête n'est adressée à un serveur lafine.
  • Aucun rapport de crash — en cas de panique, aucune trace de pile n'est envoyée nulle part.
  • Le programme de mise à jour quotidien n'envoie rien à votre sujet — pas de chaîne de requête, pas de cookies, pas d'identifiant d'appareil ou d'installation, un User-Agent générique. Il s'agit d'un téléchargement, pas d'un rapport. Les verdicts Link-guard, les hôtes bloqués et les résultats d'analyse sont écrits uniquement dans la vue d'activité locale/journald, jamais transmis.

§11

Éditions
ÉditionPourPrixLicence
Édition communautaireUtilisation personnelle de LinuxGratuitLogiciel gratuit propriétaire (CLUF fourni)
Business (prévu)Gestion de flotte, distribution de politiques, apt interne signé, SLA pour les organisationsPayéLicence commerciale. Même porte binaire + niveau

Les acheteurs de macOS RoamSwitch Pro Lifetime bénéficient gratuitement des fonctionnalités Business sur leurs propres machines Linux.

Distribution et chaîne d'approvisionnement

ChaîneDétail
APTEhttps://lafine.net/apt (stable main). Release signé avec une clé RSA-4096
RPMhttps://lafine.net/rpm (Fedora / openSUSE séparé). repomd.xml signé GPG
AURroamswitch-bin (récupère l'archive tar des versions GitHub, vérifie sha256)
archive taramd64 / aarch64 .tar.gz + .sha256 sur les versions GitHub
  • Épinglé glibc floor — les binaires de version sont construits dans un conteneur Debian 12 (bookworm, glibc 2.36). Cela évite les incompatibilités de versions de symboles sur Debian 12 / Ubuntu 22.04 et versions ultérieures. Une étape CI « vérifier le plancher de la glibc » fait échouer la construction si une dépendance nécessitant plus de 2,36 est introduite.
  • Gestion des clés de signature — la clé privée pour la signature du référentiel apt/rpm existe uniquement dans un secret chiffré GitHub Actions ; seule la clé publique est validée dans le référentiel.

11.3 Le programme de mise à jour quotidien

roamswitch-updater est un binaire autonome exécuté par une minuterie systemd (roamswitch-update.timer, OnCalendar=daily avec un délai aléatoire de 3 heures et Persistent=true). C'est le seul composant qui atteint le réseau. Chaque course :

  1. GET https://lafine.net/updates/v1/manifest et sa signature détachée.
  2. Vérifiez la signature Ed25519 du manifeste avec une clé de signature de flux de menaces dédiée, distincte de la clé de mise à jour de l'application Sparkle. Le flux est re-signé quotidiennement par le CI côté serveur, de sorte que la clé privée réside dans un secret CI ; le limiter au flux signifie qu'une fuite permet uniquement à un attaquant de servir une mauvaise liste de blocage (gouffre / avertissement - pas de chemin de code, pas de chemin de mise à jour de l'application). La clé de signature de mise à jour de l'application ne quitte jamais le trousseau macOS. Un manifeste qui n’effectue pas de vérification est supprimé : le programme de mise à jour ne revient jamais aux données non signées.
  3. Si la version du flux de menaces a changé, téléchargez le flux, vérifiez sa signature SHA-256 et Ed25519, et installez-le atomiquement pour le link guard (§4).
  4. Si ClamAV est installé, invoquez freshclam.
  5. Enregistrez la dernière version de l'application pour une notification (le programme de mise à jour never installe l'application ; sous Linux, l'utilisateur exécute apt upgrade).

L'échec de n'importe quelle étape - hors ligne, mauvaise signature, freshclam manquant - est enregistré comme updates.lastError et le processus quitte toujours 0, donc une exécution de minuterie ne génère jamais de notification d'échec système. L'ensemble du mécanisme est désactivé par updates.enabled = false en updates.json ou par systemctl disable --now roamswitch-update.timer ; le produit s'exécute ensuite sur les données regroupées dans le package. Le flux de menaces est également fourni à l'intérieur du package, de sorte qu'une nouvelle installation dispose d'un flux fonctionnel avant l'exécution du programme de mise à jour, et apt upgrade l'actualise même avec le programme de mise à jour désactivé.

§12

  • OS : Ubuntu 22.04 / 24.04 et versions ultérieures, Debian 12 et versions ultérieures, Linux Mint / Pop!_OS / elementaire / Zorin, Raspberry Pi OS 64 bits (Bookworm), Ubuntu pour Raspberry Pi
  • Architecture : x86_64 / aarch64
  • Obligatoire : systemd, nftables, iproute2 (ip neigh — le verrou ARP/NDP) (extrait automatiquement par les dépendances .deb / .rpm)
  • Facultatif : clamav (analyse des logiciels malveillants), nmcli (détection du cryptage Wi-Fi), libnotify (notifications du bureau), wireguard-tools (le backend WireGuard du tunnel VPN + kill-switch, §4), tailscale (son backend Tailscale, §4), polkit / pkexec (exécution d'une mise à niveau depuis l'interface graphique)
  • Non pris en charge : distributions non-systemd (Alpine / Void / Devuan)
  • Display : 1 280 × 720 ou plus (la fenêtre et la police s'adaptent automatiquement à la taille de l'écran, prenant en charge les petits écrans Raspberry Pi)

Annexe A

CaisseObjectifRéseau
serde / serde_jsonsérialisation de la configuration et de l'IPCaucun
tokioruntime asynchrone (features = ["full"], mais seules les sockets Unix sont utilisées)aucun (pas de TCP)
traçage / traçage-abonnéjournalisation (local / journald)aucun
cette erreur / de toute façongestion des erreursaucun
expression régulièreanalyse de chaînes (diagnostics, mise à l'échelle CSS)aucun
URLAnalyse d'URL (heuristique audit_url_safety)aucun (ne récupère pas)
chronomètregestion de la date/heureaucun
ed25519-dalekvérification hors ligne des signatures de licenceaucun
base64 / sha2jetons de licence, hachages Canaryaucun
bibliothèquechown / kill / appels systèmeaucun
idnadécodage des hôtes IDN/punycode pour la détection d'homographesaucun
nfq (démon uniquement)Liaisons NFQUEUE pour le link guard — pure Rust, AF_NETLINKaucun (canal de verdict, pas de sortie)
ouvertappelle xdg-open pour « Ouvrir les notes de version »le processus lui-même ne communique pas
GTK3 / ksni (application uniquement)Interface graphique et plateauaucun
ureq + rustls (roamswitch-updater uniquement)celui du programme de mise à jour quotidien HTTPS GETla seule pile HTTP/TLS dans l'arborescence ; confiné au binaire du programme de mise à jour
Point clé

Aucun client HTTP, pile TLS ou SDK de télémétrie n'apparaît dans roamswitch-core, roamswitch-daemon, roamswitch-app, roamswitch-mcp ou roamswitchkit. ureq + rustls ne sont présents que dans roamswitch-updater (scripts/audit_no_network.sh applique cela dans CI). Il n’existe aucun SDK de télémétrie nulle part.

Annexe B

table inet roamswitch {                 # Pare-feu de profil (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 : tout le reste est droppé
    }
    chain output {
        type filter hook output priority -100; policy <accept|drop>;
        # policy drop uniquement pendant l'Air-Gap ; seuls lo et ct established sont autorisés
    }
}

table inet roamswitch_linkguard {        # §4.5 — indépendante de la table de profil
    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 Garde d'anomalie de port / isolation manuelle de port, table séparée
    chain input {
        type filter hook input priority -10; policy accept;
        iif != "lo" tcp dport { … } drop
    }
}

table inet roamswitch_vpn {              # §4 Coupe-circuit du 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; … }  # symétrique
}

table inet roamswitch_ts {               # §4 Coupe-circuit du backend Tailscale (plus permissif)
    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 (le côté v6 est également symétrique)
        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                    # Connexion directe WireGuard
        tcp dport 443 accept                      # Repli DERP
        ct state established,related accept
    }
    chain input  { type filter hook input priority -150; policy drop; … }  # symétrique
}

L'épinglage ARP/NDP de la passerelle / routeur IPv6 / résolveur DNS (§4) se fait dans la table voisine du noyau (ip neigh replace … nud permanent), pas dans les nftables. Les entrées épinglées sont enregistrées dans /var/lib/roamswitch/arp_lock.json.

Annexe C

Chaque affirmation contenue dans ce document peut être vérifiée sur votre propre machine. Les commandes ci-dessous s'exécutent sur un hôte sur lequel le package roamswitch est installé.

C.1 Vérification du trafic sortant

Les binaires démon/application/MCP ne lient pas de bibliothèque 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
# → Aucune sortie. La pile HTTP/TLS n'est liée statiquement qu'à roamswitch-updater.

Le démon en cours d'exécution ne contient aucune socket Internet :

sudo lsof -p "$(pgrep -x roamswitch-daemon)" -a -i
# → Aucune sortie = zéro connexion Internet TCP/UDP
sudo lsof -p "$(pgrep -x roamswitch-daemon)" -a -U | grep roamswitch
# → Uniquement /run/roamswitch/roamswitch.sock (le link guard ajoute un socket AF_NETLINK,
#   mais il s'agit d'un canal noyau, pas d'un socket internet)

La seule sortie attribuable à RoamSwitch est la mise à jour quotidienne :

watch -n 5 'sudo ss -tupn | grep -E "roamswitch-(daemon|app|mcp)" || echo "(none)"'
# → Toujours « (none) ». Aucun de ces trois processus n'ouvre jamais de socket internet.
systemctl list-timers roamswitch-update.timer
sudo systemctl start roamswitch-update.service
journalctl -u roamswitch-update.service -n 20 --no-pager
# → Une seule requête HTTPS GET vers lafine.net/updates/v1, puis il se termine.

Désactivez-le et confirmez le silence total :

sudo systemctl disable --now roamswitch-update.timer
# ou modifier /var/lib/roamswitch/updates.json en mettant "enabled": false
sudo strace -f -e trace=network -p "$(pgrep -x roamswitch-daemon)" 2>&1 | grep -i 'connect('
# → Se connecte uniquement à AF_UNIX / AF_NETLINK. AF_INET / AF_INET6 n'apparaissent jamais.

C.2 Vérification reproductible de la défense (suite de tests Docker)

Tous les mécanismes de détection, de contrôle et de défense de RoamSwitch (application d'Air-Gap, auto-réparation après endommagement du pare-feu, falsification de ransomware canary, /tmp noexec, Yama LSM, interception de phishing homographe et détection de fuite d'informations d'identification - 17 éléments au total) peuvent être reproduits et vérifiés en toute sécurité à 100 % dans un conteneur isolé sans affecter les réseaux ou fichiers hôtes, en utilisant la suite de tests officielle Docker fournie dans le référentiel de support public. (roamswitch-support

# Récupérer et reproduire la suite de vérification (vérification automatisée dans un conteneur isolé, avec le paquet de distribution officiel)
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

Le conteneur de test récupère automatiquement le package de distribution officiel du référentiel APT (lafine.net/apt) et évalue chacun des éléments de test systématiques suivants (SP-1-11, PENT-1-7) au sein d'un réseau et d'un espace de noms de montage isolés.

(1) Défense de réseau autonome et auto-réparation de l'espace aérien

pièce d'identitéScénarioMéthode de vérificationCritère de réussite
SP-3Activation de l'Air-Gap → chute de sortieEnvoyer enable_air_gap IPCpolicy drop appliqué au crochet de sortie ; tout le trafic sortant bloqué
SP-3bPurge forcée et auto-réparation du pare-feuPurger les règles via nft delete table inet roamswitchL'auto-guérison Anti-Clobber restaure les règles de chute dans les 5 secondes
SP-3cFermeture en cas d'échec lors du redémarrage du démonDémon Hard-kill (SIGKILL) à mi-Air-Gap et redémarrageLa politique de suppression de sortie persiste de manière transparente lors du redémarrage
SP-3dRécupération d'entrefer autoriséeEnvoyer un disable_air_gap IPC autoriséPolitique de suppression levée, tous les fichiers de marqueurs supprimés, sortie restaurée
SP-8Épinglage préventif ARP/NDPActiver dans un environnement de passerelle Netns isolé → envoyer un ARP gratuit usurpéL'entrée voisine de la passerelle reste PERMANENT ; ARP usurpé ignoré
SP-9Kill-switch VPN (WireGuard)Serveur Live WireGuard dans des réseaux séparés, importez .confvpn_upLa poignée de main se termine jusqu'à inet roamswitch_vpn ; zéro fuite à la mort du tunnel
SP-10Kill-switch VPN (Tailscale)Stub tailscale CLI + réseaux séparés, tailscale0 IFTexte en clair hors tunnel TCP/80 et DNS local bloqués ; DERP et MagicDNS autorisés

(2) Durcissement du noyau et du support

pièce d'identitéScénarioMéthode de vérificationCritère de réussite
SP-11aRenforcement du système réseauExécutez apply_kernel_sysctl_hardening IPCrp_filter=1, tcp_syncookies=1, accept_redirects=0 atteignent les valeurs cibles
SP-11bProtection de la mémoire et Yama LSMVérifiez ptrace_scope et suid_dumpablekernel.yama.ptrace_scope=1 (bloque la surveillance), fs.suid_dumpable=0 (pas de core dump)
SP-11c/tmp & /dev/shm défense noexecExécutez apply_mount_hardening IPC/tmp et /dev/shm ont remonté noexec,nosuid,nodev ; exécution refusée
SP-11dExécution légitime des utilisateurs préservéeExécuter des scripts dans le répertoire personnel standard (~/)Fonctionne sans entrave sans interrompre les flux de travail légitimes des développeurs/administrateurs

(3) Défense multicouche contre les logiciels malveillants et les ransomwares et Canaries

pièce d'identitéScénarioMéthode de vérificationCritère de réussite
SP-1Détection de sabotage CanaryTronquer ou renommer le fichier Canary leurre (.xlsx) en ~/Documents/Sabotage détecté en quelques secondes, déclenchant un Air-Gap immédiat
SP-2Détection des rafales de chiffrement en masse des ransomwaresUn seul processus génère rapidement plusieurs fichiers à haute entropieProcessus du travailleur incriminé gelé avec SIGSTOP ; Air-Gap déclenché
SP-2bPas de faux positif sur shredExécutez shred -n 3 -u sur les fichiers de testLa correspondance de la liste verte empêche la détection ou le gel des faux positifs
SP-2cLes processus critiques ne sont jamais gelésValider la logique de la cible gelée lors de la détection de rafalesLes démons critiques (dockerd, systemd, containerd) ne sont jamais gelés
SP-4La chaîne de test EICAR est à notification uniquementÉcrivez la chaîne de test EICAR dans ~/Downloads/Aucune notification, uniquement une entrée dans l'historique des notifications ; le fichier n'est jamais automatiquement mis en quarantaine
SP-4bConfirmation de la véritable signature du malware en premierÉcrivez une vraie signature en dehors des dossiers surveillésOuvre une boîte de dialogue d'approbation modale ; mis en quarantaine uniquement après confirmation de l'utilisateur
SP-4cRenforcement des autorisations de Quarantine VaultInspecter les autorisations du répertoire du coffre-fort et des exemples de fichiersRépertoire Vault défini sur 0700, échantillons mis en quarantaine définis sur 0400
SP-4dRestauration privilégiée du fichier original en toute sécurité IPCEnvoyer restore_quarantine_file IPCFichier restauré au chemin d'origine avec les autorisations utilisateur (0644) et ajouté aux exclusions

(4) Protection de lien passif et défense contre le phishing

pièce d'identitéScénarioMéthode de vérificationCritère de réussite
SP-7mode = block application stricteConnectez-vous aux hôtes répertoriés dans le flux ou blocklistExtraAbandonné au niveau de la couche TLS (analyse SNI) ; les hôtes sécurisés non répertoriés atteignent HTTP 200
SP-7bmode = warn maintien en cas de fermetureConnectez-vous à l'hôte d'avertissement sans réponse de l'utilisateur (délai d'expiration de 8 s)Supprime les paquets après expiration du délai (fail-closed) ; autorisé uniquement sur approbation explicite
SP-7cmode = off démontage completDésactiver la protection des liensLa table inet roamswitch_linkguard est complètement désinstallée

(5) Atténuation BadUSB et contrôle des appareils

pièce d'identitéScénarioMéthode de vérificationCritère de réussite
SP-6Maintien des droits acquis du clavier connectéVérifiez les claviers connectés au démarrage du démonLes appareils existants bénéficient de droits acquis ; seuls les hot-plugs ultérieurs ont été saisis

(6) Suite de tests d'intrusion dans l'environnement Docker (17 contrôles)

pièce d'identitéVecteur d'attaqueDétail de la simulationCritères de défense/détection
PENT-1Exfiltration C2Tentative de sortie HTTP/TCP vers C2 sous Air-GapTous les paquets abandonnés sur netfilter ; zéro fuite
PENT-1bSuppression forcée du micrologicielPurger les règles avec nft delete table inet roamswitchL'auto-guérison Anti-Clobber restaure les règles en quelques secondes
PENT-1cRestauration sécurisée de l'espace d'airProblème authentifié disable_air_gap IPCRègles de suppression supprimées ; marqueurs supprimés ; connectivité restaurée
PENT-2/tmp Porte dérobéeExécuter le script de porte dérobée supprimé dans /tmpRefusé par la protection de monture noexec (Permission denied)
PENT-2b/dev/shm Mémoire partagéeExécuter la charge utile binaire placée dans /dev/shmBloqué par la défense de monture noexec
PENT-2cPréservation de l'espace utilisateurExécuter le script dans le répertoire utilisateur légitime (/home/tester/)Exécution sans entrave ; zéro interruption du flux de travail
PENT-3Surveillance de la mémoire ptracePTRACE_ATTACH à cibler pour extraire les secrets/jetonsRefusé par Yama LSM kernel.yama.ptrace_scope=1
PENT-3bGrattage secret du Core DumpDéclencher un crash du processus pour obtenir un vidage mémoireEmpêché par fs.suid_dumpable=0
PENT-4Falsification des CanariesMettre à zéro le fichier leurre Canary dans ~/Documents/Détection en temps réel des anomalies de taille et des changements de hachage
PENT-4bEssuyage en vrac CanarySuppression massive des fichiers leurres CanaryDisparition de fichiers détectée immédiatement, déclenchant un incident
PENT-5Usurpation d'adresse IPTransmettre des paquets avec une adresse IP source usurpéeSupprimé par rp_filter=1 (filtre de chemin inverse)
PENT-5bSYN Flood DoSInonder les connexions TCP semi-ouvertesTable d'état protégée par tcp_syncookies=1
PENT-5cDétournement de route ICMPInjecter de faux paquets de redirection ICMPIgnoré en raison de accept_redirects=0
PENT-6Hameçonnage par homographe cyrilliqueAccédez à gооgle.com (homographe cyrillique)Identifié par LinkGuard, noté 40 (DANGEREUX / blocage)
PENT-6bTrafic IP brut et texte brutConnexion sortante directe à l'IP bruteSignalé avec précision comme facteur de risque pour la sécurité
PENT-7Fuite de clé API OpenAIExposer le jeton sk-proj-... dans le code ou les journauxDétecté via l'analyse d'entropie de Shannon et masqué
PENT-7bFuite du jeton GitHubExposer le jeton personnel ghp_... dans le codeCorrespondance par modèle de jeton et vérification d'entropie
PENT-8Préemption LPE (Frag Gap) du noyauunshare -U -r non privilégié (tentative CVE-2026-53362)Rejeté immédiatement par user.max_user_namespaces = 0 (Operation not permitted)
PENT-9Capteur de menace eBPF et gel des processusAlerte critique/urgence injectée via la prise Falco eBPFProcessus gelé via SIGSTOP en quelques millisecondes (état : Ts ); Air-Gap déployé

(7) Résumé des tests d'intrusion (autonome renforcé ou eBPF amélioré)

Résumé des résultats du test d'intrusion complet exécuté dans un environnement Docker isolé (Cible : Ubuntu 24.04 avec RoamSwitch Client Edition ; Attaquant : Nmap/curl/hping3 ; voir rapport officiel docs/CLIENT_PENTEST_REPORT.ja.md) :

Catégorie de vérificationSans Falco (autonome durci)Avec Falco (eBPF amélioré)Verdict de la Défense
Résistance au scan du port externe (Nmap SYN)PASS (100 % filtré / DROP dans Lockdown)PASS (100 % filtré / DROP dans Lockdown)Furtivité externe totale
Coupure d'accès direct externe (TCP/80, 3306)PASS (expiration du délai / réponse nulle)PASS (expiration du délai / réponse nulle)Exposition entrante nulle
Atténuation du noyau LPE (Frag Gap)PASS (unshare bloqué via sysctl)PASS (alerte eBPF + SIGSTOP gel + Air-Gap)Défense en profondeur vérifiée
Détection de port non autorisé (anomalie)PASS (liaison 0.0.0.0 signalée à risque ÉLEVÉ)PASS (liaison 0.0.0.0 signalée à risque ÉLEVÉ)100 % détecté et guidé
Prévention des ballonnements de journaux et des surcharges du processeurEmpreinte de journal zéro (désinstallé)PASS (réduction du bruit de 95 % / tampon de 2 Mo / plafond de 50 Mo)Bureau optimisé

C.3 Limites connues

LimitationImpactAtténuation
Sur certains noyaux, FAN_MARK_MOUNT sur tmpfs (/tmp) ne délivre aucun événementles écritures de fichiers sous /tmp ne sont pas surveillées par fanotify/tmp est éphémère et n'est pas un dossier utilisateur surveillé ; le ransomware cible ~/. Les échecs de marquage sont consignés explicitement
Pas de livraison fanotify sur les conteneurs overlayfs / tmpfsla détection d'explosion d'entropie dans le conteneur ne peut pas être validéevalidé sur du matériel réel (ext4) ; le harnais saute automatiquement via une sonde
Les opérations nftables de RoamSwitch partagent l'espace netfilter avec iptables-nft de DockerLes opérations des règles RoamSwitch peuvent interférer avec les règles NAT de Dockerdocumenté comme une mise en garde opérationnelle ; isolé dans la table inet roamswitch dédiée, mais les opérations d'ensemble de règles telles que nft flush ruleset doivent être évitées
Le Link Guard voit le DoH d’un navigateur uniquement via TLS SNI ; Encrypted Client Hello (ECH) cache cela aussiune fois qu'ECH est largement déployé, une connexion utilisant ECH à un site prenant en charge ECH n'est pas identifiable par son nom d'hôtela liste de blocage locale et les heuristiques agissent toujours sur DNS/HTTP et TLS non-ECH ; La protection contre les menaces DNS (§4.5, opt-in) couvre le chemin du résolveur
La fraîcheur du programme de mise à jour quotidien dépend de la cadence de publication lorsque updates.enabled = falseavec les mises à jour désactivées, le flux est aussi actuel que le dernier apt upgradeles détections les plus graves (homographe de marque) ne nécessitent aucune alimentation ; réinscrivez-vous ou activez le DNS de protection contre les menaces pour une couverture toujours à jour