Diseño de Sistemas Lafine · Documento técnico

RoamSwitch para Linux
Documento técnico sobre arquitectura y seguridad

Un documento técnico que explica lo que hace RoamSwitch para Linux en su límite de privilegios. Evita el lenguaje de marketing; Las afirmaciones se pueden comparar con el comportamiento real del paquete distribuido y la autocomprobación en el apéndice.

Versión v1.6.0 Alcance RoamSwitch for Linux 1.1.0 (endurecimiento del kernel contra LPE / protección en tiempo de ejecución eBPF / congelación SIGSTOP de procesos atacantes / optimización de bajo consumo de Falco) Requisitos systemd + nftables Publicado 2026-09-06

§1

RoamSwitch para Linux es una aplicación residente de seguridad de red y diagnóstico de sistemas que lleva el modelo de defensa de red de confianza cero de macOS RoamSwitch a Linux (entornos systemd + nftables).

Esta edición está dirigida a máquinas cliente (estaciones de trabajo, portátiles, computadoras de placa única) y asume un comportamiento autónomo que sigue a la máquina mientras se mueve entre redes. Una edición de servidor reforzado/infraestructura sin cabeza (RoamSwitch Server Edition: denegación predeterminada siempre activa, integridad FIM de ruta crítica, webhooks remotos y aplicación de políticas estáticas) se entrega como una compilación de servidor dedicado.

Identifica la red Wi-Fi/cableada conectada por su dirección MAC de puerta de enlace y cambia de forma autónoma el perfil de firewall activo nftables. Además de eso, proporciona tres capas de defensa intermedia en redes que no son de confianza: un túnel VPN + interruptor de apagado (WireGuard o Tailscale, la defensa principal), un bloqueo preventivo ARP/NDP y detección de suplantación de identidad ARP, además de detección conductual de ransomware (fanotify + entropía de Shannon + canarios), una protección de enlace pasiva que marca o bloquea conexiones de phishing (NFQUEUE + SNI), Port Anomaly Guard, mitigación BadUSB, preferencia de escalada de privilegios locales (LPE) del kernel (mitigación Frag Gap CVE-2026-53362), integración del sensor de amenazas en tiempo de ejecución eBPF (Falco/Tetragon) con congelación de procesos en menos de un segundo (SIGSTOP) y red Air-Gap aislamiento, una evaluación del estado de seguridad de 24 elementos y un servidor de protocolo de contexto modelo (MCP) integrado.

Este documento técnico describe la arquitectura, el modelo de amenaza y el diseño de cada mecanismo de defensa y, en particular, cómo se garantiza a nivel de código el principio de “procesamiento totalmente local; lo único que envía la máquina es una solicitud de datos de detección firmados, que no contienen nada sobre usted”. Evita el lenguaje de marketing; Las afirmaciones se pueden comparar con el comportamiento real del paquete distribuido (binario) y la autoverificación en el apéndice. RoamSwitch para Linux es un software gratuito propietario y su código fuente no está publicado (§11).

Principios de diseño
PrincipioDetalle
Telemetría ceroEl producto no envía nada sobre usted o su máquina a nadie. No hay telemetría, análisis, informes de fallos, métricas de uso, configuración remota ni servidor de activación de licencias.
Recibir solo actualizacionesLa única solicitud saliente que realiza el producto es un GET una vez al día de un manifiesto fijo y firmado de lafine.net/updates/v1: la lista de sitios fraudulentos para Link Guard, la versión de firma de ClamAV, la última versión de la aplicación, los mapas de CVE de paquetes (Homebrew/npm/PyPI/crates.io/RubyGems/Packagist/Go/Maven), el mapa de CVE de la verificación activa de vulnerabilidades, y la lista de nombres de paquetes npm populares usada para la detección de typosquatting. No contiene cadenas de consulta, cookies, encabezados de identificación ni información sobre usted. updates.enabled = false lo apaga por completo; Luego, el producto funciona con datos agrupados sin contacto externo.
Procesamiento totalmente localCada evaluación, detección y auditoría se ejecuta hasta su finalización en la máquina local. El análisis de seguridad de URL y el escaneo secreto evalúan sus entradas de forma heurística sin transmitirlas a ninguna parte.
Mínimo privilegioLas operaciones privilegiadas están confinadas a un demonio raíz; la interfaz de usuario, la CLI y el servidor MCP los solicitan a través de un IPC de socket de dominio Unix. El demonio no abre ningún socket TCP/UDP; la protección de enlace utiliza sólo el canal de veredicto AF_NETLINK NFQUEUE (kernel ↔ espacio de usuario, sin salida de paquetes).
Fallo cerradoAir-Gap (aislamiento de emergencia) sobrevive al reinicio del demonio y se reactiva en cuestión de segundos si sus reglas se eliminan externamente.
Licencias sin conexiónLas licencias Pro/Business se verifican únicamente mediante la verificación de firma Ed25519. No se produce ninguna llamada a un servidor de activación.

§2

RoamSwitch para Linux se dirige principalmente a computadoras portátiles o estaciones de trabajo móviles que se desplazan entre redes que no son de confianza.

Atacantes en alcance

  • Un atacante en la misma LAN: escaneos de puertos en Wi-Fi compartido, Suplantación de ARP/NDP (incluidos anuncios de enrutadores no autorizados) para un intermediario, DHCP no autorizado, rastreo pasivo después de una inundación de MAC, acceso no autorizado a un servidor de desarrollo o API LLM local vinculado accidentalmente a 0.0.0.0.
  • Dispositivos USB maliciosos (BadUSB): hacerse pasar por un teclado e inyectar pulsaciones de teclas antes de que la pantalla se bloquee; Almacenamiento masivo USB no registrado para filtración de datos o para transportar malware.
  • Ransomware/malware sin archivos: ingresa a través de un archivo descargado y cifra de forma masiva los documentos del usuario.
  • C2 basado en DNS y phishing: malware que utiliza resolución de nombres para llegar a un servidor C2 o un sitio de phishing.

Fuera de alcance

  • Un atacante que ya tiene raíz; rootkits a nivel de kernel o firmware.
  • Ataques que eliminan físicamente el disco (el dominio de cifrado de disco completo; RoamSwitch diagnostica si el cifrado está presente pero no cifra).
  • Control de uso compartido inalámbrico de proximidad estilo AirDrop (sin mecanismo nativo del sistema operativo en Linux; no compatible).

§3

RoamSwitch para Linux se implementa en Rust en siete cajas. Toda la comunicación con el demonio pasa por /run/roamswitch/roamswitch.sock (un socket de dominio Unix). No hay ningún socket TCP/UDP de escucha en el demonio, la aplicación o el servidor MCP. Lo único que la aplicación binds tiene es un único socket Unix para evitar una segunda instancia.

# Espacio de usuario (sin privilegios)
roamswitch-app      Bandeja GTK3 + AppIndicator
roamswitch (CLI)    Frontend ligero de shell
roamswitch-mcp      stdio JSON-RPC (iniciado por clientes de IA)
      │
      │  AF_UNIX  /run/roamswitch/roamswitch.sock  (solo IPC local)
      ▼
roamswitch-daemon   root / systemd Type=notify + WatchdogSec=30
  · Control de perfiles nftables (tabla inet roamswitch)
  · Bucle centinela (detección de red y aplicación de perfiles)
  · Túnel VPN + interruptor de corte (WireGuard: wg-quick / roamswitch_vpn, Tailscale: roamswitch_ts)
  · Bloqueo preventivo ARP/NDP (fijación de tabla neigh) / detección
  · Guardia de anomalías de puerto (roamswitch_dev_guard)
  · Guardia fanotify (ransomware / malware)
  · Guardia de enlace (NFQUEUE — inet roamswitch_linkguard)
  · Motor de señuelos / Vault de cuarentena
  · Endurecimiento del kernel contra LPE (desactivación de userns, Yama LSM)
  · Integración en tiempo de ejecución eBPF (/var/run/roamswitch/events.sock)
  · Congelación SIGSTOP de procesos atacantes en milisegundos y vínculo con Air-Gap
  · Monitorización USB (evdev EVIOCGRAB — BadUSB) / cola de aprobación
  · Verificación de licencia Ed25519

roamswitch-updater  Un ayudante de temporizador systemd independiente. El único crate
                    con una pila HTTP/TLS (GET diario de un manifiesto firmado)
roamswitch-core     Biblioteca de lógica pura (compartida por todos los crates)
roamswitchkit       SDK de cliente MCP
Separación de privilegios
ComponenteprivilegioRol
demonio-roamswitchraíz (systemd, Type=notify + WatchdogSec=30)Todas las operaciones privilegiadas. Como escritor único, controla las unidades nftables, DNS y systemd.
aplicación-roamswitchiniciar sesión usuarioGUI GTK3 + bandeja AppIndicator. Edición y visualización de configuración únicamente; cada acción privilegiada pasa por IPC.
conmutador de itinerancia (CLI)iniciar sesión usuarioFrontal de carcasa delgada que utiliza el mismo zócalo IPC.
roamswitch-mcpproceso generado por el cliente AIestándar JSON-RPC. Proporciona información de diagnóstico de solo lectura.

