← Blog
·9 min read

El Crash de CrowdStrike: Lo Que Todo Developer Necesita Saber Sobre Auto-Updates y Riesgo en el Kernel

Una mala actualización de una herramienta de seguridad tumbó 8.5 millones de máquinas Windows en julio de 2024. Esta es la razón técnica — y lo que los equipos pequeños deberían hacer diferente con sus auto-updates.

Rod Alexanderson

Founder & Developer

El 19 de julio de 2024, a las 04:09 UTC, 8.5 millones de máquinas Windows empezaron a mostrar pantalla azul simultáneamente.

Las aerolíneas detuvieron vuelos en tierra. Los hospitales cancelaron cirugías. Los bancos se quedaron offline. El aeropuerto de Berlín-Brandeburgo cerró temporalmente. Delta Airlines procesó miles de cancelaciones en horas.

No fue un ataque de un estado-nación. No fue un exploit de zero-day elaborado durante meses. Fue un solo archivo de configuración que CrowdStrike — una empresa de seguridad con $9B en ingresos anuales — empujó automáticamente desde su producto de seguridad.

La ironía es casi demasiado obvia para mencionarla: la herramienta diseñada para protegerte tiró tus máquinas.


Qué pasó exactamente (la versión técnica sin relleno)

CrowdStrike Falcon es un EDR — Endpoint Detection and Response. Corre en millones de máquinas corporativas Windows como un driver en modo kernel, interceptando actividad del sistema para detectar comportamiento malicioso en tiempo real.

El día del incidente, CrowdStrike empujó una actualización a su sensor Falcon. No fue una actualización del driver en sí — fue una actualización de lo que CrowdStrike llama un channel file: un archivo de configuración de contenido que Falcon usa para actualizar su lógica de detección entre versiones de software.

El archivo específico fue C-00000291-*.sys, conocido después como channel file 291.

El problema vino del pipeline interno de CrowdStrike. Tienen un componente llamado Content Validator que valida estas actualizaciones antes de que salgan. El Content Validator tenía un error lógico: permitió que un tipo de template inválido pasara la validación sin error.

Cuando las máquinas Windows descargaron la actualización y Falcon intentó procesar el channel file 291, el parser encontró una condición que el código no esperaba. Se disparó una null pointer dereference — un acceso a una dirección de memoria nula — dentro del driver en modo kernel.

El OS no pudo manejar el error. Pantalla azul. Restart. Mismo archivo. Mismo crash. Boot loop.

El detalle operativo que hace esto devastador: CrowdStrike trataba los channel files como "solo configuración". Se empujaban globalmente, sin el mismo proceso de staged rollout que tienen las actualizaciones del driver principal. Sin canary. Sin anillos de despliegue. Todo el mundo al mismo tiempo.


Por qué una herramienta de seguridad pudo tirar Windows

Esto es lo que más vale entender si instalas herramientas de seguridad en tus propias máquinas.

Hay dos "mundos" dentro de un sistema operativo moderno: modo usuario (Ring 3) y modo kernel (Ring 0).

Tu código de aplicación corre en modo usuario. Si crashea, el OS lo elimina. Obtienes un log de error, quizás un crash dump, y el resto del sistema sigue corriendo. La aplicación falla, pero el OS sobrevive. Hay una red de seguridad.

Los drivers de bajo nivel corren en modo kernel. Tienen acceso directo al hardware, a la memoria del sistema, a las syscalls antes de que el OS las procese. Cuando un driver en modo kernel crashea, no hay red de seguridad. El OS no puede contener el daño. Se cae todo.

CrowdStrike Falcon tiene que correr en modo kernel. No hay otra opción si quieres interceptar syscalls, operaciones de archivos, y actividad de red al nivel más bajo — que es exactamente lo que necesita un EDR para hacer su trabajo. No es una decisión cuestionable de CrowdStrike. Es una necesidad técnica del tipo de producto que construyeron.

El problema no es que corriera en el kernel. El problema es que una actualización de contenido — tratada operacionalmente como "solo config" — ejecutaba código en ese mismo contexto privilegiado. Y no tenía las mismas salvaguardas que una actualización completa del driver.

Los channel files no eran código inerte. Tenían templates que el parser del sensor interpretaba y ejecutaba en modo kernel. La distinción operativa entre "es solo config" y "es código que corre con privilegios del kernel" resultó ser una ilusión costosa.


El supuesto de auto-update que costó 5 mil millones de dólares

Aquí está la decisión de diseño que convirtió un bug en una catástrofe.

El default del sensor Falcon: las actualizaciones de contenido se entregan automáticamente a todos los sensores. Globalmente. Sin staged rollout configurado por defecto.

Según el Post Incident Review de CrowdStrike, la actualización del channel file 291 llegó a todos los sensores afectados en un período de tiempo muy corto. No había anillos de despliegue. No había canary. No había "1% primero, espera 30 minutos, luego el resto".

