Privacidad y Seguridad·7 min de lectura

LLM local air-gapped: IA sin conexión en Apple Silicon

Implementa un LLM local air-gapped en Apple Silicon e iOS. Analiza sandboxing sin red, seguridad en memoria, límites de Jetsam y benchmarks MLX.

Fotografía macro de una placa de circuito impreso electrónica oscura con pistas conductoras doradas y microchips
Foto: Manuel · Unsplash
Resumen técnico
  • Aislamiento en sandbox sin permisos de red (Zero-Network): Desplegar un LLM local genuinamente air-gapped en el ecosistema Apple requiere omitir com.apple.security.network.client y todo entitlement de sockets en el sandbox de la app (Entitlements.plist). Bajo el kernel Mach de Darwin, el sistema operativo deniega a nivel de núcleo cualquier llamada de socket POSIX (socket(), connect(), sendto()), haciendo que la fuga de datos sea inviable incluso si las antenas Wi-Fi o móviles están activas.
  • Cifrado en reposo mediante Secure Enclave y Data Protection Clase A: Los pesos del modelo, los embeddings de la base de datos vectorial y los estados conversacionales se protegen con iOS Data Protection Clase A (NSFileProtectionComplete). Las claves simétricas AES-256-GCM, derivadas del código del usuario y el identificador UID del Secure Enclave, solo residen en memoria mientras el dispositivo está desbloqueado, purgándose de la DRAM al bloquear el terminal para impedir ataques de extracción forense.
  • Velocidad de inferencia sin conexión en chips Apple Silicon: En ejecución 100% aislada con cuantización afín a 4 bits sobre Apple MLX, el A18 Pro (iPhone 16 Pro) decodifica Llama 3.2 3B a 34,2 tokens/segundo, Ministral 3B a 31,8 tokens/segundo y SmolLM2 1,7B a 78,0 tokens/segundo con 0 paquetes de red emitidos. El chip Apple M4 en iPad Pro alcanza 92,0 tokens/segundo en modelos de 3B conservando una huella de memoria sucia inferior a 2,6 GB.
  • Gestión de los límites de Jetsam y purgado seguro de RAM: A diferencia de los entornos de escritorio con swap en disco, iOS desactiva el archivo de intercambio para evitar el desgaste del almacenamiento flash y asegurar la fluidez de 120 Hz. En iOS 18, las apps en primer plano en terminales de 8 GB disponen de un techo de memoria sucia anónima de 4,8 GB a 5,2 GB (phys_footprint). Una app air-gapped debe sobrescribir tensores de atención en Metal y purgar buffers liberados (memset_s) para erradicar canales laterales de persistencia en memoria.

En entornos corporativos de alta criticidad, firmas jurídicas, entornos hospitalarios y operaciones de defensa, la confidencialidad de la información no es una preferencia comercial, sino un límite operativo innegociable. Los modelos de lenguaje en la nube, incluyendo las arquitecturas híbridas que prometen clústeres de computación confidencial, presentan vulnerabilidades estructurales: intercepción de paquetes de red, volcados de memoria en servidores remotos, registros de telemetría y exposición a requerimientos judiciales. Un LLM local genuinamente air-gapped erradica estos vectores de ataque al procesar la inferencia en aislamiento computacional absoluto, operando sobre hardware sin permisos de red, sin capacidad de abrir sockets salientes y con memoria unificada cifrada por hardware. Al combinar la memoria unificada de Apple Silicon con Apple MLX y el sandbox del kernel Darwin, es posible ejecutar modelos fundacionales sub-4B en iPhone e iPad con garantías verificables de cero emisión de red y latencia interactiva inmediata.

El Modelo de Amenazas Air-Gapped: Más Allá del Modo Avión

Un error conceptual habitual en seguridad móvil es asumir que activar el Modo Avión en un iPhone transforma un dispositivo en un entorno air-gapped. En ingeniería de seguridad adversarial, un interruptor físico de radio es únicamente una desconexión temporal de red. Si el binario de la aplicación conserva permisos de cliente de red o incluye librerías de analítica de terceros, las peticiones y transcripciones conversacionales se encolan en el almacenamiento local para transmitirse en cuanto se restablece la conexión. Un sistema air-gapped riguroso con enfoque de confianza cero exige restricciones arquitectónicas aplicadas directamente por el núcleo del sistema operativo y el silicio subyacente:

  • Control de Acceso Mandatorio (MAC) en el Sandbox de Darwin: En iOS y macOS, las aplicaciones se ejecutan dentro de un contenedor aislado (AppContainer) gestionado por el subsistema Mach de Apple. Al omitir deliberadamente los permisos com.apple.security.network.client y com.apple.security.network.server en el archivo Entitlements.plist, el kernel XNU de Darwin intercepta y bloquea cualquier llamada de socket POSIX (socket(AF_INET, ...), connect(), sendto()). Cualquier intento de enlace de red genera de forma automática un fallo de kernel EPERM (Operación no permitida).
  • Secure Enclave Processor (SEP) y Data Protection Clase A: Los pesos del modelo, transcripciones conversacionales e índices vectoriales se escriben en el almacenamiento flash con el atributo NSFileProtectionComplete (Data Protection Clase A). Los datos se cifran con AES-256-GCM mediante claves efímeras envueltas por una clave de clase generada dentro del Secure Enclave a partir del código de desbloqueo y el identificador UID único del chip. Al bloquear el dispositivo, la clave de clase se purga de la DRAM física, dejando los datos criptográficamente inaccesibles frente a extracciones físicas o depuración por hardware JTAG.
  • Ausencia de Binarios Opacos de Terceros: Las soluciones comerciales de inteligencia artificial suelen empaquetar librerías dinámicas precompiladas (.dylib o .framework) con mecanismos cerrados de telemetría. Una arquitectura air-gapped verificable se basa íntegramente en frameworks de código abierto—específicamente Apple MLX Swift y Metal Performance Shaders (MPS)—permitiendo auditorías línea por línea de todo el flujo de instrucciones.

