El espectro radioeléctrico es ahora superficie de ataque
Durante años, la seguridad inalámbrica fue territorio del equipo de hardware. La AppSec se quedaba con el código del backend. En 2026 esa frontera se rompió: los repositorios de firmware viven en el mismo monorepo que el portal, comparten el mismo CI, las mismas revisiones de código y el mismo pipeline de release. Si su empresa empieza a fabricar productos con Wi-Fi, Bluetooth o un radio IoT, alguien tiene que escanear ese código. Ese alguien es usted.
Este artículo es un recorrido riguroso por las seis superficies inalámbricas que importan en cualquier programa de AppSec moderno: Wi-Fi, Bluetooth Classic, Bluetooth Low Energy (BLE), RF sub-GHz, NFC / RFID y los transportes IoT (Zigbee, MQTT, CoAP, LoRa). Para cada superficie cubrimos los ataques famosos que conviene conocer por nombre, simulaciones realistas paso a paso de qué hace un atacante en cada caso, ejemplos de código antes y después de mitigar, y — con honestidad — qué puede y qué no puede detectar un escáner estático sobre el código que ya tiene en git.
Lectura recomendada. Buena parte del marco mental de este artículo está inspirado en "Wireless Hacking Unleashed: Attacking Wi-Fi, Bluetooth, and RF Protocols" de Stravos & Zephyrion. El libro cubre cada superficie con el rigor de una guía de campo y es referencia obligada para quien lidere un equipo de hardware/firmware en 2026. Las simulaciones de este post están condensadas a partir de los escenarios que el libro detalla.
El laboratorio del libro — cómo se ve un banco de pruebas inalámbrico
Stravos & Zephyrion abren su libro con algo que pocos manuales explican bien: cómo es un laboratorio inalámbrico real. No es una caja con USBs sueltos, es una pequeña arquitectura de tres bloques. Un investigador con su workstation y su cuaderno de bitácora a la izquierda; una cadena de radios — una por banda — en el medio; y una zona blindada al fondo donde viven los dispositivos bajo prueba (DUT) aislados del resto de la oficina. Si va a auditar Wi-Fi, BLE y RF en serio, necesitará algo parecido a esto:
Fig. — Banco de pruebas mínimo descrito en Wireless Hacking Unleashed: workstation del investigador, una radio dedicada por banda y un conjunto de DUTs aislados en una jaula de Faraday. Las líneas punteadas son los enlaces wireless reales bajo análisis.
Este laboratorio es imprescindible si su trabajo es validar fallas de capa física — KRACK, KNOB, BleedingBit, Crypto1 sobre MIFARE, ataques de replay 433 MHz. Pero hay una observación incómoda que el propio libro hace al cerrar el capítulo: el 70% de los hallazgos críticos en productos inalámbricos vive en el código fuente, no en el aire. SSIDs y PSKs hardcodeados, BLE_GAP_IO_CAP_NO_INPUT_NO_OUTPUT, MIFARE Classic todavía permitido, ZigBeeAlliance09 sin reemplazar, brokers MQTT en claro — todo eso se detecta sobre el repositorio, sin encender una sola antena. Esa es la grieta donde entra SF365.
/wireless-security con KPIs por superficie.Las seis superficies, en una sola vista
"Inalámbrico" es una categoría, no un protocolo. Los modelos de amenaza de cada superficie son lo bastante distintos como para que agruparlos sea exactamente la forma en que se pierden vulnerabilidades. Manténgalas separadas:
1. Wi-Fi (802.11)
Alcance ~50–100 m. Capa de enlace. KRACK, Pixie Dust, Reaver, Evil Twin, deauth flooding, downgrade a TKIP.
2. Bluetooth Classic
Alcance ~10–100 m. BlueBorne, KNOB (CVE-2019-9506), brute-force de PIN heredado, descubrimiento permanente.
3. Bluetooth LE
Alcance ~30 m. BleedingBit, MitM por Just Works, replay de passkey estático, GATT sin autorización, reuso de claves de bonding.
4. RF sub-GHz
Alcance 100 m–15 km. RollJam contra rolling-code, replay de fixed-code, Tesla key-relay, smart-meter snooping, LoRa en claro.
5. NFC / RFID
Alcance ~10 cm. Crypto1 contra MIFARE Classic, autorización solo por UID, NFC relay, claves por defecto FFFFFFFFFFFF.
6. Transportes IoT
Zigbee con TC key por defecto, MQTT en claro, CoAP sin DTLS, LoRaWAN con join keys de fábrica, ESP-IDF con SSID/PSK fijos.
Wi-Fi: donde más equipos siguen fallando
WPA2-PSK ganó la guerra de estándares y entonces todo el mundo dejó de prestarle atención. Pero la superficie de configuración es amplia y los modos de fallo son persistentes. WEP y WPA-TKIP siguen apareciendo como "SSID de compatibilidad" para una impresora del 2008 que nadie quiere reemplazar. WPS sigue activo en routers vendidos en 2024. Los SSID y PSK siguen apareciendo embebidos en el firmware. Y las Protected Management Frames (PMF / 802.11w) — obligatorias en WPA3 y un "deberías" desde 2009 — siguen apagadas en una cantidad alarmante de despliegues.
Anti-patrón clásico (ESP-IDF)
// firmware/main/wifi_init.c
#define WIFI_SSID "AcmeCorp-Internal"
#define WIFI_PSK "verano2024"
wifi_config_t cfg = {
.sta = {
.ssid = WIFI_SSID,
.password = WIFI_PSK,
.threshold.authmode = WIFI_AUTH_WPA_PSK, // acepta TKIP
.pmf_cfg = { .capable = true, .required = false }, // PMF opcional
},
};
Tres problemas en seis líneas: el SSID expone el nombre de la organización, el PSK queda en el binario del producto, y el modo de autenticación acepta WPA — lo que permite a un AP malicioso forzar el downgrade a TKIP. El análisis estático detecta los tres sin necesidad de ningún radio.
// SSID + PSK provisionados en runtime (BLE / SmartConfig / QR)
wifi_config_t cfg = {
.sta = {
.threshold.authmode = WIFI_AUTH_WPA3_PSK, // SAE
.pmf_cfg = { .capable = true, .required = true }, // PMF obligatorio
},
};
// credenciales obtenidas mediante esp_wifi_provisioning
Cómo un atacante captura el handshake en menos de 3 minutos
- El atacante se sienta en una cafetería frente al edificio. Activa
airmon-ngen monitor mode y escanea conairodump-ng. - Identifica el SSID corporativo objetivo (
AcmeCorp-Internal) y los clientes asociados. - Lanza un AP malicioso con el mismo SSID en otro canal usando
hostapd-mana. El AP malo emite con más potencia. - Envía deauth frames al AP legítimo (
aireplay-ng -0 5 -a <BSSID>). Como PMF está desactivado, los clientes son desconectados al instante. - Los clientes intentan reconectarse. Algunos prueban primero con el AP malicioso. El handshake WPA2 4-way queda capturado.
- Con el PSK fijo conocido (sale del firmware leakeado), el atacante valida en segundos. Sin él, lanza
hashcat -m 22000contra una wordlist de credenciales corporativas comunes.
WIFI-01 (TKIP), WIFI-03 (SSID/PSK fijos) y WIFI-05 (PMF apagado). Sin radio, sin pruebas en campo.Bluetooth Classic: el legacy pairing sigue vivo
Bluetooth 2.1 (2007) introdujo Secure Simple Pairing (SSP) y lo hizo obligatorio. Sin embargo, diecinueve años después, una cantidad deprimente de dispositivos — sensores industriales, periféricos médicos, gateways IoT antiguos — siguen emparejándose con un PIN de 4 dígitos. El ataque KNOB (CVE-2019-9506) permite negociar la entropía de la clave de cifrado a 1 byte y romperla por fuerza bruta en milisegundos.
Las pistas que delatan al firmware vulnerable
- PINs por defecto —
0000,1111,1234,123456hardcodeados en el código de setup. - Legacy pairing — rutas de código que llaman a
BTM_PIN_TYPE_FIXEDy nunca a SSP. - Discoverable permanente —
setDiscoverable(0, ...)sin timeout. El dispositivo se anuncia para siempre. - Reuso de link keys — misma clave en toda la flota, embebida en la imagen del firmware.
- Tamaño mínimo de clave 7 — el mínimo del spec, no el mínimo práctico. Configure
min_key_size = 16.
BLE: el protocolo que hizo famoso al "Just Works"
El emparejamiento BLE tiene seis modos, y la elección importa. La pregunta de revisión es siempre: ¿cuál estamos eligiendo y es apropiado para los datos que manejamos?
| Modo de emparejamiento | Protección MitM | Cuándo usarlo |
|---|---|---|
| Just Works | Ninguna | Solo para periféricos verdaderamente no sensibles (sensor de temperatura público). |
| Passkey Entry | Fuerte | Cuando un lado tiene pantalla y el otro un teclado. Passkey debe ser aleatorio, jamás estático. |
| Numeric Comparison (LESC) | Muy fuerte | Ambos lados con pantalla. Recomendado por defecto para BLE 4.2+. |
| Out-of-Band (OOB) | Máxima | Cuando hay canal alternativo (NFC tap, QR). Producto de alta seguridad. |
| Legacy Pairing (BLE 4.0/4.1) | Débil | Nunca. Reemplazado por LESC. Desactivar siempre. |
El error más común
Un desarrollador quiere que el emparejamiento "simplemente funcione" durante el prototipo, configura las IO Capabilities a NoInputNoOutput, el dispositivo se empareja con su teléfono al instante, y la configuración nunca vuelve a revisarse. Un año después el producto sale al mercado con MitM trivial.
ble_hs_cfg.sm_io_cap = BLE_HS_IO_NO_INPUT_OUTPUT; // fuerza Just Works ble_hs_cfg.sm_bonding = 1; ble_hs_cfg.sm_mitm = 0; // no exige protección MitM ble_hs_cfg.sm_sc = 0; // LESC desactivado
ble_hs_cfg.sm_io_cap = BLE_HS_IO_DISPLAY_ONLY; // el dispositivo muestra passkey ble_hs_cfg.sm_bonding = 1; ble_hs_cfg.sm_mitm = 1; // MitM obligatorio ble_hs_cfg.sm_sc = 1; // LESC obligatorio (BLE 4.2+) ble_hs_cfg.sm_our_key_dist = BLE_SM_PAIR_KEY_DIST_ENC | BLE_SM_PAIR_KEY_DIST_ID; ble_hs_cfg.sm_their_key_dist = BLE_SM_PAIR_KEY_DIST_ENC | BLE_SM_PAIR_KEY_DIST_ID;
El ataque al smart-lock que se empareja "automágicamente"
- El atacante se acerca al lobby con una Raspberry Pi y un dongle BLE (~$30 USD).
- Inicia
btmony observa los advertisements del smart-lock objetivo. - Lanza
GATTackeren modo proxy: clona el periférico (mismas características GATT, mismo nombre). - Cuando el dueño se acerca con su app, el teléfono ve dos periféricos. La app conecta al primero (el malicioso).
- El proxy reenvía cada paquete BLE entre la app y el lock real, registrando el material de emparejamiento.
- Como ambos extremos declaran
NoInputNoOutput, el emparejamiento usa Just Works. Sin verificación, sin clave compartida segura. - El atacante captura el comando de "abrir" y lo replay después.
Sub-GHz RF: el lejano oeste
Sub-GHz es donde más fallan los instintos del AppSec porque no hay un SDK que escanear. Pero sigue habiendo código fuente. Los productos con mando a distancia que usan códigos fijos (const uint32_t REMOTE_CODE = 0x...) entregan al atacante todo lo necesario para clonarlos: un RTL-SDR de 25 USD captura el código una vez y lo reproduce con rtl_433. Las frecuencias ISM hardcodeadas (setFrequency(433.92e6)) por sí solas no son vulnerabilidades, pero combinadas con código fijo le dicen al atacante exactamente dónde escuchar.
Y luego está LoRa. LoRa es una capa física; LoRaWAN es lo que añade AES-128 con separación NwkSKey / AppSKey. Los paquetes de LoRa puros viajan en claro por el aire. Cualquier código que importa una librería de LoRa "raw" sin usar LoRaWAN para producción es una bandera roja.
Cómo un atacante clona el mando del portón "seguro"
- El atacante coloca un dispositivo HackRF One en un coche estacionado cerca del portón objetivo.
- El dueño llega y presiona el botón del mando. El atacante jamea la frecuencia (433.92 MHz) y simultáneamente graba el código.
- El portón no recibe el comando (por el jamming). El dueño presiona otra vez.
- El atacante reproduce el primer código capturado y graba el segundo. El portón se abre con el primer código y el atacante se queda con el segundo, no usado.
- Más tarde, cuando el dueño se va, el atacante reproduce el segundo código.
NFC / RFID: el "es solo 10 cm" no es un argumento
"Es solo 10 cm" no es un argumento de modelo de amenaza, sobre todo en 2026 con ataques de NFC relay sobre Internet ya estables como proyectos de hobby. La firma estática más útil para detectar es MIFARE Classic en producción. El cifrado Crypto1 que usa MIFARE Classic fue roto académicamente en 2008 y armado en herramientas de retail como Proxmark3 y Flipper Zero. Cualquier código que aún referencia MIFARE_CLASSIC, claves por defecto FFFFFFFFFFFF, o construye la autorización solo sobre el UID es un hallazgo.
Transportes IoT: donde vive el blast radius
Wi-Fi te deja entrar a la red. Bluetooth te acerca al periférico. Pero el daño a nivel aplicación en dispositivos conectados se hace casi siempre sobre los transportes IoT:
| Transporte | Falla típica | Detección estática |
|---|---|---|
| Zigbee | TC key por defecto ZigBeeAlliance09 | String literal, exacto. |
| MQTT | Broker en claro mqtt://broker:1883 | URI scheme + puerto. |
| CoAP | Sin DTLS — coap:// en lugar de coaps:// | URI scheme. |
| LoRa | Paquetes raw sin LoRaWAN | Llamadas a librería sin LoRaWAN_*. |
| ESP-IDF | CONFIG_ESP_WIFI_SSID y CONFIG_ESP_WIFI_PASSWORD con valor | Regex sobre sdkconfig. |
Galería de ataques famosos — los nombres que conviene saber
| Ataque | Año / CVE | Superficie | Severidad | Mitigación principal |
|---|---|---|---|---|
| KRACK | 2017 / CVE-2017-13077…88 | Wi-Fi | Alta | Parchar supplicant; preferir WPA3. |
| Pixie Dust | 2014 | Wi-Fi (WPS) | Crítica | Desactivar WPS en producción. |
| Reaver | 2011 | Wi-Fi (WPS) | Alta | Desactivar WPS, lockout por intentos. |
| Evil Twin | continuo | Wi-Fi | Crítica | PMF + 802.1X + validación de cert servidor. |
| BlueBorne | 2017 | Bluetooth | Crítica | Parchar stack BT del SO. |
| KNOB | 2019 / CVE-2019-9506 | BT Classic | Alta | min_key_size = 16 en stack. |
| BleedingBit | 2018 / CVE-2018-16986/87 | BLE | Crítica | Actualizar firmware del chipset (TI). |
| RollJam | 2015 | RF sub-GHz | Alta | Crypto autenticado (AES-CMAC), no solo rolling code. |
| Crypto1 break | 2008 | NFC (MIFARE) | Crítica | Migrar a MIFARE DESFire EV2/EV3 o equivalente. |
| NFC Relay | 2012– | NFC | Alta | Distancia bounding, time-of-response, contexto. |
Secretos IoT en el firmware — los 10 patrones que el SecretScanner debería tener
La historia del "AWS root key filtrado en GitHub" ya se contó. La versión 2026 de esa historia es "Azure IoT Hub Device SAS filtrado en un mirror del firmware", y los escáneres genéricos no la detectan porque las credenciales IoT no parecen credenciales convencionales: SAS tokens con campos HostName=..., URIs MQTT con usuario y contraseña embebidos, JWTs scoped a projects/…/registries/….
| Patrón | Forma típica | Severidad |
|---|---|---|
| Azure IoT Hub Device SAS | HostName=*.azure-devices.net;[…]SharedAccessKey=<b64> | Crítica |
| Azure IoT Hub Conn String | IotHubConnectionString = "HostName=…" | Crítica |
| AWS IoT MQTT Endpoint | <14char>-ats.iot.<region>.amazonaws.com | Alta |
| GCP IoT Device JWT | mqtt.googleapis.com/projects/…/registries/… | Alta |
| Particle.io Token | 40 hex precedido por particle_token | Crítica |
| Tuya Cloud Secret | 32 hex precedido por tuya_* | Alta |
| SmartThings PAT | UUID precedido por smartthings_token | Alta |
| HomeKit Setup Code | NNN-NN-NNN precedido por homekit_* | Media |
| MQTT URL con credenciales | mqtt://user:pass@broker | Crítica |
| ESP-IDF Wi-Fi credentials | CONFIG_ESP_WIFI_SSID="…" + _PASSWORD | Alta |
Wireless Security Baseline — 24 controles auditables
Los marcos de cumplimiento existentes no cubren bien la superficie inalámbrica. NIST SP 800-153 cubre Wi-Fi. NIST SP 800-121 R2 cubre Bluetooth. NIST SP 800-97 cubre 802.1X. IEEE 802.11i es la base criptográfica. Pero ninguno los costura en una sola lista que un líder de hardware pueda usar como checklist. SF365 publica una: el Wireless Security Baseline con 24 controles.
| ID | Control | Cómo se evidencia |
|---|---|---|
WIFI.01 | WEP / WPA-TKIP no debe estar habilitado. | Escaneo estático de configuración del supplicant / hostapd. |
WIFI.03 | PMF (802.11w) requerido (ieee80211w=2). | Escaneo + verificación runtime del AP. |
WIFI.05 | SSID y PSK no embebidos en código / firmware. | Patrón del SecretScanner. |
BT.05 | LE Secure Connections (LESC) habilitado y obligatorio. | Escaneo: sm_sc=1 / SC_PAIR_ONLY. |
BT.06 | Características GATT con datos sensibles requieren cifrado + autenticación. | Escaneo de flags GATT. |
BT.08 | Tamaño mínimo de clave de cifrado = 16 bytes (mitiga KNOB). | Revisión de configuración del stack. |
RF.01 | Mandos a distancia con rolling-code o crypto autenticada. | Revisión del código tx/rx. |
NFC.01 | MIFARE Classic no se usa en nuevos despliegues. | Revisión de fuente; registro de decisión. |
IOT.01 | Zigbee no usa la clave TC por defecto ZigBeeAlliance09. | Revisión de fuente; auditoría de provisioning. |
IOT.02 | MQTT en producción usa TLS (puerto 8883). | Revisión + configuración del broker. |
Tabla parcial — el baseline completo incluye los 24 controles, mapeados cada uno a su fuente NIST/IEEE.
¿Cuánto puede detectar un escáner estático realmente?
La respuesta honesta es: todo lo que sea configuración o constante en código, nada que dependa del aire. Pero esa frontera cubre una fracción sorprendentemente grande del riesgo:
- Detectable estáticamente (16 de 24 controles): elección de cifrado Wi-Fi, estado de WPS, presencia de PMF, SSID/PSK fijos, IO Capabilities BLE, LESC, flags GATT, passkeys hardcodeados, claves de bonding, código fijo en RF, MIFARE Classic, claves Zigbee por defecto, URIs MQTT/CoAP en claro, Wi-Fi creds en
sdkconfig. - Verificable por procedimiento (8 de 24): migraciones planeadas, decisiones de threat model documentadas, ciclos de provisionamiento, validación de certificados servidor en EAP-TLS.
Lo que no puede hacer un escáner es lanzar un KRACK, montar un Evil Twin o ejecutar KNOB — eso necesita radio. Pero sí puede — y debe — detectar las decisiones de configuración que hacen esos ataques triviales.
Cómo SF365 cubre las seis superficies
Security Factor 365 es la primera plataforma de AppSec con un motor dedicado a estas seis superficies. Lo llamamos el Wireless Security Engine y es el motor número 12 del ScanOrchestrator (junto con SAST, SCA, DAST, IAST, IaC, Secrets, Config, Container, API, AI Security y 12-Factor IaC).
- 18 reglas de detección distribuidas en las seis superficies.
- 10 patrones nuevos en el
SecretScannerpara credenciales IoT cloud (Azure IoT, AWS IoT, GCP IoT, Particle, Tuya, SmartThings, HomeKit, MQTT, ESP-IDF), totalizando 91 patrones precompilados. - Wireless Security Baseline con los 24 controles auditables del marco anterior, exportable como PDF.
- Dashboard dedicado en
/wireless-securitycon KPIs por superficie, hallazgos top, cobertura del baseline, tablas y gráficos. - Reporte Wireless Assessment PDF con resumen ejecutivo, KPIs por superficie, top 20 hallazgos, baseline de 24 controles, recomendaciones y referencias a NIST + IEEE.
- Targets de benchmark deliberadamente vulnerables: IoT-Goat (OWASP), DVRF (Damn Vulnerable Router Firmware) y BLE CTF, con un solo clic para clonar y escanear.
- Simulaciones educativas en el Attack Lab: Evil Twin, BLE Just Works MitM, KNOB, RF replay, MIFARE clone (sintéticas, sin radio).
Recomendaciones — por dónde empezar mañana
- Inventario sincero de qué radios usan realmente sus productos. La mitad de los equipos que creen que "envían Wi-Fi" también envían BLE para commissioning y se les olvidó.
- Para cada superficie, ponga por escrito qué amenazas están en alcance y cuáles son riesgo aceptado. "Aceptamos Just Works en características no sensibles" es una posición; "no sabemos" no lo es.
- Añada reglas estáticas a CI para los modos de fallo descritos. La mayoría son strings exactos o regex superficiales.
- Adopte un baseline auditable (el de 24 controles de SF365 o uno propio). El punto es que la respuesta a "¿cómo estamos en Wi-Fi?" sea evidenciable, no impresión.
- Corra benchmarks contra targets vulnerables conocidos — IoT-Goat, DVRF, BLE CTF — para demostrar que sus detecciones efectivamente disparan.
- Pase un escaneo SF365 sobre su monorepo de firmware. Suele aparecer al menos un secreto IoT que nadie esperaba.
Referencias
Bibliografía y enlaces
- Stravos & Zephyrion. Wireless Hacking Unleashed: Attacking Wi-Fi, Bluetooth, and RF Protocols. 2025.
- NIST SP 800-153. Guidelines for Securing Wireless Local Area Networks (WLANs). csrc.nist.gov/publications/sp/800-153
- NIST SP 800-121 Rev. 2. Guide to Bluetooth Security. csrc.nist.gov/publications/sp/800-121
- NIST SP 800-97. Establishing Wireless Robust Security Networks (Guide to IEEE 802.11i). csrc.nist.gov/publications/sp/800-97
- IEEE 802.11i-2004. Medium Access Control Security Enhancements.
- Vanhoef, M. & Piessens, F. (2017). Key Reinstallation Attacks: Forcing Nonce Reuse in WPA2 (KRACK). CVE-2017-13077…13088.
- Antonioli, D. et al. (2019). The KNOB is Broken: Exploiting Low Entropy in the Encryption Key Negotiation of Bluetooth BR/EDR. CVE-2019-9506.
- Armis Labs (2017). BlueBorne — Bluetooth Implementations Vulnerabilities. Multiple CVEs.
- Garcia, F. et al. (2008). Dismantling MIFARE Classic.
- OWASP IoT Top 10 (2018) — owasp.org/iot
- Security Factor 365 — sf.peopleworksservices.com
- SF365 Wireless Security Engine — documentación in-app en
/wireless-securityy/help.
Su próximo producto tiene radio. Su escáner de AppSec, ¿también?
SF365 es la primera plataforma con un motor dedicado de Wireless Security — 18 reglas, 6 superficies, 24 controles auditables, dashboard, reporte PDF y benchmarks IoT — sobre el código que ya tiene en git. Sin radios. Sin laboratorio adicional.