Volver al blog

Ciberataque a las Neveras de Supermercados en Francia: Lecciones de IoT en 2026

Hola HaWkers, en la noche del domingo 11 de octubre de 2026, cientos de supermercados en Francia amanecieron con neveras y congeladores fuera de servicio. Los atacantes no robaron datos de tarjetas ni pidieron un rescate en criptomonedas: activaron de forma remota el desescarche automático de los controladores de refrigeración. Resultado: existencias de productos frescos y congelados desechadas, una investigación abierta por la fiscalía de París y reportes de incendios en algunas tiendas.

¿Alguna vez te has parado a pensar cuántos equipos "tontos" de tu empresa están, en realidad, conectados a internet con un panel web olvidado? En este artículo vamos a entender lo que se sabe hasta ahora sobre el ataque, qué fallas conocidas existen en este tipo de controlador y, sobre todo, qué puedes hacer tú, como desarrollador o persona de infraestructura, mañana temprano para no ser el próximo caso.

Qué Pasó en los Supermercados Franceses

Según BleepingComputer, los atacantes actuaron durante la madrugada y secuestraron controladores de refrigeración que ejecutaban versiones antiguas del software de control de Danfoss, fabricante danés de equipos de refrigeración y climatización. En lugar de apagar las máquinas, dispararon el ciclo de desescarche automático, una función legítima que calienta el evaporador para derretir el hielo acumulado. Si se mantiene encendido durante horas, ese ciclo hace que la temperatura de los expositores suba hasta echar a perder todo lo que hay dentro.

Las cifras varían según la fuente, así que conviene mirarlas con cuidado:

  • Intermarché y Netto: al menos 300 tiendas afectadas, según la AFP
  • Coopérative U: más de 100 establecimientos afectados
  • E.Leclerc: varias tiendas, y la cadena confirmó que el ataque alcanzó a uno de sus proveedores de equipos de refrigeración
  • Carrefour: la empresa habló de 80 supermercados atacados, de un total de unas 6.000 tiendas
  • Monoprix y Carrefour Market fueron mencionados por sitios del sector, pero sin confirmación oficial en un primer momento

Medios franceses llegaron a estimar entre 250 y 350 tiendas afectadas, mientras que la suma de las cifras divulgadas por las propias cadenas supera eso. La CNBC informó de equipos que se calentaron hasta 50 °C. El presidente de Coopérative U, Dominique Schelcher, calificó el ataque de "sin precedentes" y afirmó que apuntó a equipos esenciales para conservar los productos frescos. Intermarché informó que las tiendas afectadas tendrían que desechar todos los productos frescos y congelados.

La Respuesta de Danfoss y del Gobierno Francés

Danfoss declaró que la mayor parte de los equipos afectados eran productos "legacy", que ya no reciben actualizaciones de software ni de seguridad. La empresa mencionó los reguladores AK-SM800 y AK-SC355 y dijo que una versión del AK-SM800 ejecutaba firmware desactualizado. Según el fabricante, a los supermercados se les venía recomendando desde hace tiempo actualizar esos modelos.

Del lado del gobierno, una persona cercana al primer ministro Sébastien Lecornu dijo que la agencia nacional de ciberseguridad de Francia (ANSSI) ya había identificado "una vulnerabilidad en un software suministrado por una empresa danesa", se puso en contacto con el proveedor y está coordinando la respuesta con agencias europeas. La fiscalía de París abrió una investigación sobre el "ciberataque a gran escala" que afectó a los refrigeradores de varias cadenas de distribución alimentaria, con el objetivo de identificar a las víctimas y vincular el ataque con las pérdidas de alimentos y los incendios reportados.

El comisario europeo de Agricultura, Christophe Hansen, escribió en X que "la seguridad alimentaria exige más atención en todos los niveles". Hasta el momento de esta publicación, ningún autor ha sido identificado oficialmente. El contexto político ayuda a entender la tensión: el mes anterior, el presidente Emmanuel Macron había ordenado medidas para proteger la infraestructura crítica del país contra "ataques híbridos" rusos. Pero relacionar una cosa con la otra, por ahora, es especulación.

El mismo día, la neerlandesa Ahold Delhaize informó que desconectó algunos sistemas a causa de un "incidente de ciberseguridad". No hay, hasta ahora, evidencia de que ambos casos estén conectados.

Por Qué Esto No Sorprende a Quien Trabaja con IoT

Si sigues la seguridad de sistemas industriales, el ataque asusta por la escala, pero no por el método. En febrero de 2019, TechCrunch ya informaba sobre controladores de refrigeración industrial conectados a internet que podían descongelarse de forma remota porque seguían con la contraseña por defecto de fábrica. Siete años después, el patrón se repite.