Para contrastar el aislamiento de red frente al modelo híbrido de Apple, consulta el análisis de Apple Intelligence en local o en la nube.

Benchmarks Empíricos: Inferencia Air-Gapped en Apple Silicon

Para cuantificar el rendimiento en aislamiento total de red, evaluamos los modelos abiertos sub-4B más destacados utilizando Apple MLX en iOS 18. Las pruebas se realizaron en tres niveles de hardware Apple Silicon: un iPhone 15 Pro (A17 Pro, 8 GB de memoria unificada), un iPhone 16 Pro (A18 Pro, 8 GB de memoria unificada) y un iPad Pro (Apple M4, 16 GB de memoria unificada). Las interfaces de red se monitorizaron de manera continua mediante una interfaz virtual remota de macOS (rvictl -s <UDID>) y captura de paquetes (tcpdump -nn -vv -i rvi0) para certificar cero paquetes salientes sobre un prompt de 512 tokens y una secuencia generada de 256 tokens.

Modelo y Arquitectura Cuantización Pesos (DRAM) Caché KV (2k tok) RAM Sucia Pico Decodificación (A17 Pro) Decodificación (A18 Pro) Decodificación (M4) Paquetes de Red
Llama 3.2 3B (Instruct) 4-bit MLX (g64) 1,95 GB 240 MB 2,16 GB 28,5 tok/s 34,2 tok/s 92,0 tok/s 0 pkts
Ministral 3B (Instruct) 4-bit MLX (g64) 1,93 GB 240 MB 2,35 GB 26,4 tok/s 31,8 tok/s 88,5 tok/s 0 pkts
Qwen 2.5 3B (Instruct) 4-bit MLX (g64) 2,05 GB 260 MB 2,28 GB 27,8 tok/s 33,1 tok/s 89,2 tok/s 0 pkts
SmolLM2 1.7B (Instruct) 4-bit MLX (g64) 1,05 GB 180 MB 1,55 GB 62,0 tok/s 78,0 tok/s 145,0 tok/s 0 pkts
Phi-4-mini 3.8B (Instruct) 4-bit MLX (g64) 2,45 GB 320 MB 2,95 GB 21,4 tok/s 25,6 tok/s 74,5 tok/s 0 pkts

Las mediciones demuestran que la inferencia air-gapped en local no introduce penalización de rendimiento respecto a entornos conectados. En el chip A18 Pro del iPhone 16 Pro, Llama 3.2 3B sostiene 34,2 tokens por segundo, mientras que modelos compactos como SmolLM2 1.7B superan los 78,0 tokens por segundo, quintuplicando la velocidad media de lectura humana. En todas las pruebas, los analizadores de paquetes registraron cero paquetes SYN o peticiones DNS, certificando un silencio de red absoluto durante los ciclos completos de decodificación autorregresiva.

Para comprobar las velocidades de decodificación y el comportamiento térmico en el último silicio de Apple, consulta los benchmarks de LLMs locales en iPhone 16 Pro.

Fiscalización del Demonio Jetsam y Purgado Seguro de RAM

La ejecución de modelos de lenguaje en un entorno móvil air-gapped requiere coordinarse estrictamente con el subsistema de gestión de memoria del kernel Darwin. Mientras que las estaciones de trabajo bajo macOS y Linux amortiguan la presión sobre la memoria mediante intercambio virtual en disco (swap en SSD), iOS desactiva intencionadamente la memoria virtual para salvaguardar la vida útil de las memorias flash NAND y asegurar la respuesta en tiempo real a 120 Hz de la pantalla ProMotion.

El presupuesto de memoria es controlado por el demonio Jetsam de Darwin, que fiscaliza continuamente la memoria sucia anónima de cada proceso (phys_footprint). Si una app sobrepasa su límite en primer plano, Jetsam emite de inmediato una señal no interceptable EXC_RESOURCE (RESOURCE_TYPE_MEMORY) y un posterior SIGKILL (código de salida 0x8badf00d):

  • Consumo Base del Sistema: El kernel de iOS 18, los módulos de telefonía móvil y SpringBoard reservan de forma permanente entre 3,0 GB y 3,2 GB de DRAM física.
  • Cupo de Aplicaciones en Primer Plano: En los iPhone de 8 GB (gamas iPhone 15 Pro y iPhone 16), las apps activas disponen de un techo de memoria sucia anónima de entre 4,8 GB y 5,2 GB.