Toda la comunicación con el demonio pasa por /run/roamswitch/roamswitch.sock (un directorio con permisos equivalentes a 0700). La configuración del usuario se almacena como texto sin formato JSON en ~/.config/roamswitch/config.json. El demonio lee /home/*/.config/roamswitch/config.json con privilegios de root (se ejecuta con HOME=/root). La configuración nunca sale de la máquina; no hay registro de cuenta ni sincronización en la nube.

§4

El bucle centinela (ciclo de 5 segundos de forma predeterminada) lee la MAC de la puerta de enlace predeterminada de /proc/net/arp y ip neigh y la compara con las MAC registradas en config.json. Se utiliza MAC en lugar de SSID porque un SSID es trivialmente falsificado. La notificación de escritorio que se muestra cuando el perfil cambia indica el razón para el cambio (“una red no registrada” / “su configuración para la red registrada X” / “sin conexión de red”).

Perfiles
PerfilSituacióncomportamiento de nftables
abierto (confiable)Una red doméstica o corporativa registradapolicy accept. Tráfico local permitido.
equilibradoNo registrado pero configurado como relativamente seguroEntrada denegada por defecto. Sólo se permiten conexiones establecidas y lo; Se monitorea la exposición del puerto expuesto.
bloqueo (protección ausente)Wi-Fi público/red no registradaTodos los paquetes entrantes se dejaron caer sigilosamente. Los servicios compartidos se detuvieron automáticamente (optar por participar).

Todas las reglas están aisladas en una tabla nftables dedicada llamada inet roamswitch y nunca chocan con otra configuración de firewall (ufw/firewalld). El demonio como escritor único aplica el vencimiento de la anulación manual (1 hora / 2 horas / 4 horas / hasta medianoche / hasta que se borre / hasta la próxima desconexión). La GUI nunca escribe una caducidad; vuelve a leer el config.json que el demonio reescribió en el siguiente tic y lo refleja en la interfaz de usuario (evitando un conflicto).

Air-Gap (aislamiento de red de emergencia)

Un modo de aislamiento total que establece policy drop (prioridad -100) en los ganchos de entrada y salida de la tabla inet roamswitch, permitiendo solo lo.

  • Falla cerrada: al reiniciar el demonio, la detección del archivo de marcador (/run/roamswitch/airgap.active) reafirma el aislamiento.
  • Autocuración: si un proceso externo elimina las reglas con nft delete table, el bucle centinela se vuelve a aplicar en segundos.
  • Caducidad automática: 600 segundos después de la activación (idéntico a macOS maxAirGapDuration), el aislamiento se levanta automáticamente, evitando una pérdida permanente de conectividad por un clic incorrecto.
table inet roamswitch {
    chain input {
        type filter hook input priority -100; policy <accept|drop>;
        iif "lo" accept
        ct state established,related accept
        # balanced/lockdown: se descarta (drop) todo lo demás
    }
    chain output {
        type filter hook output priority -100; policy <accept|drop>;
        # policy drop solo durante el Air-Gap; solo se permiten lo y ct established
    }
}

Protección de enlace pasiva (detección de conexión de phishing)

El demonio observa hacia dónde van las conexiones salientes y señala (o, en el caso del conjunto limitado de "claramente phishing", bloquea) las conexiones a hosts peligrosos. Reemplaza el antiguo verificador de pegar una URL, que requería que el usuario actuara.

  • Interception: una tabla nftables dedicada inet roamswitch_linkguard conecta la ruta output y pone en cola las preguntas de DNS y las conexiones web nuevas/tempranas a un trabajador del espacio de usuario a través de NFQUEUE. NFQUEUE es un canal de veredicto del espacio de usuario del kernel↔ sobre AF_NETLINK; el demonio no vincula ningún socket y no origina ningún paquete. Las reglas de cola llevan bypass, por lo que si el trabajador no está corriendo, el tráfico pasa sin obstáculos (Air-Gap sigue siendo la parada forzosa independiente).
  • Hostname sources: el nombre de la pregunta DNS, TLS ClientHello SNI (por lo que un navegador que usa DoH todavía está cubierto por el nombre de host) y el encabezado HTTP Host de texto sin formato. ClientHello cifrado (ECH), una vez ampliamente implementado, es un punto ciego conocido.
  • Veredicto (roamswitch-core, lógica pura): un host se compara con la fuente de phishing/amenazas local y un conjunto de heurísticas fuera de línea: IDN/homógrafo confuso de una marca protegida, token de marca en un dominio no oficial, host con IP sin formato, TLD de alto riesgo.
Modo (linkGuard.mode)Hit de feed u homógrafo de marcaOtras señales sospechosas
offno inspeccionadono inspeccionado
warnconexión retenida hasta 8 s + un mensaje de aprobación de permitir/bloquearsolo notificación
block (predeterminado)conexión caída + un diálogo de permiso (una vez por host)solo notificación

Sólo se bloquea de forma permanente un acceso a un feed o un host homógrafo de marca; Todo lo que la heurística señala por sí sola es una advertencia. warn modo mantiene la conexión a un host peligroso por hasta 8 segundos mientras pregunta al usuario; si la retención expira sin respuesta, es fail-closed (los paquetes se descartan y el veredicto no se almacena en caché), sin responder "¿está bien este sitio?" no debe significar "sí" y el siguiente intento vuelve a aparecer. El modo block muestra una notificación y un diálogo de permiso por host (un navegador que abre muchas conexiones al mismo host bloqueado ya no inunda las notificaciones). En un cuadro de diálogo de aprobación peligroso, el botón predeterminado es "Seguir bloqueando" y "Permitir" tiene el estilo de opción silenciosa y no predeterminada. Se puede permitir un host bloqueado de forma permanente o durante cinco minutos a partir de la notificación (linkGuard.allowlist).

DNS se inspecciona, nunca se falsifica: una pregunta de DNS incluida en la lista bloqueada produce solo una notificación; La aplicación de la ley ocurre en la conexión TCP posterior, por lo que RoamSwitch nunca inyecta una respuesta DNS sintética. El feed es una lista compilada de dominios de phishing/fraude, enviada en el paquete y actualizada por el actualizador diario (§11). Sin ninguna fuente presente, la heurística fuera de línea aún se ejecuta. La firma Ed25519 del archivo de alimentación se verifica antes de cargarlo; un feed incorrecto o faltante no cumple con "solo heurísticas" y nunca con "permite todo".

Túnel VPN + interruptor de emergencia (la principal defensa MITM)

Protección anti-MITM que no depende de la integridad de la capa 2. En una red que no es de confianza, un túnel cifrado siempre activo hacia un punto final confiable hace que la suplantación de ARP/NDP local, el DHCP no autorizado y el rastreo pasivo sean irrelevantes: el atacante solo ve texto cifrado. El bloqueo ARP/NDP y la detección a continuación son secundarios a esta característica.

Dos backends para elegir: “WireGuard (archivo de configuración)” o “Tailscale (nodo de salida)”. RoamSwitch no implementa criptografía propia y no es un proveedor de VPN. Ambos backends son dependencias opcionales; si está ausente, la GUI muestra el comando de instalación.

(A) Servidor WireGuard

  • No se proporciona ningún servidor VPN: utiliza una configuración WireGuard que proporciona el usuario: un .conf de un proveedor como Mullvad, IVPN o Proton VPN, o el propio servidor WireGuard del usuario (un VPS o un servidor doméstico). No se envía ninguna configuración predeterminada.
  • Config: el demonio valida el .conf y lo almacena en /etc/wireguard/roamswitch.conf (0600, interfaz roamswitch). No puede vivir en otro lugar: el perfil AppArmor wg-quick en Ubuntu 24.04+ / Debian 13 niega que wg-quick lea un .conf fuera de /etc/wireguard/, incluso como root. Una configuración de túnel dividido (AllowedIPs no 0.0.0.0/0 / ::/0) está marcada como "no todo el tráfico está protegido".
  • Kill-switch: una tabla nftables dedicada inet roamswitch_vpn (policy drop, ambos ganchos) elimina todo excepto el loopback, la interfaz del túnel (roamswitch, coincidente con oifname), UDP a la IP del punto final anclado, DHCP e ICMP. Se instala antes de que se abra el túnel (el punto final se resuelve en IP fijas a través de getent ahosts primero), por lo que no hay ventana de fuga. Si wg-quick up falla, el interruptor de emergencia permanece activo.

(B) Backend de escala trasera

  • Para usuarios que ya ejecutan Tailscale. RoamSwitch not ejecuta tailscale up / inicia sesión / instala tailscaled; lee tailscale status --json y ejecuta tailscale set --exit-node=<node> / --exit-node= (claro).
  • Se requiere un nodo de salida: la protección anti-MITM solo se mantiene con un nodo de salida que enruta todo el tráfico. Sin ninguno configurado, la protección no está activada y la interfaz de usuario advierte "no protegido". Si el nodo elegido se desconecta, la protección se desarma automáticamente y se notifica al usuario (enrutar todo a través de un nodo inactivo bloquearía la conexión).
  • Kill-switch (inet roamswitch_ts, policy drop): el transporte de Tailscale no se puede fijar a una única IP de punto final (relés DERP + pares móviles), por lo que es más flexible que el de WireGuard. Permite: loopback, la interfaz de túnel (tailscale0), los rangos CGNAT 100.64.0.0/10 y fd7a:115c:a1e0::/48, STUN (udp/3478), DERP (tcp/443), udp/41641, DHCP, ICMP, MagicDNS (100.100.100.100:53), conexiones establecidas. Todo lo demás (UDP arbitrario, DNS a un solucionador local, SMB, mDNS, HTTP de texto sin formato, TCP arbitrario) se descarta.
  • Advertencias sobre el interruptor automático: (1) lista de permitidos más amplia que el backend de WireGuard (udp/3478, tcp/443, todo el CGNAT /10). (2) Un atacante en ruta todavía ve metadatos (que Tailscale está en uso, región DERP, tiempo) y puede eliminar/retrasar, pero no puede leer la carga útil tunelizada. (3) Cuando se bloquea el UDP directo, la confidencialidad recae en el DERP TLS de certificado anclado de Tailscale. (4) Con MagicDNS desactivado + un solucionador local, el DNS se interrumpe mientras está armado (advertencia de UI). (5) Se debe iniciar sesión en los portales cautivos antes de habilitarlos.

Common: armado solo cuando vpn_on_untrusted_enabled y la red no es de confianza (level != open). En una red confiable, el nodo de salida se borra y se elimina el interruptor de emergencia (nunca tailscale down). Desactivado de forma predeterminada, opte por participar. El túnel WireGuard/transporte Tailscale va a el punto final VPN/tailnet propio del usuario y no está relacionado con la infraestructura de lafine (§9).

Bloqueo preventivo ARP/NDP

En el momento en que se une a una red que no es de confianza, las direcciones MAC de la infraestructura de enlace que un atacante MITM necesitaría suplantar se fijan en la tabla de vecinos del kernel como PERMANENT entradas (estáticas). Una vez fijado, el kernel ignora las respuestas ARP falsificadas y los anuncios de vecinos.

  • Qué está anclado: (1) la puerta de enlace predeterminada IPv4, (2) el enrutador predeterminado IPv6 (a menudo una dirección fe80:: local de enlace), (3) cualquier solucionador de DNS en el enlace (se accede a una resolución pública a través de la puerta de enlace y se omite). Los vecinos IPv6 están fijados con ip -6 neigh replace ... nud permanent.
  • Las redes confiables nunca están fijadas, por lo que un reinicio del enrutador doméstico no puede bloquear al usuario. Volver a fijar en cada conmutador de red (TOFU); se detecta una conmutación por error legítima en la siguiente reconexión. Las entradas fijadas se registran en /var/lib/roamswitch/arp_lock.json.
  • Activado de forma predeterminada (política de Community Edition; mismo desglose que la versión macOS Pro). Alternar: gateway_arp_lock_enabled.

Detección de falsificación de ARP (notificar primero)

Monitorea /proc/net/arp para detectar una asignación de IP a múltiples MAC y detectar un cambio repentino sospechoso en la MAC de la puerta de enlace. En confinamiento: cortar todo el tráfico (Air-Gap) + notificar. En redes equilibradas/confiables: notificar sin cortar; el usuario activa el Air-Gap de emergencia desde RoamSwitch. Esto (a) evita que un atacante utilice un solo paquete ARP falsificado como arma para provocar una interrupción autoinfligida, y (b) evita que el reinicio del enrutador o la itinerancia del punto de acceso lo active por error. Alternar: arp_spoof_guard_enabled.

Guardia de anomalías del puerto

Contiene automáticamente un puerto de escucha recién expuesto a la LAN externa (una puerta trasera, C2 o un servidor de desarrollo/API LLM local vinculado accidentalmente a 0.0.0.0). El veredicto es relativo a la línea base, no "número de puerto peligroso". Al habilitarlos, los ejecutables actualmente expuestos se aprenden como "conocidos"; a partir de entonces, solo se marca un ejecutable expuesto recién aparecido (identidad = la ruta del ejecutable, ajustes normalizados a snap:<name>). Los demonios del sistema están fuera de alcance. La contención se realiza a través de la tabla inet roamswitch_dev_guard: coloque TCP en ese puerto desde cualquier lugar menos lo; la máquina sigue usándolo. Tras la contención automática, se presenta una notificación inmediata en el escritorio y un cuadro de diálogo de confirmación ("Permitir este puerto" / "Mantener bloqueado"), lo que permite la inclusión permanente en la lista blanca con un solo clic. También se puede permitir cualquier puerto individualmente y recuperar la línea de base desde la pantalla de diagnóstico de puertos. Activado de forma predeterminada. Alternar: port_anomaly_guard_enabled. Portado desde macOS.

Detección de riesgos de Docker y protección contra la evasión del firewall

Los puertos publicados por Docker (-p) tienen un problema conocido de evasión del firewall estándar del host, por lo que se insertan permanentemente reglas de inspección en la cadena DOCKER-USER, bloqueando cualquier tráfico externo no permitido explícitamente (no requiere configuración, activo de forma predeterminada). Además, se vigila docker events en tiempo real para detectar al instante cuándo se inicia un contenedor --privileged o se monta /var/run/docker.sock, un riesgo de escape del contenedor, y notificarle de inmediato. Como esto indica una configuración de riesgo y no un compromiso confirmado, solo se notifica, sin bloqueo automático.

Escáner de fugas de secretos y claves API

Detecta claves API (OpenAI, Anthropic, AWS, GitHub, Slack, Stripe y más) y claves privadas SSH mediante entropía de Shannon y coincidencia de patrones. roamswitch audit-secrets <text|archivo|directorio> analiza texto y archivos, además de un directorio completo de forma recursiva (omitiendo .git, node_modules, etc.; se omiten los archivos de más de 2 MB o que parezcan binarios). La misma función también está disponible mediante la herramienta MCP audit_secrets y el método audit_secrets_directory() del SDK de Python. El contenido nunca se transmite a ningún lugar.

Asistente de configuración de primera ejecución y UI de confirmación

El paquete se envía /etc/xdg/autostart/roamswitch.desktop, por lo que el asistente de configuración se inicia en el primer inicio de sesión después de la instalación (después solo reside en la bandeja). Al habilitar/deshabilitar un guardia de seguridad se muestra un cuadro de diálogo de confirmación para los mismos guardias que la compilación de macOS (anomalía de puerto, autocontención ARP, almacenamiento USB, teclado BadUSB, Bluetooth). Las decisiones en el momento del evento (un teclado USB desconocido, una unidad USB no registrada, un puerto desconocido bloqueado automáticamente, un Air-Gap de emergencia) se presentan como diálogos modales.

§5

Detección de ráfagas de entropía de Shannon · Escaneo YARA

Los eventos de escritura se rastrean por PID. Si un solo proceso crea 20 o más archivos distinct con entropía ≥ 7,92 en 5 segundos, se trata como cifrado masivo de ransomware: el proceso se congela con SIGSTOP y se activa Air-Gap.

  • Separación completa del escaneo YARA y el seguimiento de entropía: la inspección de malware YARA se aplica a todos los archivos escritos sin excepción (omisión cero, escaneo ~/.cache/, node_modules/, /tmp/ y archivos). Mientras tanto, el análisis de ráfaga de entropía del ransomware excluye los formatos comprimidos naturalmente (.zip, .tgz, .tar.gz, .gz, .png, .jpg, .mp4, .wasm) y los administradores de paquetes verificados (npm, npx, cargo, rustc, dpkg, apt, tar) en funcionamiento. en árboles de compilación/caché para eliminar congelaciones de SIGSTOP con falsos positivos.
  • Las sobrescrituras repetidas del mismo archivo (por ejemplo, las tres pasadas de shred) cuentan como un evento.
  • Protección de procesos críticos: los PID se comparan con una lista NEVER_FREEZE codificada (systemd, dockerd, NetworkManager, sshd, gnome-shell,…) y nunca se congelan, lo que evita un bloqueo en toda la máquina.

Canarias (archivos señuelo)

Los archivos señuelo se colocan en las carpetas Documentos, Escritorio, Descargas e Imágenes del usuario y en un directorio dedicado, y se comparan con una línea base SHA-256 en un ciclo de 3 segundos. Cualquier cambio de nombre, eliminación, truncamiento o cambio de contenido activa Air-Gap inmediatamente. Debido a que el demonio se ejecuta como root, enumera /home/* e implementa valores canarios en los directorios de cada usuario real.

monitoreo fanotify · Bóveda de Cuarentena · ClamAV

  • El demonio monitorea /home, /var/tmp, /dev/shm en el nivel de montaje y / en el nivel del sistema de archivos a través de FAN_CLASS_CONTENT (respaldo FAN_CLASS_NOTIF).
  • Notificar primero, sin cuarentena silenciosa. Un simple acceso de YARA/ClamAV nunca se pone en cuarentena silenciosa ni FAN_DENY'd. Una firma real genera una solicitud modal en /run/roamswitch/approvals.json (Cuarentena/Permitir/Más tarde); nada ingresa a la bóveda hasta que el usuario lo confirme. Solo un execve real tiene FAN_DENY, y solo cuando pre_exec_blocking_enabled está activado. El tiempo de aprobación se agota en caso de error de apertura.
  • Las firmas de prueba como EICAR solo se registran en el historial: la cadena de prueba estándar de la industria no genera ninguna notificación, solo una entrada en el historial de notificaciones, y nunca se pone en cuarentena ni se bloquea, tanto en la protección fanotify como en la de descarga.
  • Los escáneres YARA y ClamAV respetan una lista de rutas scan_exclusions configurada por el usuario (rutas absolutas, aplicadas recursivamente; incluye el clamav_exclusions heredado). "Permitir" en el mensaje y "Restaurar" en la pestaña Cuarentena se agregan a él, por lo que el mismo archivo no se vuelve a marcar.
  • El malware real detectado y confirmado se reubica en ~/.local/share/roamswitch/quarantine/. La bóveda es 0700; cada muestra es 0400 (solo lectura, no ejecutable). Al restaurar, el archivo vuelve a 0644 y se envía al propietario del directorio de destino.
  • El bucle de evento de permiso no realiza ninguna E/S del sistema de archivos: la configuración se lee mediante un subproceso en segundo plano dedicado en una instantánea Mutex<GuardConfig>; Los descriptores de acceso a la ruta activa simplemente bloquean y copian. Esta es una invariante de diseño: bloquear FAN_OPEN_PERM congelaría la máquina.
  • Cuando ClamAV está presente, los ejecutables recién descargados (.sh, .deb, .elf,…) y los modelos de IA peligrosos (.pkl, .pt) se escanean en la base de datos local. ClamAV es una dependencia opcional; las otras defensas funcionan sin él. Cuando se instala, el actualizador diario (§11) invoca freshclam para que la base de datos de firmas se mantenga actualizada.

Prioridad y endurecimiento de la escalada de privilegios locales (LPE) del kernel

Cuando un atacante o malware consigue un punto de apoyo para un usuario sin privilegios, la defensa en profundidad impide explotar las vulnerabilidades del kernel de Linux para obtener privilegios de root.

  • Deshabilitación de espacios de nombres de usuarios sin privilegios (mitigación de Frag Gap CVE-2026-53362): muchas vulnerabilidades LPE del kernel de Linux moderno dependen de usuarios sin privilegios que llaman a unshare(CLONE_NEWUSER) para crear espacios de nombres de usuarios aislados y, posteriormente, acceden a estructuras del kernel no inicializadas o subsistemas de red heredados con capacidades elevadas de espacios de nombres. RoamSwitch evalúa y aplica user.max_user_namespaces = 0 (o kernel.unprivileged_userns_clone = 0) mediante un asistente de configuración o refuerzo con un solo clic. Esto cierra la superficie de ataque de procesos sin privilegios incluso con kernel de día cero sin parches.
  • Protección de memoria Yama LSM: aplicar kernel.yama.ptrace_scope = 1 (o 2) evita que procesos no autorizados se conecten a través de ptrace o lean la memoria a través de /proc/$pid/mem, salvaguardando las sesiones del navegador y las claves privadas GPG/SSH.
  • Supresión de volcado de núcleo: la configuración fs.suid_dumpable = 0 evita que procesos sensibles que fallan escriban volcados de memoria de texto sin formato en el disco.
  • /tmp y /dev/shm noexec Mount Defense: para evitar ataques de caída y ejecución de carga útil, RoamSwitch vuelve a montar /tmp y /dev/shm con noexec,nosuid,nodev cuando se conecta a redes que no son de confianza.

Sensor de amenazas en tiempo de ejecución de eBPF y congelación de procesos autónomos (eBPF Guard de escritorio)

El demonio cliente RoamSwitch incluye integración nativa con modernos sensores eBPF integrados en el kernel (Falco/Tetragon/BTF).

# Detección de amenazas en tiempo de ejecución eBPF y flujo de interceptación autónoma
[Proceso malicioso (LPE/malware)]
    │ Ejecución de llamada al sistema ilegal (intento de explotación de Frag Gap)
    ▼
[Kernel de Linux (sonda eBPF)]
    │ Búfer circular eBPF (diseño compacto de 2 MB)
    ▼
[Falco (RoamSwitch Optimized)]
    │ Socket UNIX directo en memoria (/var/run/roamswitch/events.sock)
    ▼
[roamswitch-daemon (root)]
    ├─► ① Congelación del proceso atacante en milisegundos: kill(pid, SIGSTOP) [estado: Ts]
    ├─► ② Corte de red completo: nftables input/output drop [Air-Gap activado]
    └─► ③ Alerta de emergencia de escritorio: modal GTK3 y notificación libnotify
  • Direct UNIX Domain Socket IPC (/var/run/roamswitch/events.sock): las alertas de Falco u otros sensores eBPF se reciben directamente a través de un socket UNIX en memoria sin escribir en los registros del disco, lo que elimina la latencia de E/S del disco y permite transferencias de respuesta en menos de un segundo.
  • Mitigación autónoma multicapa (congelación de procesos y separación de aire): cuando se recibe un evento con prioridad Critical o Emergency (como LPE del kernel, escape de espacio de nombres o ejecución de ransomware), el demonio ejecuta SIGSTOP en el PID infractor para pausar inmediatamente la ejecución del proceso (estado: Ts), implementa policy drop en inet roamswitch (Air-Gap) y activa una notificación inmediata en el escritorio.
  • Ajuste de bajo consumo para escritorio y prevención del crecimiento excesivo de registros (RoamSwitch Optimized) — para limitar el consumo de batería, la carga de CPU y el agotamiento del disco en portátiles y estaciones de trabajo, se incluye un perfil optimizado (99-roamswitch-optimized.yaml):
    • Filtrado de gravedad (priority: warning): filtra el 95 % de los eventos de aviso/información de rutina.
    • Kernel Early Drop (drop_failed_exit: true): descarta las salidas de llamadas al sistema fallidas directamente en el controlador del kernel, reduciendo a la mitad los cambios de contexto y la carga de la CPU.
    • Búfer en anillo compacto (cpus_for_each_buffer: 2): reduce el tamaño del búfer en anillo a 2 MB, manteniendo la RAM residente entre 30 y 50 MB y el uso de la CPU <1 %.
    • Límite de rotación de registros obligatorio (/etc/logrotate.d/roamswitch-falco): aplica un límite estricto de 50 MB con rotación comprimida de séptima generación.
  • Resiliencia híbrida (modo independiente frente a eBPF): sin Falco, RoamSwitch protege el sistema a través del kernel sysctl (user.max_user_namespaces = 0), perfiles móviles de nftables, seguimiento de entropía de fanotify y canarios. Con Falco, la telemetría conductual interna profunda intercepta exploits avanzados de día cero y congela los procesos de los atacantes en tiempo real.

§6

Se monitorean los eventos USB; Se realiza un seguimiento de los dispositivos de clase de teclado (HID) y del almacenamiento masivo USB. Desactivado de forma predeterminada (envío isEnabled = false, correspondiente a macOS USBKeyboardGuard / USBStorageGuard). Regístrese desde el asistente de primera ejecución o la pestaña USB; Al habilitarlo se muestra un cuadro de diálogo de confirmación.

Teclado USB fraudulento (inyección de pulsaciones de teclas)

  • Sin desautorización de puerto físico a nivel de kernel (importante). La implementación anterior (≤1.0.6) escribía 0 a /sys/bus/usb/devices/*/authorized para un teclado no registrado, desconectándolo físicamente. En un receptor combinado de teclado y mouse (común en una Raspberry Pi o mini PC), esto también desconecta el mouse, bloqueando una máquina sin entrada incorporada. RoamSwitch ahora se niega rotundamente a escribir authorized=0 en cualquier dispositivo que exponga una interfaz HID (bInterfaceClass 03), y el demonio vuelve a autorizar cualquier dispositivo authorized==0 HID al inicio para reparar automáticamente las máquinas bloqueadas por una versión anterior.
  • Las pulsaciones de teclas se eliminan en el software. Al detectar un teclado no registrado, se toma un evdev exclusivo EVIOCGRAB en el /dev/input/eventN de ese dispositivo (solo nodos con un controlador kbd en /proc/bus/input/devices, que coincida con VID:PID). El nodo del mouse está intacto. Este es el equivalente en Linux de macOS CGEventTap; el dispositivo permanece encendido.
  • Seguridad: el agarre solo se realiza si hay otro teclado para escribir (uno integrado o uno USB aprobado y conectado), por lo que una máquina con un solo teclado nuevo nunca queda bloqueada.
  • Diálogo de aprobación: junto con la captura, se pone en cola una solicitud de aprobación en /run/roamswitch/approvals.json y la GUI muestra un modal (Permitir/Denegar). Permitir incluir el dispositivo en la lista blanca y liberar el control. Fallo de apertura después de 3 minutos.