Los controladores Danfoss de la familia AK-SM 800A también tienen un historial reciente de fallas documentadas. Investigadores de Claroty Team82 publicaron tres vulnerabilidades, corregidas en el firmware R4.3.1:

  • CVE-2025-41450: un mecanismo oculto de autenticación llamado "code-of-the-day". El controlador genera una contraseña diaria a partir de la fecha actual; al reconstruir el algoritmo, un atacante podría eludir la contraseña de administrador configurada.
  • CVE-2025-41451: inyección de comandos en la configuración de SMTP. La contraseña de autenticación del correo electrónico se montaba en un comando de shell sin sanitización, abriendo el camino a la ejecución remota de código.
  • CVE-2025-41452: inyección de directivas en el archivo de cabeceras de Nginx por parte de un usuario autenticado, tumbando el servicio de gestión (denegación de servicio).

Importante: hasta ahora, ninguna fuente oficial ha confirmado que estas CVE se usaran en el ataque francés. Sin embargo, muestran el tipo de superficie que estos equipos exponen cuando quedan accesibles desde internet.

Y la exposición es real. Un escaneo de Censys citado en el momento de la divulgación señaló 2.765 dispositivos con interfaz accesible desde internet. Ya después del ataque, Baptiste Robert, CEO de Predicta Lab, contó 2.752 sistemas Danfoss expuestos, 1.590 de ellos en Francia. BleepingComputer cita además más de 4.500 dispositivos Danfoss rastreados por Shodan.

El problema de fondo es conocido por quien ya ha trabajado con tecnología operacional (OT): el equipo dura 10 o 15 años, el fabricante deja de dar soporte mucho antes, y el panel web que un técnico habilitó "solo para acceder desde casa" sigue abierto mucho después de que todo el mundo olvide que existe.

Paso 1: Descubre Qué Tienes Expuesto

No puedes proteger lo que no conoces. El primer paso es un inventario de tus propias direcciones públicas, buscando interfaces de gestión que no deberían estar ahí. El script de abajo hace una comprobación sencilla en las IP que pertenecen a tu organización y busca firmas comunes de paneles de equipos embebidos.

# inventario_exposicao.py
# Comprueba si las IP públicas de TU organización responden con paneles de
# gestión de equipos embebidos. Úsalo solo en activos propios.
import socket
import requests
import urllib3

urllib3.disable_warnings()  # muchos equipos usan certificado autofirmado

MEUS_IPS = ["203.0.113.10", "203.0.113.11"]  # reemplaza por tus IP
PORTAS = [80, 443, 8080, 8443]
ASSINATURAS = ["danfoss", "ak-sm", "ak-sc", "refrigeration", "hvac", "xweb"]

def porta_aberta(ip: str, porta: int, timeout: float = 2.0) -> bool:
    """Devuelve True si el puerto TCP acepta la conexión."""
    try:
        with socket.create_connection((ip, porta), timeout=timeout):
            return True
    except OSError:
        return False

def checar(ip: str, porta: int) -> None:
    esquema = "https" if porta in (443, 8443) else "http"
    try:
        resp = requests.get(f"{esquema}://{ip}:{porta}/", timeout=4, verify=False)
    except requests.RequestException:
        return
    corpo = resp.text.lower()
    achados = [a for a in ASSINATURAS if a in corpo]
    if achados:
        # Cualquier hallazgo aquí es un panel de OT accesible desde internet
        print(f"[ALERTA] {ip}:{porta} parece expor gerenciamento: {achados}")

for ip in MEUS_IPS:
    for porta in PORTAS:
        if porta_aberta(ip, porta):
            checar(ip, porta)

Este script no sustituye a un escáner profesional, pero resuelve el caso más común: descubrir que esa IP "de la tienda 42" responde con la pantalla de login del controlador de refrigeración. Si tienes una cuenta en servicios como Shodan o Censys, también vale la pena buscar los bloques de IP de tu empresa y ver lo que el resto del mundo ya está viendo.

Paso 2: Compara el Firmware con la Versión Mínima Segura

Después del inventario, el siguiente paso es saber qué equipos están por debajo de la versión corregida. En el caso de los AK-SM 800A, la referencia pública es el firmware R4.3.1. El ejemplo de abajo lee un CSV de inventario y marca lo que necesita actualización o, peor aún, lo que ya ni siquiera tiene actualización disponible.

# auditoria_firmware.py
# Lee el inventario de equipos y señala el firmware por debajo del mínimo seguro.
import csv
import re