Ahora imagina cómo se habría visto un canary del 1%:

  • 85,000 máquinas en pantalla azul en lugar de 8.5 millones
  • Los ingenieros on-call detectan en minutos — porque las alertas en Datadog de esas 85K máquinas son imposibles de ignorar
  • CrowdStrike hace rollback antes de la propagación global
  • El incidente afecta a un hospital, no a todos los hospitales del planeta simultáneamente

Las cifras reales del incidente sin canary:

  • $5.4B en reclamaciones de seguros estimadas (Parametrix)
  • $500M+ en pérdidas para Delta Airlines sola (según reportes de Reuters)
  • 74 minutos desde el primer reporte de crash hasta el push del parche de CrowdStrike
  • 8.5 millones de máquinas que no podían ser reparadas remotamente

74 minutos es impresionantemente rápido para detectar y parchear. El problema es que 74 minutos después de que ya llegó a todo el mundo no sirve de nada.


Los canary deploys no son solo para tu código

Si llevas tiempo desarrollando, ya conoces los canary releases para tu propio código. Deploys en stages. Feature flags. Anillos de despliegue. Rollout gradual. Es práctica estándar en cualquier equipo que haya sufrido un outage por un deploy apresurado.

El incidente de CrowdStrike muestra que esa disciplina no se aplica a las herramientas que instalamos.

Cuando construimos Data Hogo, tomé una decisión deliberada desde el principio: nunca instalar un agente en tus máquinas. No porque no pudiéramos. Sino porque el riesgo de un agente en el kernel — incluso bien construido, incluso con buenas intenciones — tiene un blast radius potencial que va mucho más allá de la funcionalidad del producto.

Data Hogo escanea via GitHub API en la capa de aplicación. Sin acceso al kernel. Sin drivers. Sin boot loops. El tradeoff es que no podemos hacer detección en tiempo real de actividad maliciosa en endpoints — eso lo hace un EDR como Falcon. Pero tampoco podemos tirar tu máquina con una actualización de config.

No es que una arquitectura sea objetivamente superior. Es que cada opción tiene sus riesgos, y los equipos deberían entender cuáles aceptan cuando instalan una herramienta.

Preguntas que deberías hacerle a cualquier vendor de seguridad antes de instalar su agente:

  1. ¿Soportas grupos de staged rollout para actualizaciones del sensor? Si la respuesta es no, todos tus endpoints reciben cada update simultáneamente.
  2. ¿Puedo retrasar las actualizaciones automáticas de contenido N horas? Un retraso de 24 horas hubiera sido suficiente para que CrowdStrike detectara el problema antes de que llegara a tu infraestructura.
  3. ¿Cuál es tu mecanismo de rollback si una actualización del sensor causa un problema en el sistema? Específicamente: ¿puedo hacer rollback remotamente, o necesito acceso físico?
  4. ¿Las actualizaciones de contenido pasan por el mismo proceso de validación que las actualizaciones del driver? Esta es la pregunta que CrowdStrike no hubiera querido responder antes del 19 de julio.

Qué pueden hacer los equipos pequeños ahora mismo

No todos usamos CrowdStrike. Pero todos usamos alguna herramienta que corre con privilegios elevados — antivirus, EDR, extensiones del kernel, agentes de monitoreo.

Este es el checklist que revisé en nuestro propio stack después del incidente:

Conoce qué corre con privilegios elevados. En Windows, puedes ver los drivers del kernel activos con:

# Lista todos los drivers del kernel cargados actualmente
Get-WmiObject Win32_SystemDriver | Where-Object {$_.State -eq "Running"} | Select-Object Name, PathName, StartMode

En Linux, el equivalente para ver módulos del kernel cargados:

# Lista módulos del kernel activos
lsmod | sort

Si hay nombres que no reconoces — investígalos. No asumas que todo lo que está en esa lista es legítimo o necesario.

Lee la política de updates antes de instalar. Antes de instalar cualquier herramienta de seguridad, busca en su documentación: ¿cómo se entregan las actualizaciones? ¿Puedes fijar versiones? ¿Hay opción de delayed rollout? Si la documentación no responde estas preguntas, es una bandera roja.

Fija versiones en infraestructura crítica. Para CI runners y servidores de producción, no uses "latest". Usa versiones explícitas y actualiza en un calendario deliberado. Sí, esto significa que recibes actualizaciones de seguridad más tarde. También significa que una actualización rota no llega a producción sin que nadie la apruebe.

# MAL: auto-update implícito, cualquier versión nueva llega automáticamente
crowdstrike_falcon:
  channel: stable
 
# BIEN: versión fijada, actualización deliberada en tu calendario
crowdstrike_falcon:
  version: "7.18.17106.0"
  auto_update: false

Usa una máquina canary. Designa un endpoint (o una VM) que recibe actualizaciones antes que el resto. Si esa máquina tiene problemas, sabes que no quieres propagar la actualización. No necesitas infraestructura sofisticada — una sola VM con la actualización más reciente de tus herramientas de seguridad es infinitamente mejor que cero.