Almacenamiento masivo USB no autorizado

Cuando se inserta un dispositivo de almacenamiento masivo USB no registrado (sin interfaz HID), la protección está habilitada y la red no es confiable o está bloqueada, se mantiene con authorized=0 (seguro para un dispositivo que no es HID) y se muestra un cuadro de diálogo de aprobación. Permitir reautorizaciones y listas blancas; Negar lo mantiene retenido. La compilación de macOS se alineó con este modelo de “mantener solo lectura + mensaje de aprobación” en 1.7.4.

Identificación y derechos adquiridos

HID se determina a partir de bInterfaceClass == "03" y la línea Handlers= en /proc/bus/input/devices. Un receptor combinado (un VID:PID con una sección kbd y una de mouse) se fusiona con VID:PID. Un teclado no registrado presente en el inicio del demonio tiene derechos adquiridos; sólo se toma un teclado conectado en caliente después.

§7

El LinuxHealthChecker en roamswitch-core evalúa 24 ítems y produce una puntuación de 0 a 100, una calificación de A a F y asesoramiento por ítem. Desde el panel GTK, la CLI (roamswitch status) y MCP (get_security_report), el título, los detalles y la recomendación de los 24 elementos aparecen en el idioma del usuario (10 idiomas).

Categorías de evaluación
CategoríaArtículos de ejemplo
Disco/arranqueCifrado LUKS/dm-crypt, arranque seguro UEFI
control de accesoLSM (AppArmor / SELinux), auditoría de configuración SSH / sudo
Endurecimiento del granoendurecimiento de sysctl, desactivación de espacios de nombres de usuarios sin privilegios (mitigación de Frag Gap), control de volcado de núcleo, noexec en /tmp y /dev/shm
Actualizacionesconfiguración de actualización de seguridad automática
RedMonitoreo de suplantación de ARP, estado de bloqueo ARP/NDP de la puerta de enlace, auditoría de puertos expuestos, nivel de cifrado de Wi-Fi
malwareClamAV/fanotify (también comprueba que la guardia esté realmente ejecutándose)/monitoreo de entropía/noexec
NavegadorConfiguración de navegación segura de Firefox/Chrome/Chromium
DNS/USBDNS de protección contra amenazas, estado de confianza cero del bus USB

