Resumen
- Un memcached UDP expuesto podía recibir una petición diminuta con la IP de la víctima falsificada y devolver a esa víctima una respuesta miles de veces mayor, aunque nunca hubiera solicitado nada.
- La defensa quedó repartida entre decisiones independientes: UDP desactivado por defecto en memcached 1.5.6, validación de direcciones cerca del origen y controles de detección, desvío BGP y filtrado bajo autoridad de GitHub.
El dato decisivo estaba en la cabecera
En una reflexión UDP, la dirección de origen cumple dos papeles incompatibles: parece identificar al remitente y, al mismo tiempo, indica dónde entregar la respuesta. Sin una conexión previa, el servidor no sabe si ambas cosas son ciertas. Si la red del atacante transporta un paquete que dice provenir de GitHub, el reflector responde a GitHub.
Memcached convirtió esa debilidad en un multiplicador excepcional cuando su servicio UDP quedó accesible desde Internet. Cloudflare explicó que el atacante podía introducir primero un valor grande y después pedirlo mediante get, falsificando como origen la IP objetivo. En una prueba, 15 bytes provocaron 134 KB. Cloudflare observó también un caso de 15 bytes frente a 750 KB, al que asignó un factor de 51.200.
Esas cifras no describen cada clave ni cada servidor. Sí demuestran la asimetría de costes: el atacante enviaba poco, el cacheador ajeno emitía mucho y la víctima recibía una respuesta que nunca había autorizado.
Lo que ocurrió entre las 17:21 y las 17:30
GitHub informó de que GitHub.com estuvo fuera de servicio entre las 17:21 y las 17:26 UTC del 28 de febrero de 2018, y sufrió interrupciones intermitentes hasta las 17:30. No hubo riesgo para la confidencialidad ni la integridad de los datos, según la empresa.
El ataque procedía de decenas de miles de puntos en más de mil sistemas autónomos. Alcanzó 1,35 Tbps y 126,9 millones de paquetes por segundo. Son mediciones del incidente en GitHub, no una extrapolación de la prueba de Cloudflare.
El sistema de monitorización detectó a las 17:21 una anomalía entre el tráfico de entrada y el de salida. Cuando un centro superó 100 Gbps de tránsito entrante, GitHub decidió trasladar la carga a Akamai. A las 17:26 lanzó mediante ChatOps la retirada de anuncios BGP de sus proveedores de tránsito y anunció AS36459 exclusivamente por los enlaces con Akamai. Tras la reconvergencia, listas de control en el borde del proveedor mitigaron el ataque. La recuperación total llegó a las 17:30.
A las 17:34 se retiraron además rutas en puntos de intercambio para desplazar otros 40 Gbps. Poco después de las 18:00 apareció un segundo pico de unos 400 Gbps. GitHub expresó la intención de automatizar la activación de proveedores de mitigación; el informe no prueba por sí solo que ese trabajo posterior se completara.
La importancia operativa está en los verbos: detectar, decidir, retirar, anunciar, filtrar, verificar. Todos correspondían a una superficie que GitHub o su contraparte elegida podían controlar durante el incidente.
Un valor predeterminado dejó de conceder permiso
Memcached 1.5.6 apareció el 27 de febrero. Las notas dicen que la versión desactivó principalmente UDP por defecto. El cambio de código sustituye settings.udpport = 11211 por settings.udpport = 0 y evita que seleccionar un puerto TCP active implícitamente el UDP equivalente. También ajusta las pruebas.
No se eliminó el protocolo. Quien tuviera un motivo local podía reactivarlo con -U 11211. El proyecto cambió algo más importante que una recomendación: el silencio del operador dejó de equivaler a autorizar respuestas UDP.
Pero “1.5.6 instalado” no es un resultado de seguridad. Un argumento de arranque puede volver a abrir el puerto. Una versión anterior puede estar vinculada a una interfaz privada y bloqueada desde fuera. La comprobación válida pregunta qué hace el proceso en ejecución cuando una sonda no confiable llega desde Internet.
Ahí aparece la primacía del código en funcionamiento. La documentación establece una expectativa; la línea cambiada configura el estado inicial; la prueba automatizada evita una regresión; el paquete capturado y la sonda externa muestran el comportamiento efectivo.
La red que acepta la mentira también tiene una decisión
Desactivar UDP reduce el conjunto de reflectores. Sin embargo, el ataque dependía también de que un paquete con dirección de origen falsa saliera de alguna red.
RFC 2827, BCP 38, propone que el proveedor filtre el tráfico de un cliente para admitir únicamente las direcciones que ese cliente usa legítimamente. Aplicado cerca del acceso, el paquete que finge venir de GitHub muere antes de alcanzar el caché.
La frase es sencilla; una red multihomed no lo es. RFC 3704 analiza listas de acceso, RPF estricto, rutas factibles y controles más laxos. Una política estricta puede equivocarse con rutas asimétricas. Una demasiado laxa puede aceptar una dirección porque existe alguna ruta hacia ella, aunque haya llegado por el cliente incorrecto.
La especificación común mínima debe fijar la propiedad: una frontera de cliente no exporta identidades de origen ajenas. La selección del algoritmo y el mantenimiento de la información de rutas siguen siendo locales. Esa autonomía no rebaja la obligación de probar el resultado.
La víctima controla el último límite
Aunque todos los nuevos despliegues de memcached fueran seguros, quedarían configuraciones antiguas y otros protocolos amplificadores. Aunque muchos accesos filtraran origen, un solo camino permisivo podría abastecer una campaña. La víctima necesita por ello su propio plano de control.
En GitHub, ese plano combinó telemetría, autoridad para modificar BGP, capacidad contratada de limpieza y confirmación por códigos de respuesta y ancho de banda. La mitigación externa fue una opción activada por GitHub, no una transferencia general del derecho a enrutar sus prefijos.
Los tres controles producen pruebas distintas. El operador del caché enseña que no responde al exterior. El acceso demuestra que sus clientes no falsifican prefijos. La víctima ensaya el cambio de rutas y mide la reconvergencia. Ningún certificado único cubre esas fronteras.
Límites de la evidencia
Las fuentes sostienen el mecanismo, la medición de GitHub y el cambio del valor predeterminado. No demuestran que todo memcached fuera vulnerable, que el factor 51.200 se aplicara a cada paquete recibido por GitHub ni que BCP 38 estuviera ausente de cada red de origen. Tampoco convierten el plan de automatización de GitHub en un despliegue confirmado.
La conclusión es más útil si se mantiene estrecha. Una dirección IP falsificada permitió trasladar identidad; un valor predeterminado permitió trasladar coste; una ruta preparada permitió trasladar tráfico a un filtro. La gobernanza real estuvo en los sistemas capaces de aceptar o rechazar cada traslado.
Fuentes
- GitHub, informe del incidente DDoS del 28 de febrero
- Cloudflare, Memcrashed
- Cloudflare, la causa real de los grandes DDoS: suplantación IP
- Notas de memcached 1.5.6
- Commit que desactiva UDP por defecto
- Configuración del servidor memcached
- RFC 2827 / BCP 38
- RFC 3704 / BCP 84
- Heng Lu, Running-Code Primacy
- Heng Lu, Minimum Initial Specification, Localized Future Decision, and Voluntary Adoption
Informe para miembros
Contexto ampliado del perfil
Inicia sesión con el nivel de membresía adecuado para desbloquear el informe completo y las notas de las fuentes.
Solo para Strategic Circle
Strategic Circle
Abierto a todos los lectores. Desbloquea informes de perfil después de unirte e iniciar sesión.
Únete a Strategic CircleSolo para Leadership Alliance
Leadership Alliance
Para propietarios y directivos cualificados de activos de propiedad intelectual; inicia sesión para desbloquear los informes de la alianza.
Unirse a Leadership Alliance