# Versión mínima por modelo; None = producto legacy sin corrección disponible
MINIMO_SEGURO = {
    "AK-SM800A": "4.3.1",
    "AK-SM800": None,   # legacy: aislar o sustituir
    "AK-SC355": None,   # legacy: aislar o sustituir
}

def normalizar(versao: str) -> tuple[int, ...]:
    """Convierte 'R4.3.1' o '4.3.1' en (4, 3, 1) para comparar."""
    numeros = re.findall(r"\d+", versao)
    return tuple(int(n) for n in numeros)

with open("inventario.csv", newline="", encoding="utf-8") as arquivo:
    # Columnas esperadas: loja,modelo,firmware,ip_interno
    for linha in csv.DictReader(arquivo):
        modelo = linha["modelo"].strip().upper()
        if modelo not in MINIMO_SEGURO:
            continue
        minimo = MINIMO_SEGURO[modelo]
        if minimo is None:
            print(f"[LEGADO] {linha['loja']}: {modelo} sem suporte -> isolar da rede")
        elif normalizar(linha["firmware"]) < normalizar(minimo):
            print(f"[ATUALIZAR] {linha['loja']}: {modelo} em {linha['firmware']} (mínimo {minimo})")

Fíjate en que el caso más grave no es el firmware desactualizado, sino el equipo legacy. Para él no existe corrección. La única defensa es sacar el equipo del alcance de quien no debería tocarlo.

Paso 3: Aísla el Equipo Legacy de Internet

Un controlador de refrigeración no necesita responder a cualquier IP del planeta. Necesita hablar con el sistema de monitorización de la empresa y, eventualmente, con el técnico de mantenimiento. Eso cabe en una regla de firewall. Abajo, un ejemplo con nftables en un gateway Linux que separa la VLAN de OT del resto de la red:

# /etc/nftables.d/ot-refrigeracao.nft
# Los controladores de refrigeración están en la VLAN 30 (10.30.0.0/24).
# Solo la VPN de mantenimiento y el servidor de monitorización pueden alcanzarlos.

table inet ot_refrigeracao {
  chain forward {
    type filter hook forward priority 0; policy drop;

    # Mantiene las conexiones ya establecidas
    ct state established,related accept

    # La VPN de mantenimiento (10.99.0.0/24) accede al panel web
    ip saddr 10.99.0.0/24 ip daddr 10.30.0.0/24 tcp dport { 443 } accept

    # El servidor de monitorización recoge telemetría
    ip saddr 10.10.0.5 ip daddr 10.30.0.0/24 tcp dport { 443, 502 } accept

    # Los controladores NO inician conexiones hacia internet
    ip saddr 10.30.0.0/24 log prefix "OT-SAIDA-BLOQUEADA " drop
  }
}

Tres decisiones marcan la diferencia aquí. La política por defecto es drop, así que todo lo que no se haya permitido explícitamente queda fuera. El acceso remoto pasa por una VPN con autenticación fuerte, nunca por un puerto abierto en el router. Y la salida de los controladores hacia internet se bloquea y se registra en el log, lo que ayuda a detectar un equipo comprometido intentando comunicarse con el exterior.

Si trabajas con servicios en la nube, el razonamiento es el mismo que ya vimos en ataques de botnet usando infraestructura en AWS: lo que queda expuesto por defecto acaba siendo encontrado por alguien.

Paso 4: Monitoriza el Comportamiento, No Solo el Acceso

Incluso con la red segmentada, conviene tener una alarma que salte cuando el equipo hace algo fuera de lo normal. En el ataque francés, la señal estaba ahí: ciclos de desescarche fuera del horario programado y temperatura subiendo en muchas tiendas al mismo tiempo. El siguiente script analiza lecturas de telemetría y lanza una alerta en esos dos escenarios.

# alerta_degelo.py
# Detecta desescarche fuera de la ventana programada y calentamiento anómalo de expositores.
from datetime import datetime, time
from collections import defaultdict

# Ventanas de desescarche programadas (ejemplo: 2h y 14h, 30 minutos cada una)
JANELAS_DEGELO = [(time(2, 0), time(2, 30)), (time(14, 0), time(14, 30))]
LIMITE_CONGELADOS_C = -12.0   # por encima de esto, alerta para congelados
LIMITE_LOJAS_SIMULTANEAS = 3  # varias tiendas al mismo tiempo = posible ataque

def dentro_da_janela(instante: datetime) -> bool:
    agora = instante.time()
    return any(inicio <= agora <= fim for inicio, fim in JANELAS_DEGELO)