Cada verificación se basa en la lectura de archivos locales y la salida del comando (getenforce, mokutil, resolvectl, ss,…). No existe ninguna consulta externa de ningún tipo.

Calificación de reconocimiento de confianza. El refuerzo que RoamSwitch aplica deliberadamente no se aplica en una red (doméstica) confiable: fijar la MAC de la puerta de enlace como PERMANENTE (lo que bloquearía la LAN al reiniciar el enrutador), volver a montar /tmp y /dev/shm noexec (lo que interrumpe las compilaciones de paquetes y algunos instaladores) y el DNS de protección contra amenazas bajo el alcance predeterminado se muestra en verde. con una explicación en lugar de un "no reforzado" rojo, y señala que se aplica automáticamente en una red que no es de confianza. La verdad en tiempo de ejecución proviene de /run/roamswitch/state.json (active_level / network_trusted / fanotify_ready), escrita en cada ciclo por el demonio. El elemento fanotify verifica que el guardia esté realmente marcado y ejecutándose (/run/roamswitch/fanotify.ready), no simplemente que el kernel lo admita. El elemento de puertos expuestos lee el perfil activo del demonio (el código físico de MCP desapareció).

Endurecimiento por elemento. Los elementos fallidos que tienen una solución automatizada (kernel sysctl / Yama / core dumps, /tmp noexec, USB zero-trust, fijación de ARP de puerta de enlace, DNS de protección contra amenazas, reinicio del demonio cuando la guardia de fanotify está baja) llevan un botón "🔧 Endurecer" en el panel de GTK. El demonio se ejecuta como root, por lo que no se necesita pkexec excepto para reiniciar el demonio.

