SDK para desarrolladores

Lleva los diagnósticos de RoamSwitch directamente a tu propia app de Mac o Linux

RoamSwitchKit (macOS) y roamswitch-linux-kit (Linux) son clientes gratuitos y de código abierto que permiten que tu código Swift o Rust consulte directamente los mismos diagnósticos de seguridad que calcula RoamSwitch. Integra «¿es segura esta red ahora mismo?» en tu propia app sin reimplementar la supervisión ARP ni el escaneo de puertos.

🍎 RoamSwitchKit (macOS) → 🐧 roamswitch-linux-kit (Linux) →

🔒 Por qué es seguro

  • Solo lectura: no existe ninguna API para activar el bloqueo, aislar un puerto o expulsar un dispositivo. Una app que enlace este paquete no puede cambiar la configuración de RoamSwitch sin el consentimiento del usuario.
  • Totalmente local: lanza el binario incluido con RoamSwitch (macOS: RoamSwitchMCPServer / Linux: roamswitch-mcp) como subproceso y se comunica solo por stdio. Nunca se envía nada a un servidor externo.
  • Gratuito y de código abierto: publicado bajo licencia MIT; cualquiera puede inspeccionar el código fuente e integrarlo libremente.
Instalación

Una línea en tu gestor de paquetes

Solo tienes que añadirlo a las dependencias de tu Package.swift. Requiere macOS 12+, Swift 5.9+ y tener instalado RoamSwitch 1.3.0 o posterior.

dependencies: [
    .package(url: "https://github.com/lafine1211/RoamSwitchKit.git", from: "1.0.0")
]

Solo tienes que añadirlo a las dependencias de tu Cargo.toml. Requiere una toolchain estable de Rust (edición 2021, runtime asíncrono tokio) y tener instalado RoamSwitch for Linux (que incluye el binario roamswitch-mcp).

[dependencies]
roamswitch-linux-kit = { git = "https://github.com/lafine1211/roamswitch-linux-kit", tag = "v0.1.0" }
Uso

Obtén diagnósticos con unos pocos métodos sencillos

import RoamSwitchKit

let client = try RoamSwitchClient()

let report = try await client.securityReport()
print(report.score, report.grade)

let ports = try await client.exposedPorts()
for port in ports.ports where port.overallRisk == "high" {
    print(port.processName, port.port)
}

let status = try await client.guardStatus()
print(status.activeSecurityLevelLabel, status.isCurrentNetworkTrusted)

let urlReport = try await client.auditURLSafety(url: "https://apple.com.login-verify.xyz")
print(urlReport.score, urlReport.riskLevel) // e.g. 20, "dangerous"
use roamswitch_linux_kit::RoamSwitchClient;

let client = RoamSwitchClient::new(None, None)?;

let report = client.security_report().await?;
println!("{} ({})", report.score, report.grade);

let ports = client.exposed_ports(false).await?;
for port in ports.ports.iter().filter(|p| p.overall_risk.as_deref() == Some("high")) {
    println!("{} {}", port.process_name, port.port);
}

let status = client.guard_status().await?;
println!("{} {}", status.active_security_level_label, status.is_current_network_trusted);

let url_report = client.audit_url_safety("https://apple.com.login-verify.xyz").await?;
println!("{} {}", url_report.score, url_report.risk_level); // e.g. 20, "dangerous"
Superficie de la API

Métodos de solo lectura

securityReport()

Devuelve una auditoría completa y puntuada sobre 18 comprobaciones —FileVault, SIP, Gatekeeper, cortafuegos, seguridad del cifrado Wi-Fi, suplantación ARP, puertos expuestos y más— con recomendaciones para lo que falle.

exposedPorts(includeLocalOnly:)

Enumera todos los puertos actualmente en escucha y, para los expuestos más allá de localhost, devuelve una auditoría detallada que incluye la detección de servicios conocidos como peligrosos (Redis, MongoDB, etc.).

guardStatus()

Obtiene el estado de las protecciones de puertos, ARP, USB, Bluetooth, descargas Web/Mail, DNS y nivel de seguridad.

auditURLSafety(url:)