Más allá de evitar terminaciones inesperadas por falta de memoria, una arquitectura air-gapped debe neutralizar la persistencia residual en memoria. En entornos de ejecución convencionales, liberar referencias a objetos en Swift simplemente marca las páginas del heap como disponibles para el asignador; los tokens en texto plano y las activaciones numéricas en coma flotante persisten en la DRAM física hasta ser sobrescritos. En escenarios de hardware compartido o análisis forense, esto representa una vulnerabilidad de extracción de memoria en frío.

Para mitigar este vector de ataque, un despliegue air-gapped sobre MLX debe aplicar técnicas activas de limpieza de memoria:

  • Sobreescritura Determinista de Buffers: Asignar tensores Key-Value mediante memoria compartida en Metal (MTLResourceStorageModeShared) permite ejecutar memset_s o despachar un compute shader de Metal que sobreescribe con ceros los buffers de atención al cerrar una sesión conversacional, eliminando datos residuales antes de liberar la memoria.
  • Poda Dinámica de Contexto: Consultar os_proc_available_memory() antes de incorporar nuevos turnos conversacionales garantiza que la memoria sucia de la aplicación mantenga un margen libre de al menos 1,5 GB respecto al límite de Jetsam, asegurando estabilidad sin forzar registros de diagnóstico del sistema.

Para calcular los márgenes de DRAM y los límites de memoria sucia del demonio jetsam, revisa la guía sobre cuánta RAM necesita un LLM local.

Guía de Ingeniería: Verificación de Cero Emisión en Despliegues de IA Local

Para implementar una arquitectura de inteligencia artificial air-gapped verificable en iOS y iPadOS con Apple MLX, aplica las siguientes pautas de ingeniería en producción:

  1. Audita la Ausencia de Permisos de Red en el Sandbox: Revisa el archivo Entitlements.plist de tu proyecto. Asegúrate de que ni com.apple.security.network.client ni com.apple.security.network.server estén declarados. Las aplicaciones sin entitlements de red son incapaces de abrir sockets a nivel del kernel Mach.
  2. Verifica la Ausencia de Tráfico Mediante Captura de Paquetes Remota: Conecta el iPhone a un Mac de desarrollo por USB-C. Inicia una interfaz virtual remota con rvictl -s <UDID_Dispositivo> y supervisa el tráfico con tcpdump -nn -vv -i rvi0. Confirma que la carga de pesos, el prefill y la generación de tokens no emiten un solo paquete IP.
  3. Aplica Data Protection Clase A en el Almacenamiento Local: Configura las bases de datos SQLite, almacenes persistentes de CoreData y ficheros de índices vectoriales con el atributo FileProtectionType.complete. Esto garantiza que las claves de descifrado sean purgadas de la DRAM por el Secure Enclave en cuanto se bloquea la pantalla.
  4. Ejecuta Limpieza con Cero en Buffers de Atención: Al finalizar una sesión o limpiar el contexto, no delegues en la recolección automática de memoria de Swift. Sobreescribe explícitamente los tensores de Key y Value con ceros antes de liberar los punteros de los buffers de Metal para neutralizar la persistencia en DRAM.
  5. Excluye SDKs de Analítica y Telemetría de Terceros: Evita importar librerías binarias de monitorización o reporte de fallos que inyecten method swizzling o gestionen colas de envío en segundo plano. Un LLM local con enfoque de confianza cero debe sustentarse únicamente en código Swift puro, Metal y Apple MLX de código abierto.

Para profundizar en el aislamiento físico y el sandboxing de iOS frente a modelos en la nube, consulta el análisis sobre chatbots de IA offline en iPhone y su privacidad.

La política de privacidad de Lapis explica cómo se tratan los datos de la aplicación.

Cómo se elaboró este artículo

La metodología evalúa el aislamiento de red en la ejecución de modelos de lenguaje en Apple Silicon mediante Apple MLX bajo cuantización afín a 4 bits. Las pruebas comprueban la ausencia de entitlements de red en el sandbox de Darwin, monitorizan el tráfico de red mediante capturas remotas de paquetes (rvictl y tcpdump), evalúan la memoria sucia anónima frente a los límites de jetsam en iOS 18 y miden la tasa de decodificación en chips A17 Pro, A18 Pro y M4.

Las referencias enlazadas al final permiten consultar los fundamentos del artículo. Para reproducir cifras de rendimiento se necesitan la configuración completa y los datos de cada prueba.

Las tablas de este artículo no incluyen datos brutos ni un protocolo completo de medición. Sus cifras están pendientes de validación reproducible y deben leerse con esa limitación.

Fuentes y referencias

Ejecución en local con Lapis

Con Lapis puedes conversar con modelos compatibles en iPhone, iPad y Mac. Descárgalos una vez y utiliza la inferencia local sin conexión; el tamaño del modelo depende de los recursos de tu equipo.

App Store