§8

roamswitch-mcp habla JSON-RPC a través de stdio y lo generan clientes de IA como Claude Desktop, Cursor y Antigravity. Cada herramienta es de solo lectura y completamente local.

Herramientas expuestas
HerramientaPropósito
obtener_informe_de_seguridadEvaluación de 24 ítems, puntuación y recomendaciones.
get_exposed_portspuertos expuestos y su estado de bloqueo del firewall
get_guard_statusnivel de protección actual y estado del módulo de defensa
auditoría_url_seguridadAnálisis heurístico de seguridad de URL (no busca el objetivo)
secretos_auditoríadetección de claves API/secretos en texto (no transmite el texto)
auditoría_seguridad_logsagregación de registros de autenticación/diario locales
get_quarantine_status / get_canary_statuscuarentena y estado canario
get_app_helpbúsqueda de la base de conocimientos incorporada
run_active_vuln_scanVerificación activa de vulnerabilidades, no destructiva y limitada a 127.0.0.1. La única herramienta que usa la red: desactivada por defecto, requiere activarla en los ajustes.
run_package_cve_scanCompara los paquetes instalados (Mac: Homebrew / Linux: dpkg, dnf, zypper, pacman) con un mapa de CVE local. No se realiza ninguna comunicación de red.
run_package_cve_scan_languagesCompara los archivos de bloqueo de dependencias de npm, PyPI, crates.io, RubyGems, Packagist, Go y Maven con el mismo mapa de CVE local. No se realiza ninguna comunicación de red.
verify_fimVuelve a calcular el hash de unos 150 archivos críticos del sistema y lo compara con la línea base guardada para verificar su integridad.
get_file_scan_guard_statusDevuelve la configuración del File Scan Guard (ClamAV) y el estado del baúl de cuarentena que utiliza.
get_port_anomaly_incidentsDevuelve el estado de la línea base de la protección de puertos anómalos, los puertos bloqueados automáticamente y hasta los 50 incidentes más recientes. La respuesta indica explícitamente que los puertos actualmente bloqueados son una instantánea del estado actual, sin marca de tiempo, distinta del historial de incidentes, que sí lleva marca de tiempo.
get_ebpf_incidentsDevuelve el estado de aislamiento actual del guardián de ejecución eBPF y el historial de incidentes que lo motivó.
get_resource_guard_incidentsDevuelve el historial del guardián de agotamiento de recursos y anomalías de procesos (fugas de memoria, bucles de fallo), con un nivel de confianza.
get_notification_historyDevuelve el historial de notificaciones enviadas por RoamSwitch (anomalías de auditoría de registros de seguridad, detecciones de ClickFix, etc.) de los últimos 7 días, las más recientes primero.
get_incident_timelineUnifica las detecciones de todos los guardianes en una única línea temporal, con la ascendencia de procesos y etiquetas MITRE ATT&CK (experimental).

El servidor MCP no abre ninguna conexión de red por sí mismo: se conecta al socket Unix del demonio mediante roamswitchkit o llama directamente a la lógica de roamswitch-core. La única excepción es run_active_vuln_scan, desactivado por defecto, que envía sondas no destructivas a 127.0.0.1, es decir, al propio host.

Una atribución incorrecta descubierta — y corregida — durante un simulacro con un LLM local
En septiembre de 2026, durante un simulacro (fire drill) en el que un LLM local (Qwen 3.8 27B) investigaba un incidente a través de este servidor MCP, descubrimos un caso en el que el modelo interpretó mal los datos devueltos por get_port_anomaly_incidents e incorporó, por error, un bloqueo de puerto antiguo y no relacionado a la narrativa de un incidente en curso. La causa: una instantánea sin marca de tiempo de los puertos actualmente bloqueados se devolvía en la misma respuesta que el historial real de incidentes, que sí tiene marca de tiempo, sin nada que distinguiera ambos. La corrección añade campos de nota explícitos que indican cuál de los dos campos es una línea temporal y cuál es solo una instantánea. Al volver a ejecutar el mismo escenario con el mismo modelo tras la corrección, este citó el texto de la nota y rechazó explícitamente atribuir el puerto antiguo al incidente actual. La eficacia de la corrección se verificó tanto con una prueba de regresión automatizada como con una nueva ejecución del LLM local real.

§9

RoamSwitch para Linux genera exactamente un tipo de solicitud saliente: el GET del actualizador diario de un manifiesto firmado (§11). Todo lo demás (cada evaluación, detección y auditoría) se completa localmente. RoamSwitch para Linux es un software gratuito propietario y su fuente no está publicada, por lo que las inspecciones siguientes fueron realizadas por lafine; los resultados están en 9.2 y los pasos del Apéndice C se pueden reproducir únicamente desde el paquete distribuido.

9.1 Método de auditoría

  1. Aislamiento de caja: se permite una pila HTTP/TLS en solo una caja, roamswitch-updater, que crea el binario de actualización independiente controlado por temporizador. scripts/audit_no_network.sh (ejecutado en CI, puerta) falla la compilación si roamswitch-core, roamswitch-daemon, roamswitch-app, roamswitch-mcp o roamswitchkit extraen reqwest / hyper / ureq / rustls / native-tls / openssl, o si algún archivo .rs fuera de roamswitch-updater usa TcpStream / TcpListener / UdpSocket / to_socket_addrs / lookup_host.
  2. Inspección del árbol de dependencia: se buscó en el Cargo.lock completo SDK de telemetría/análisis/informes de fallos (sentry, opentelemetry,…).
  3. roamswitch-updater review: su objetivo de solicitud único, la ausencia de una cadena de consulta/cookies/encabezados de identificación y su verificación Ed25519 de todo lo que descarga.
  4. Enumeración de subprocesos: se revisó cada Command::new(...) sitio de llamada.

9.2 Resultados

Resultados de la auditoría
Elemento de auditoríaResultado
Pila HTTP/TLSPresente en roamswitch-updater únicamente (ureq + rustls). No en core / daemon / app / mcp / kit
SDK de telemetría/análisis/informes de fallosNo presente en ninguna parte
TcpStream / TcpListener / UdpSocketNi una sola ocurrencia fuera de roamswitch-updater
API de socket en usoAF_UNIX (IPC local); AF_NETLINK (canal de veredicto NFQUEUE, nftables y control ip neigh - sin salida); AF_INET solo en roamswitch-updater. El túnel VPN (§4), cuando está habilitado, es wg-quick (backend WireGuard) o tailscaled (backend Tailscale), un subproceso, no el demonio, que envía tráfico al propio punto final/tailnet del usuario.
actualizador diarioUn GET https://lafine.net/updates/v1/manifest cada ~24 h. Sin cadena de consulta, sin cookies, agente de usuario genérico, sin identificadores. Todas las cargas útiles verificadas con Ed25519. updates.enabled = false lo desactiva por completo
Túnel VPN (§4)Desactivado de forma predeterminada. Cuando está habilitado, wg-quick construye un túnel WireGuard para el punto final en el .conf del usuario, sin relación con lafine. Resolución del nombre de host del punto final a través de getent ahosts (glibc NSS), no una API de socket Rust
Activación de licenciaVerificación de firma Ed25519 sin conexión. No hay comunicación con un servidor de activación.
Conclusión