Inspecciona enlaces sospechosos o URLs acortadas localmente en busca de phishing y ataques homógrafos (Zero Telemetry).

Otros métodos de solo lectura

MétodoDescripción
auditSecurityLogs(hours:)Agrega los registros de seguridad recientes (Mac: fallos de autenticación sudo, intentos de fuerza bruta SSH, bloqueos de Gatekeeper, detecciones de XProtect, etc. / Linux: fallos de autenticación sudo, fuerza bruta SSH, bloqueos del cortafuegos, denegaciones de AppArmor, detecciones de ClamAV, etc.), enmascara automáticamente información sensible como claves API y tokens, y además devuelve los resultados de la detección de patrones nuevos (mediante plantillas de log) y de anomalías de frecuencia (picos estadísticos).
activeVulnScan()Verificació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.
packageCveScan()Compara los paquetes instalados (Mac: Homebrew / Linux: dpkg, dnf, zypper, pacman) con un mapa de CVE local. No se realiza ninguna comunicación de red.
packageCveScanLanguages(watchedFolders:)Compara 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.
canaryStatus()Devuelve el estado de los archivos señuelo antiransomware (canary) y hasta los 50 incidentes detectados más recientes.
portAnomalyIncidents()Devuelve 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.
runtimeThreatStatus()Indica si este Mac está aislado (Air-Gap) por una detección de malware de XProtect, junto con el incidente que lo activó. Es lo primero que conviene consultar durante un Air-Gap activo.
notificationHistory()Devuelve 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.

Los campos de cada tipo de retorno están documentados como declaraciones Swift en el README de GitHub y en AGENTS.md.

security_report()

Obtiene una puntuación y recomendaciones a partir de una auditoría de 24 puntos que cubre el cifrado de disco LUKS/dm-crypt, UEFI Secure Boot, AppArmor/SELinux, la configuración de sudo/SSH, la suplantación ARP y los puertos expuestos.

exposed_ports(include_local_only)

Enumera todos los puertos actualmente en escucha y, para los expuestos más allá de localhost, devuelve una auditoría detallada que incluye la detección de servicios conocidos como peligrosos (Redis, MongoDB, etc.).

guard_status()

Obtiene el estado de las protecciones de puertos, ARP, USB, Bluetooth, descargas Web/Mail, DNS y nivel de seguridad.

audit_url_safety(url)

Inspecciona enlaces sospechosos o URLs acortadas localmente en busca de phishing y ataques homógrafos (Zero Telemetry).

Otros métodos de solo lectura

MétodoDescripción
server_security_report()Ejecuta el perfil de 30 elementos de la Server Edition (endurecimiento del kernel, aislamiento de contenedores, exposición a CVE del kernel, eBPF LSM) en lugar de la auditoría del cliente.
run_active_vuln_scan()Verificació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.
audit_secrets(text)Detecta claves de API y claves privadas expuestas en texto, un archivo o un árbol de directorios (los hallazgos se enmascaran en la salida).
audit_security_logs(hours)Agrega los registros de seguridad recientes (Mac: fallos de autenticación sudo, intentos de fuerza bruta SSH, bloqueos de Gatekeeper, detecciones de XProtect, etc. / Linux: fallos de autenticación sudo, fuerza bruta SSH, bloqueos del cortafuegos, denegaciones de AppArmor, detecciones de ClamAV, etc.), enmascara automáticamente información sensible como claves API y tokens, y además devuelve los resultados de la detección de patrones nuevos (mediante plantillas de log) y de anomalías de frecuencia (picos estadísticos).
get_app_help(query, topic)Busca en la base de conocimientos oficial de RoamSwitch sobre todas las funciones, alertas, ajustes y solución de problemas en el dispositivo para ofrecer explicaciones y consejos precisos.
quarantine_status()Devuelve el contenido del baúl de cuarentena: ruta original, nombre de la amenaza detectada, fecha de cuarentena y tamaño.
canary_status()Devuelve el estado de los archivos señuelo antiransomware (canary) y hasta los 50 incidentes detectados más recientes.
package_cve_scan()Compara los paquetes instalados (Mac: Homebrew / Linux: dpkg, dnf, zypper, pacman) con un mapa de CVE local. No se realiza ninguna comunicación de red.
package_cve_scan_languages(watched_folders)Compara 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_fim()Vuelve 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_port_anomaly_incidents()Devuelve 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_incidents()Devuelve el estado de aislamiento actual del guardián de ejecución eBPF y el historial de incidentes que lo motivó.

