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