RoamSwitch para Linux inicia exactamente un tipo de solicitud saliente: una descarga diaria, de solo recepción, de datos de detección firmados que no contiene información sobre el usuario o la máquina. Nada más en el producto contacta nunca a un servidor externo.

9.3 Lista completa de operaciones con cara al exterior

Cada operación que podría provocar que un paquete salga de la máquina local, directa o indirectamente:

#OperaciónDestinogatilloque se envía
1Actualizador diarioGET /v1/manifest y el archivo de alimentación cuando cambió su versiónlafine.net/updates/v1 (CDN)Temporizador systemd, una vez cada ~24 h con un retraso aleatorio. Apagado cuando updates.enabled = false o roamswitch-update.timer están deshabilitadosun GET HTTPS simple: sin cadena de consulta, sin cookies, genérico User-Agent, nada sobre el usuario o la máquina. Recibe un manifiesto firmado + feed
1afreshclam (actualizador propio de ClamAV), invocado por el actualizador diario cuando se instala ClamAVCDN del proyecto ClamAVcomo parte del #1tráfico de la propia ClamAV (un proyecto independiente); RoamSwitch solo lo inicia
2ping -c1 -W1 la puerta de enlace predeterminada de LAN (enlace local)para actualizar la caché ARP durante la detección de suplantación de ARPSolicitud de eco ICMP únicamente. Sin resolución DNS, sin carga útil
3iniciando el navegador del sistema (xdg-open)https://lafine.net/... (sitio del producto)solo cuando el usuario hace clic en un botón como "Abrir notas de la versión"el proceso RoamSwitch no abre ningún socket; entrega la URL al navegador del sistema operativo
4resolvectl dns — (no se produce ninguna comunicación)DNS de protección contra amenazas en una red que no es de confianza (optar por participar). <iface> es cada NIC física que lleva una ruta predeterminada (cableada + inalámbrica a la vez; lo / tailscale* / wg* / docker* / veth* excluidos); también se aplica en una red confiable cuando dns_scope = always_on; reconciliado cada ciclo centinelasólo cambia la configuración de resolución del sistema operativo; El propio RoamSwitch no envía ninguna consulta DNS
5actualizaciones del administrador de paqueteslos repositorios apt/dnf/zypper de la distrocuando el usuario ejecuta apt upgrade, etc., o hace clic en el botón GUI "Actualizar ahora" (que ejecuta apt-get / dnf / zypper a través de pkexec)RoamSwitch lee la salida apt-cache policy local e inicia el administrador de paquetes; no relacionado con lafine
6Túnel VPN (§4) — Backend WireGuard: el túnel wg-quick construye / Backend Tailscale: tailscale set --exit-node enruta todo el tráfico a través del nodo de salidael punto final VPN/tailnet propio del usuario (WireGuard: el punto final en .conf; Tailscale: el nodo de salida elegido y los relés DERP)cuando vpn_on_untrusted_enabled y la red no son de confianza. Desactivado de forma predeterminadatráfico cifrado WireGuard / Tailscale; el destino es el propio servidor VPN/tailnet del usuario, sin relación con lafine. Resolución de punto final WireGuard a través de getent ahosts (glibc NSS); Tailscale es impulsado por tailscaled (un proceso separado)

Todas las demás funciones de RoamSwitch: control de nftables, fijación ARP/NDP de la tabla vecina (ip neigh, sin salida de paquetes), protección de enlace (NFQUEUE, solo AF_NETLINK), escaneo de puertos (análisis de salida ss), monitoreo de ARP, evaluación de estado, monitoreo de entropía, canarios, fanotify, monitoreo de USB (evdev grab), cuarentena, auditoría de registros, URL y auditoría secreta, se completa usando solo el archivo local . lecturas y análisis de la salida del subproceso. El túnel VPN §4 es la única "comunicación saliente que el usuario configuró explícitamente", y su destino es el propio servidor VPN del usuario: no fluyen datos a la infraestructura de lafine.

§10

  • Sin cuenta: sin registro de usuario, sin inicio de sesión, sin solicitud de dirección de correo electrónico.
  • La configuración es solo local: se almacena en texto sin formato en ~/.config/roamswitch/config.json y nunca sale de la máquina. No hay sincronización en la nube.
  • Los resultados de la evaluación son solo locales: los informes de seguridad y los resultados de las auditorías de registros solo se muestran en la pantalla y, si el usuario así lo desea, se exportan a un archivo local.
  • Las claves de licencia se verifican sin conexión: los tokens de licencia Pro/Business contienen una firma Ed25519 y se verifican con una clave pública. No se realiza ninguna consulta a un servidor lafine.
  • No hay informes de fallas: en caso de pánico, no se envía ningún seguimiento de la pila a ninguna parte.
  • El actualizador diario no envía nada sobre usted: ni cadena de consulta, ni cookies, ni identificador de dispositivo o instalación, un User-Agent genérico. Es una descarga, no un informe. Los veredictos de protección de enlaces, los hosts bloqueados y los resultados del análisis se escriben en la vista de actividad local/se registran en el diario únicamente, nunca se transmiten.

§11

Ediciones
EdiciónParaPrecioLicencia
Edición comunitariauso personal de linuxGratisSoftware gratuito propietario (CLUF incluido)
Negocio (planificado)Gestión de flotas, distribución de políticas, apto interno firmado, SLA para organizaciones.PagadoLicencia comercial. Mismo binario + puerta de nivel

Los compradores de macOS RoamSwitch Pro Lifetime reciben funciones empresariales gratuitas en sus propias máquinas Linux.

Cadena de distribución y suministro

canalDetalle
APTOhttps://lafine.net/apt (stable main). Release firmado con una clave RSA-4096
RPMhttps://lafine.net/rpm (Fedora / openSUSE separado). repomd.xml firmado por GPG
AURroamswitch-bin (obtiene el tarball de versiones de GitHub, verifica sha256)
bola de taramd64 / aarch64 .tar.gz + .sha256 en versiones de GitHub
  • Piso de glibc fijado: los binarios de lanzamiento se crean dentro de un contenedor Debian 12 (bookworm, glibc 2.36). Esto evita discrepancias en las versiones de símbolos en Debian 12/Ubuntu 22.04 y posteriores. Un paso de CI de "verificar el nivel mínimo de glibc" falla en la compilación si se introduce una dependencia que requiere más de 2,36.
  • Gestión de claves de firma: la clave privada para la firma del repositorio apt/rpm existe solo en un secreto cifrado de GitHub Actions; sólo la clave pública se envía al repositorio.

11.3 El actualizador diario

roamswitch-updater es un binario independiente ejecutado por un temporizador systemd (roamswitch-update.timer, OnCalendar=daily con un retraso aleatorio de 3 horas y Persistent=true). Es el único componente que llega a la red. Cada carrera:

  1. GET https://lafine.net/updates/v1/manifest y su firma separada.
  2. Verifique la firma Ed25519 del manifiesto con una clave de firma de fuente de amenazas dedicada, separada de la clave de actualización de la aplicación Sparkle. El CI del lado del servidor vuelve a firmar el feed diariamente, de modo que la clave privada reside en un secreto de CI; limitarlo al feed significa que una filtración solo permite que un atacante proporcione una lista de bloqueo incorrecta (sumidero/advertencia: sin ruta de código, sin ruta de actualización de aplicaciones). La clave de firma de actualización de la aplicación nunca sale del llavero de macOS. Un manifiesto que no se verifica se descarta: el actualizador nunca recurre a datos sin firmar.
  3. Si la versión de la fuente de amenazas cambió, descargue la fuente, verifique su firma SHA-256 y Ed25519 e instálela de forma atómica para Link Guard (§4).
  4. Si ClamAV está instalado, invoque freshclam.
  5. Registre la última versión de la aplicación para recibir una notificación (el actualizador never instala la aplicación; en Linux, el usuario ejecuta apt upgrade).

El error de cualquier paso (fuera de línea, una firma incorrecta, falta freshclam) se registra como updates.lastError y el proceso aún sale de 0, por lo que la ejecución del temporizador nunca genera una notificación de error del sistema. Todo el mecanismo está desactivado por updates.enabled = false en updates.json o por systemctl disable --now roamswitch-update.timer; Luego, el producto se ejecuta con los datos incluidos en el paquete. La fuente de amenazas también se envía dentro del paquete, por lo que una instalación nueva tiene una fuente funcional antes de que se ejecute el actualizador, y apt upgrade la actualiza incluso con el actualizador deshabilitado.