Los campos de cada tipo de retorno están documentados como declaraciones Rust en el README de GitHub.

Casos de uso

Qué puedes construir con él

Los siguientes ejemplos usan Swift (macOS). roamswitch-linux-kit (Linux) ofrece los mismos métodos (en snake_case) para el mismo resultado.

Apps de sincronización y copia de seguridad

Pausa automáticamente la sincronización en segundo plano al conectarse a una red no confiable.

let status = try await client.guardStatus()
if !status.isCurrentNetworkTrusted {
    syncEngine.pauseBackgroundSync()
}

Gestores de contraseñas

Acorta el tiempo de bloqueo automático en redes no confiables, adaptando el comportamiento al nivel de protección activo.

let status = try await client.guardStatus()
let lockTimeout: TimeInterval = status.isCurrentNetworkTrusted ? 300 : 30
vault.setAutoLockTimeout(lockTimeout)

Herramientas para desarrolladores y automatización

Avisa cuando un servidor de desarrollo empieza a escuchar en 0.0.0.0, o crea flujos de trabajo estilo Shortcuts que reaccionan a la confianza de la red.

let ports = try await client.exposedPorts(includeLocalOnly: false)
for port in ports.ports where [3000, 5173, 8000, 11434, 1234].contains(port.port) {
    print("⚠️ Dev/AI server exposed on port \(port.port)")
}

Verificación previa de enlaces en apps de correo y chat

Escanea automáticamente los enlaces de los mensajes entrantes antes de mostrarlos y solo advierte sobre los peligrosos.

let result = try await client.auditURLSafety(url: link)
if result.riskLevel == "dangerous" || result.riskLevel == "suspicious" {
    showWarningBanner(for: link, score: result.score)
}

Verificación desde el menú contextual o Atajos

Intégralo en el menú Servicios del Finder o en Atajos de macOS para comprobar una URL copiada con una sola acción.

// Se llama desde un controlador de macOS Shortcuts (App Intent) o del menú Servicios
let report = try await client.auditURLSafety(url: pasteboardURL)
return "\(report.riskLevel.uppercased()) (\(report.score)/100)"

Gestión de activos de TI y paneles MDM

Recopila las puntuaciones de todos los Mac de la organización y muéstralas como una lista con alertas en un panel de administración.

let report = try await client.securityReport()
try await mdmAPI.reportScore(deviceID: deviceID, score: report.score, grade: report.grade)
Preguntas frecuentes

Acerca de los SDK

Q. ¿Es gratis de usar?

A. Sí. Tanto RoamSwitchKit (macOS) como roamswitch-linux-kit (Linux) se publican de forma gratuita bajo la licencia MIT. Ambos requieren que RoamSwitch (el motor de diagnóstico) esté instalado, pero los SDK en sí no tienen coste alguno.

Q. ¿Puede cambiar la configuración de un usuario?

A. No. Es de solo lectura: no hay ninguna API implementada para activar el bloqueo, aislar puertos o similar. Una app que integre este paquete no puede cambiar la configuración de protección de RoamSwitch sin el consentimiento del usuario.

Q. ¿Qué ocurre si RoamSwitch no está instalado?

A. Se devuelve el error correspondiente (macOS: RoamSwitchClientError.appNotInstalled / Linux: RoamSwitchClientError::AppNotInstalled). Recomendamos manejarlo con elegancia (por ejemplo, ocultando la función) en lugar de tratarlo como un error fatal.

Q. ¿Y si quiero integrar y redistribuir RoamSwitch en mi producto?

A. La integración del SDK (el contenido de esta página) sigue siendo libre de usar. Integrar y redistribuir RoamSwitch requiere una licencia OEM — contáctanos aquí sobre alianzas OEM.