def analisar(leituras: list[dict]) -> None:
    """Cada lectura: {'loja', 'equipamento', 'instante', 'temp_c', 'degelo_ativo'}"""
    lojas_suspeitas = defaultdict(list)
    for l in leituras:
        instante = datetime.fromisoformat(l["instante"])
        if l["degelo_ativo"] and not dentro_da_janela(instante):
            lojas_suspeitas[l["loja"]].append(f"degelo fora da janela em {l['equipamento']}")
        if l["equipamento"].startswith("congelado") and l["temp_c"] > LIMITE_CONGELADOS_C:
            lojas_suspeitas[l["loja"]].append(f"{l['equipamento']} a {l['temp_c']} °C")

    for loja, motivos in lojas_suspeitas.items():
        print(f"[ALERTA] loja {loja}: {'; '.join(motivos)}")

    # Muchas tiendas al mismo tiempo indican una acción coordinada, no un defecto aislado
    if len(lojas_suspeitas) >= LIMITE_LOJAS_SIMULTANEAS:
        print(f"[CRÍTICO] {len(lojas_suspeitas)} lojas com anomalia simultânea: acionar resposta a incidente")

El detalle más importante está al final: un congelador averiado es mantenimiento; treinta congeladores calentándose en la misma madrugada son un incidente de seguridad. Correlacionar eventos entre establecimientos es lo que convierte la telemetría operacional en detección de ataques.

Lo Que Esto Enseña a Quien Escribe Software

Puede parecer que este es un problema solo de quien gestiona la red de un supermercado, pero las lecciones valen para cualquier persona que escriba software que controla algo físico, desde una cerradura inteligente hasta un panel de IoT con JavaScript:

  1. Las contraseñas "mágicas" son deuda de seguridad. El "code-of-the-day" de la CVE-2025-41450 es un atajo de soporte que se convirtió en puerta trasera. Si tu producto tiene acceso de mantenimiento, necesita una credencial única por dispositivo y registro de uso.
  2. Nunca montes un comando de shell con entrada del usuario. La CVE-2025-41451 es el clásico: un campo de contraseña de SMTP concatenado en un comando. Usa las API del lenguaje con lista de argumentos, nunca un único string.
  3. Planifica el fin de vida del producto. Un equipo que pasa 15 años en campo necesita un plan para cuando se acabe el soporte: modo offline seguro, desactivación del panel remoto o un aviso claro al cliente.
  4. Las funciones legítimas también se convierten en armas. El desescarche es una función normal. Lo que faltó fue un límite: cuánto tiempo puede estar activo, quién puede activarlo fuera de horario y qué pasa si la temperatura supera el nivel seguro.

Este último punto es el más interesante desde el punto de vista de la ingeniería. Un controlador bien diseñado podría rechazar un desescarche que dejara los congelados por encima de un límite durante demasiado tiempo, independientemente de quién haya dado la orden. Los bloqueos de seguridad en el propio dispositivo protegen incluso cuando la autenticación falla.

Perspectivas: La Seguridad Alimentaria Se Ha Vuelto un Asunto de Ciberseguridad

El ataque francés debería acelerar una conversación que el sector minorista venía aplazando. En la Unión Europea, la directiva NIS2 ya amplía las obligaciones de ciberseguridad a sectores considerados esenciales, y las palabras del comisario Hansen indican que la cadena alimentaria debería recibir más atención. Del lado de los fabricantes, la presión será mantener el soporte durante más tiempo y eliminar los mecanismos de acceso ocultos.

Para quien trabaja con tecnología, el mensaje es práctico: haz hoy el inventario de lo que está expuesto, aísla lo que no tiene corrección y crea alertas que observen el comportamiento de los equipos. Ninguno de estos pasos exige un presupuesto gigantesco, pero todos exigen que alguien recuerde que la nevera también es un ordenador.

¡Vamos con todo! 🦅

📚 ¿Quieres Seguir lo Que Viene Por Delante?

Este artículo cubrió el ataque a las neveras de los supermercados franceses y cómo proteger el IoT industrial, pero el ecosistema cambia cada semana y no todo se convierte en artículo aquí.

En X comparto lo que estoy probando, el detrás de escena de los proyectos y las novedades que aparecen antes de convertirse en post.

Sígueme Allá

👉 Seguir a @jeffbruchado en X

💡 Contenido diario sobre desarrollo, carrera y las herramientas que realmente uso

Comentarios (0)

Este artículo aún no tiene comentarios 😢. ¡Sé el primero! 🚀🦅

Añadir comentarios