§12

  • OS: Ubuntu 22.04/24.04 y posteriores, Debian 12 y posteriores, Linux Mint/Pop!_OS/elemental/Zorin, Raspberry Pi OS de 64 bits (Bookworm), Ubuntu para Raspberry Pi
  • Arquitectura: x86_64 / aarch64
  • Requerido: systemd, nftables, iproute2 (ip neigh - el bloqueo ARP/NDP) (incorporado automáticamente por las dependencias .deb / .rpm)
  • Opcional: clamav (escaneo de malware), nmcli (detección de cifrado Wi-Fi), libnotify (notificaciones de escritorio), wireguard-tools (el backend WireGuard del túnel VPN + interruptor de apagado, §4), tailscale (su backend Tailscale, §4), polkit / pkexec (ejecutando una actualización desde la GUI)
  • No compatible: distribuciones que no son systemd (Alpine / Void / Devuan)
  • Display: 1280×720 o mayor (la ventana y la fuente se escalan automáticamente al tamaño de la pantalla, admitiendo pantallas pequeñas de Raspberry Pi)

Apéndice A

cajaPropósitoRed
serde/serde_jsonserialización de configuración e IPCninguno
tokiotiempo de ejecución asíncrono (features = ["full"], pero solo se utilizan sockets Unix)ninguno (sin TCP)
rastreo / rastreo-suscriptorregistro (local / diario)ninguno
este error / de todos modosmanejo de erroresninguno
expresión regularanálisis de cadenas (diagnóstico, escalado CSS)ninguno
URLAnálisis de URL (heurísticas audit_url_safety)ninguno (no recupera)
cronomanejo de fecha/horaninguno
ed25519-dalekverificación fuera de línea de firmas de licencianinguno
base64/sha2tokens de licencia, hashes canariosninguno
libcchown / kill / llamadas al sistemaninguno
idnadecodificación de hosts IDN/punycode para detección de homógrafosninguno
nfq (solo demonio)Fijaciones NFQUEUE para el protector de enlace: óxido puro, AF_NETLINKninguno (canal de veredicto, sin salida)
abiertollama a xdg-open para "Abrir notas de la versión"el proceso en sí no se comunica
GTK3 / ksni (solo aplicación)GUI y bandejaninguno
ureq + Rustls (roamswitch-updater solamente)el HTTPS GET del actualizador diariola única pila HTTP/TLS en el árbol; confinado al binario del actualizador
Punto clave

No aparece ningún cliente HTTP, pila TLS ni SDK de telemetría en roamswitch-core, roamswitch-daemon, roamswitch-app, roamswitch-mcp o roamswitchkit. ureq + rustls están presentes solo en roamswitch-updater (scripts/audit_no_network.sh aplica esto en CI). No hay ningún SDK de telemetría en ninguna parte.

Apéndice B

table inet roamswitch {                 # Cortafuegos de perfil (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: se descarta (drop) todo lo demás
    }
    chain output {
        type filter hook output priority -100; policy <accept|drop>;
        # policy drop solo durante el Air-Gap; solo se permiten lo y ct established
    }
}

table inet roamswitch_linkguard {        # §4.5 — independiente de la tabla de perfiles
    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 de anomalías de puerto / aislamiento manual de puertos, tabla separada
    chain input {
        type filter hook input priority -10; policy accept;
        iif != "lo" tcp dport { … } drop
    }
}

table inet roamswitch_vpn {              # §4 Interruptor de corte 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; … }  # simétrico
}

table inet roamswitch_ts {               # §4 Interruptor de corte del backend Tailscale (más permisivo)
    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 (el lado v6 también es simétrico)
        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                    # Conexión directa WireGuard
        tcp dport 443 accept                      # Respaldo DERP
        ct state established,related accept
    }
    chain input  { type filter hook input priority -150; policy drop; … }  # simétrico
}

La fijación ARP/NDP de la puerta de enlace/enrutador IPv6/resolvedor DNS (§4) se realiza en la tabla de vecinos del kernel (ip neigh replace … nud permanent), no en nftables. Las entradas fijadas se registran en /var/lib/roamswitch/arp_lock.json.

Apéndice C

Cada afirmación contenida en este documento se puede verificar en su propia máquina. Los siguientes comandos se ejecutan en un host con el paquete roamswitch instalado.

C.1 Verificación del tráfico saliente

El enlace binario demonio/aplicación/MCP no tiene biblioteca 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
# → Sin salida. La pila HTTP/TLS solo está enlazada estáticamente en roamswitch-updater.

El demonio en ejecución no tiene conexión a Internet:

sudo lsof -p "$(pgrep -x roamswitch-daemon)" -a -i
# → Sin salida = cero conexiones a Internet TCP/UDP
sudo lsof -p "$(pgrep -x roamswitch-daemon)" -a -U | grep roamswitch
# → Solo /run/roamswitch/roamswitch.sock (la guardia de enlace añade un socket AF_NETLINK,
#   pero es un canal del kernel, no un socket de internet)

La única salida atribuible a RoamSwitch es el actualizador diario:

watch -n 5 'sudo ss -tupn | grep -E "roamswitch-(daemon|app|mcp)" || echo "(none)"'
# → Siempre "(none)". Ninguno de estos tres abre jamás un socket de internet.
systemctl list-timers roamswitch-update.timer
sudo systemctl start roamswitch-update.service
journalctl -u roamswitch-update.service -n 20 --no-pager
# → Una sola solicitud HTTPS GET a lafine.net/updates/v1, después finaliza.

Desactívalo y confirma silencio total:

sudo systemctl disable --now roamswitch-update.timer
# o edite /var/lib/roamswitch/updates.json para establecer "enabled": false
sudo strace -f -e trace=network -p "$(pgrep -x roamswitch-daemon)" 2>&1 | grep -i 'connect('
# → Solo se conecta a AF_UNIX / AF_NETLINK. AF_INET / AF_INET6 nunca aparecen.

C.2 Verificación de defensa reproducible (Docker Test Suite)