Mantén documentación de recuperación offline. Esto lo aprendió el mundo el 19 de julio: si tu único runbook de recuperación está en una máquina que está en boot loop, tienes un problema estructural. La documentación de incidentes críticos necesita ser accesible sin depender de los sistemas que potencialmente están caídos. Un PDF en Drive o Notion con acceso desde tu celular es suficiente.

El comando de recuperación para el incidente de CrowdStrike fue:

# Arrancar en Safe Mode o Windows Recovery Environment, luego:
del C:\Windows\System32\drivers\CrowdStrike\C-00000291*.sys

Simple. Efectivo. Pero requería acceso físico o de consola a cada máquina afectada. 8.5 millones de veces.


La pregunta incómoda: ¿pueden las herramientas de seguridad ser más peligrosas que las amenazas que detienen?

Voy a ser directo porque esto merece una respuesta honesta, no una que proteja a la industria.

Un exploit de zero-day sofisticado — del tipo que cuesta millones desarrollar, que grupos de threat actors pasan meses refinando — puede, en el mejor caso para el atacante, impactar a decenas de miles de objetivos simultáneamente. Los ataques más grandes y devastadores de la historia (WannaCry, NotPetya) afectaron cientos de miles de máquinas en días. Impresionante. Catastrófico. Pero gradual.

Una mala actualización de una herramienta de seguridad dominante en el mercado llegó a 8.5 millones de máquinas en minutos.

No es un argumento contra las herramientas de seguridad. Falcon hace su trabajo. Los EDRs detectan amenazas reales que de otra manera no encontrarías. El valor es genuino.

Es un argumento a favor de tratar las herramientas de seguridad con el mismo rigor de ingeniería que el código de producción. Las mismas preguntas que te haces antes de deployar un cambio a producción — ¿tenemos staged rollout? ¿tenemos rollback? ¿tenemos alertas tempranas? — aplican a las actualizaciones de las herramientas que protejen tu infraestructura.

La ironía real es esta: la herramienta diseñada para protegerte necesita privilegios de kernel por definición. Eso significa que tiene más blast radius potencial que la mayoría de los ataques que está tratando de prevenir. Un atacante necesita encontrar una vulnerabilidad en tu código, escalar privilegios, evadir detección. La herramienta de seguridad ya tiene el acceso más alto posible desde el día uno.

Eso no es un fallo de diseño de CrowdStrike específicamente. Es una realidad estructural del tipo de producto que es un EDR. El problema fue la política de updates, no la arquitectura.

Y esa es exactamente la distinción importante: el riesgo no está en qué hace la herramienta — está en cómo se actualiza.


La lección práctica que me llevo de este incidente, y que aplico a cómo construimos Data Hogo, es simple: el software que tiene más acceso debería tener los procesos de actualización más conservadores. No los más agresivos. El update automático instantáneo a nivel global es una estrategia adecuada para una app de notas. Es una decisión arriesgada para un driver en modo kernel instalado en millones de endpoints críticos.

Si usas herramientas de seguridad en tu infraestructura — y deberías — revisa hoy cómo se actualizan. No asumas que el vendor tiene staged rollout configurado por defecto. Después del 19 de julio de 2024, ya sabemos que no siempre es así.

Para la capa de código y configuración — secretos expuestos, dependencias sin parchear, reglas de acceso mal configuradas — eso es lo que Data Hogo detecta sin necesitar acceso a tu kernel. Escanea tu repo gratis en datahogo.com.


TL;DR

  • El 19 de julio de 2024, CrowdStrike empujó una actualización de channel file (C-00000291) a todos los sensores Falcon globalmente, sin staged rollout.
  • El archivo contenía un template inválido que pasó el Content Validator por un error lógico en el pipeline de testing de CrowdStrike.
  • Cuando el sensor intentó procesar el archivo, se disparó una null pointer dereference en modo kernel — sin red de seguridad, sin recuperación remota posible.
  • 8.5 millones de máquinas Windows quedaron en boot loop. La recuperación requería acceso físico a cada una.
  • El costo estimado: $5.4B en reclamaciones de seguros, $500M+ en pérdidas para Delta Airlines.
  • Un canary del 1% hubiera limitado el impacto a ~85,000 máquinas y hubiera permitido un rollback antes de la propagación global.
  • Las herramientas de seguridad que corren en modo kernel tienen más blast radius potencial que la mayoría de los ataques que previenen — el riesgo no está en lo que hacen, está en cómo se actualizan.
  • Para tu infraestructura: fija versiones explícitas en producción, usa una VM canary, y pregunta a cada vendor de seguridad cuál es su política de staged rollout antes de instalar.
  • La documentación de recuperación debe ser accesible sin depender de los sistemas que pueden estar caídos.
CrowdStrikeWindowsBSODkernelauto-updateherramientas de seguridadanálisis de incidentesstaged rollout