Todos los mecanismos de detección, control y defensa de RoamSwitch (aplicación de Air-Gap, autocuración después de la destrucción del firewall, manipulación canary de ransomware, /tmp noexec, Yama LSM, intercepción de phishing homógrafo y detección de fugas de credenciales: 17 elementos en total) se pueden reproducir y verificar de forma segura al 100% en un contenedor aislado sin afectar las redes o archivos del host, utilizando el conjunto de pruebas oficial de Docker proporcionado en el repositorio de soporte público. (roamswitch-soporte

# Obtener y reproducir la suite de verificación (verificación automatizada dentro de un contenedor aislado, usando el paquete de distribución oficial)
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

El contenedor de prueba recupera automáticamente el paquete de distribución oficial del repositorio APT (lafine.net/apt) y evalúa cada uno de los siguientes elementos de prueba sistemática (SP-1–11, PENT-1–7) dentro de una red aislada y un espacio de nombres de montaje.

(1) Defensa de red autónoma y autorreparación de espacios de aire

identificaciónEscenarioMétodo de verificaciónCriterio de aprobación
SP-3Habilitación de Air-Gap → caída de salidaEnviar enable_air_gapIPCpolicy drop aplicado al gancho de salida; todo el tráfico saliente bloqueado
SP-3bPurga forzada y autorreparación del firewallPurgar reglas a través de nft delete table inet roamswitchLa autocuración Anti-Clobber restaura las reglas de caída en 5 segundos
SP-3cFallo cerrado durante el reinicio del demonioElimina al demonio (SIGKILL) en medio de Air-Gap y reiniciaLa política de caída de salida persiste sin problemas durante el reinicio
SP-3dRecuperación autorizada de Air-GapEnviar autorizado disable_air_gap IPCSe levantó la política de eliminación, se eliminaron todos los archivos de marcador, se restableció la salida
SP-8Fijación preventiva de ARP/NDPHabilitar en un entorno de puerta de enlace de red aislada → enviar ARP gratuito falsificadoLa entrada cercana a la puerta de enlace sigue siendo PERMANENT; ARP falsificado ignorado
SP-9Desconexión automática de VPN (WireGuard)Servidor Live WireGuard en redes separadas, importar .confvpn_upEl protocolo de enlace se completa hasta inet roamswitch_vpn; Cero fugas en la muerte del túnel.
SP-10Interruptor de interrupción de VPN (escala trasera)Stub tailscale CLI + redes separadas, tailscale0 IFTCP/80 de texto plano fuera del túnel y DNS local bloqueados; DERP y MagicDNS permitidos

(2) Endurecimiento del núcleo y la montura

identificaciónEscenarioMétodo de verificaciónCriterio de aprobación
SP-11aEndurecimiento del sistema de redEjecutar apply_kernel_sysctl_hardening IPCrp_filter=1, tcp_syncookies=1, accept_redirects=0 alcanzan los valores objetivo
SP-11bProtección de memoria y Yama LSMVerifique ptrace_scope y suid_dumpablekernel.yama.ptrace_scope=1 (bloquea el espionaje), fs.suid_dumpable=0 (sin volcado de núcleo)
SP-11c/tmp y /dev/shm defensa noexecEjecutar apply_mount_hardening IPC/tmp y /dev/shm volvieron a montar noexec,nosuid,nodev; ejecución denegada
SP-11dSe conserva la ejecución legítima del usuarioEjecutar scripts en el directorio de inicio estándar (~/)Se ejecuta sin obstáculos sin interrumpir los flujos de trabajo legítimos de desarrollador/administrador.

(3) Defensa y Canarias contra malware y ransomware multicapa

identificaciónEscenarioMétodo de verificaciónCriterio de aprobación
SP-1Detección de manipulación canariaTruncar o cambiar el nombre del archivo canario señuelo (.xlsx) en ~/Documents/Se detecta manipulación en cuestión de segundos, lo que activa inmediatamente Air-Gap
SP-2Detección de ráfagas de cifrado masivo de ransomwareUn solo proceso genera rápidamente múltiples archivos de alta entropíaProceso de trabajador infractor congelado con SIGSTOP; Air-Gap activado
SP-2bSin falso positivo en shredEjecute shred -n 3 -u en archivos de pruebaLa coincidencia de la lista de permitidos evita la detección o congelación de falsos positivos
SP-2cLos procesos críticos nunca se congelanValidar la lógica del objetivo de congelación durante la detección de ráfagasLos demonios críticos (dockerd, systemd, containerd) nunca se congelan
SP-4La cadena de prueba EICAR es solo de notificaciónEscriba la cadena de prueba EICAR en ~/Downloads/Sin notificación, solo una entrada en el historial de notificaciones; el archivo nunca se pone en cuarentena automáticamente
SP-4bPrimero, confirme la firma de malware realEscribir firma real fuera de las carpetas vigiladasGenera un diálogo de aprobación modal; puesto en cuarentena sólo tras la confirmación del usuario
SP-4cRefuerzo de permisos de la bóveda de cuarentenaInspeccionar los permisos del directorio de almacén y los archivos de muestraDirectorio de almacén establecido en 0700, muestras en cuarentena establecidas en 0400
SP-4dRestauración de archivos originales segura con IPC privilegiadaEnviar restore_quarantine_fileIPCArchivo restaurado a la ruta original con permisos de usuario (0644) y agregado a exclusiones

(4) Protección pasiva de enlaces y defensa contra phishing

identificaciónEscenarioMétodo de verificaciónCriterio de aprobación
SP-7mode = block aplicación estrictaConéctese a hosts listados en feeds o blocklistExtraCaído en la capa TLS (analizado SNI); Los hosts seguros no listados alcanzan HTTP 200
SP-7bmode = warn retención de cierre fallidoConéctese al host de advertencia sin respuesta del usuario (tiempo de espera de 8 segundos)Descarta paquetes cuando se agota el tiempo de espera (fail-closed); permitido sólo con aprobación explícita
SP-7cmode = off desmontaje completoDesactivar protección de enlaceLa tabla inet roamswitch_linkguard está completamente desinstalada

(5) Mitigación de BadUSB y control de dispositivos

identificaciónEscenarioMétodo de verificaciónCriterio de aprobación
SP-6Antigüedad del teclado conectadoVerifique los teclados conectados al inicio del demonioDispositivos existentes protegidos; sólo se tomaron las conexiones en caliente posteriores

(6) Suite de pruebas de penetración en el entorno Docker (17 comprobaciones)

identificaciónVector de ataqueDetalle de simulaciónCriterios de defensa/detección
PENT-1Exfiltración C2Se intentó la salida HTTP/TCP a C2 bajo Air-GapTodos los paquetes cayeron en netfilter; cero fugas
PENT-1bEliminación forzada de FWPurgar reglas con nft delete table inet roamswitchLa autocuración Anti-Clobber restaura las reglas en segundos
PENT-1cRestauración segura del espacio de aireEmisión autenticada disable_air_gap IPCSe eliminaron las reglas de caída; marcadores eliminados; conectividad restaurada
PENT-2/tmp Puerta traseraEjecutar script de puerta trasera eliminado en /tmpDenegado por noexec protección de montaje (Permission denied)
PENT-2b/dev/shm Memoria compartidaEjecutar carga binaria colocada en /dev/shmBloqueado por la defensa de la montura noexec
PENT-2cPreservación del espacio del usuarioEjecutar script en directorio de usuario legítimo (/home/tester/)Ejecución sin obstáculos; cero interrupción del flujo de trabajo
PENT-3ptrace espionaje de memoriaPTRACE_ATTACH al objetivo para extraer secretos/tokensNegado por Yama LSM kernel.yama.ptrace_scope=1
PENT-3bRaspado secreto del volcado de núcleosActivar el bloqueo del proceso para obtener el volcado del núcleo de la memoriaPrevenido por fs.suid_dumpable=0
PENT-4Manipulación canariaArchivo de señuelo canario de puesta a cero en ~/Documents/Detección en tiempo real de anomalías de tamaño y cambios de hash
PENT-4bLimpieza a granel canariaEliminación masiva de archivos señuelo canarioDesaparición de archivo detectada inmediatamente, lo que genera incidente
PENT-5Falsificación de direcciones IPTransmitir paquetes con IP de origen falsificadaEliminado por rp_filter=1 (filtro de ruta inversa)
PENT-5bSYN Inundación DoSInundar conexiones TCP medio abiertasTabla de estados protegida por tcp_syncookies=1
PENT-5cSecuestro de ruta ICMPInyectar paquetes de redireccionamiento ICMP falsosIgnorado debido a accept_redirects=0
PENT-6Phishing de homógrafos cirílicosVaya a gооgle.com (homógrafo cirílico)Identificado por LinkGuard, obtuvo una puntuación de 40 (PELIGROSO/bloqueo)
PENT-6bTráfico IP sin formato y texto sin formatoConexión saliente directa a IP sin formatoMarcado con precisión como factor de riesgo para la seguridad
PENT-7Fuga de clave de API de OpenAIExponer el token sk-proj-... en código o registrosDetectado mediante análisis de entropía de Shannon y enmascarado
PENT-7bFuga de tokens de GitHubExponer el token personal ghp_... en el códigoCoincidencia por patrón de token y verificación de entropía
PENT-8Preferencia de Kernel LPE (Frag Gap)unshare -U -r sin privilegios (intento CVE-2026-53362)Rechazado inmediatamente por user.max_user_namespaces = 0 (Operation not permitted)
PENT-9Sensor de amenazas eBPF y congelación de procesosAlerta crítica/de emergencia inyectada a través del conector Falco eBPFProceso congelado vía SIGSTOP en milisegundos (estado: Ts); Air-Gap desplegado

(7) Resumen de las pruebas de penetración (independiente reforzado frente a eBPF mejorado)

Resumen de los resultados de la prueba de penetración completa ejecutada en un entorno Docker aislado (Objetivo: Ubuntu 24.04 con RoamSwitch Client Edition; Atacante: Nmap / curl / hping3; consulte el informe oficial docs/CLIENT_PENTEST_REPORT.ja.md):

Categoría de verificaciónSin Falco (independiente endurecido)Con Falco (eBPF mejorado)Veredicto de defensa
Resistencia de escaneo de puerto externo (Nmap SYN)PASS (100% filtrado / DROP en Lockdown)PASS (100% filtrado / DROP en Lockdown)Sigilo externo total
Corte de acceso directo externo (TCP/80, 3306)PASS (Tiempo de espera caído/respuesta cero)PASS (Tiempo de espera caído/respuesta cero)Exposición entrante cero
Mitigación de LPE (brecha de fragmentación) del kernelPASS (unshare bloqueado mediante sysctl)PASS (alerta eBPF + SIGSTOP congelación + Air-Gap)Defensa en profundidad verificada
Detección de puerto no autorizado (anomalía)PASS (0.0.0.0 enlace marcado como ALTO riesgo)PASS (0.0.0.0 enlace marcado como ALTO riesgo)100% detectado y guiado
Prevención de sobrecarga de registros y sobrecarga de CPUHuella de registro cero (desinstalada)PASS (95 % de reducción de ruido/búfer de 2 MB/límite de 50 MB)Optimizado para escritorio

C.3 Limitaciones conocidas

LimitaciónImpactoMitigación
En algunos núcleos, FAN_MARK_MOUNT en tmpfs (/tmp) no entrega eventoslas escrituras de archivos bajo /tmp no son monitoreadas por fanotify/tmp es efímera y no es una carpeta de usuario monitoreada; ransomware apunta a ~/. Los errores de marca se registran explícitamente
No hay entrega de fanotify en contenedores overlayfs/tmpfsLa detección de explosión de entropía en el contenedor no se puede validarvalidado en hardware real (ext4); El arnés se salta automáticamente a través de una sonda.
Las operaciones nftables de RoamSwitch comparten el espacio netfilter con iptables-nft de DockerLas operaciones de reglas de RoamSwitch pueden interferir con las reglas NAT de Dockerdocumentado como una advertencia operativa; aislado en la tabla dedicada inet roamswitch, pero se deben evitar operaciones de conjunto de reglas completo como nft flush ruleset
El protector de enlace ve el DoH de un navegador solo a través de TLS SNI; Hola de cliente cifrado (ECH) también lo ocultaUna vez que ECH se implementa ampliamente, una conexión que utiliza ECH a un sitio compatible con ECH no es identificable por el nombre de host.la lista de bloqueo local y la heurística todavía actúan en DNS/HTTP y TLS no ECH; La protección contra amenazas DNS (§4.5, suscripción voluntaria) cubre la ruta de resolución
La frescura del actualizador diario depende de la cadencia de lanzamiento cuando updates.enabled = falsecon las actualizaciones desactivadas, la fuente está tan actualizada como el último apt upgradelas detecciones de mayor gravedad (homógrafo de marca) no necesitan alimentación; Vuelva a inscribirse o habilite DNS de protección contra amenazas para obtener una cobertura siempre actualizada.