Resumo

  • Instâncias públicas de memcached em UDP podiam aceitar uma solicitação minúscula com o IP da vítima falsificado e enviar à vítima uma resposta milhares de vezes maior.
  • A correção foi distribuída: o memcached 1.5.6 desligou UDP por padrão, redes de acesso podiam bloquear origens falsas, e o GitHub manteve controles locais de detecção, anúncio BGP e contratação de filtragem.

Quem pagou pela resposta

Memcached foi concebido para acelerar aplicações dentro de redes confiáveis. Seu transporte UDP não estabelece uma conexão antes da resposta. Quando o serviço ficava acessível na Internet, o endereço de origem escrito no pacote funcionava como destino de retorno sem prova de que o remetente controlava aquele endereço.

Cloudflare descreveu uma exploração prática: o atacante gravava um valor grande num cache exposto e depois enviava um pequeno get, usando o endereço da vítima como origem. Em um teste, 15 bytes geraram 134 KB. Em outra observação, 15 bytes resultaram em 750 KB, um fator de 51.200.

Esses números não são constantes do protocolo nem medições de todo o fluxo recebido pelo GitHub. Eles demonstram a assimetria. O atacante compra uma solicitação pequena; o operador do cache paga pela resposta; a vítima recebe tráfego que não solicitou. O software, a rede de origem e o alvo carregam partes diferentes do prejuízo.

O incidente medido pelo GitHub

Em 28 de fevereiro de 2018, GitHub.com ficou indisponível das 17h21 às 17h26 UTC e teve indisponibilidade intermitente até 17h30. Segundo a empresa, a confidencialidade e a integridade dos dados não estiveram em risco.

O ataque veio de dezenas de milhares de pontos em mais de mil sistemas autônomos. O pico chegou a 1,35 Tbps e 126,9 milhões de pacotes por segundo. Esses valores pertencem ao relato do GitHub e devem permanecer separados dos ensaios da Cloudflare.

Às 17h21, o monitoramento detectou uma relação anormal entre entrada e saída. Quando o trânsito de entrada ultrapassou 100 Gbps numa instalação, o GitHub decidiu mover o tráfego para a Akamai. Às 17h26, um comando via ChatOps retirou anúncios BGP dos provedores de trânsito e passou a anunciar o AS36459 exclusivamente pelos enlaces com a Akamai. As rotas reconvergiram, ACLs filtraram o ataque na borda da parceira e o GitHub confirmou recuperação total às 17h30.

Às 17h34, a empresa retirou também rotas de pontos de troca, deslocando mais 40 Gbps. Pouco depois das 18h veio um segundo pico de cerca de 400 Gbps. O relatório anunciou a investigação de uma ativação mais automatizada dos provedores anti-DDoS; não comprova que essa automação posterior tenha sido implantada.

O episódio delimitou a autoridade da vítima. O GitHub não podia fechar caches remotos durante o ataque. Podia detectar o que chegava, alterar seus próprios anúncios, escolher uma capacidade externa e verificar a recuperação.

O padrão executável mudou

A versão 1.5.6 do memcached saiu em 27 de fevereiro. As notas afirmam que ela desabilitou principalmente o protocolo UDP por padrão. O commit correspondente trocou settings.udpport = 11211 por settings.udpport = 0 e removeu a abertura implícita de UDP quando apenas uma porta TCP era indicada. Os testes acompanharam a mudança.

UDP continuou disponível mediante -U 11211. A decisão não proibiu uma necessidade local; eliminou a autorização perigosa que surgia quando ninguém tomava uma decisão explícita. Instalações novas deixaram de criar refletores UDP apenas por aceitar o padrão.

Ainda assim, o número da versão não prova o comportamento. Parâmetros de inicialização podem reativar UDP. Uma versão antiga pode estar vinculada a uma rede privada e protegida por firewall. O fato relevante é observável no fio: o processo em execução responde a UDP 11211 vindo de fora e qual é a relação entre entrada e saída?

Running-Code Primacy separa esses níveis. A nota de versão declara; o código configura; o teste preserva; a sonda externa demonstra a adoção efetiva.

A mentira de origem começa perto do atacante

Fechar o cache reduz a amplificação. Validar o endereço de origem impede que o pedido seja dirigido à vítima sob identidade falsa.

O RFC 2827, BCP 38, recomenda que um provedor aceite de um cliente apenas pacotes cujas origens pertençam aos prefixos legitimamente usados por esse cliente. Na borda adequada, um pacote que sai de uma rede e finge vir do GitHub deve ser descartado antes de alcançar qualquer refletor.

Topologias multihomed e rotas assimétricas exigem cuidado. O RFC 3704 apresenta listas de acesso, RPF estrito, caminho viável e variantes menos rígidas. Um controle estrito mal modelado pode bloquear tráfego legítimo. Um controle frouxo pode achar alguma rota para a origem sem comprovar que o cliente conectado naquela interface tinha direito de usá-la.

A especificação inicial mínima deve fixar a propriedade comum—não exportar identidades de origem alheias—e deixar a implementação para quem conhece a topologia. A escolha local inclui dados de rota, automação, exceções e migração, mas precisa produzir um resultado testável.

Controles complementares não são substitutos

O operador do cache prova exposição e volume de resposta. A rede de acesso prova que seus clientes não falsificam fontes. A vítima prova que detecta, muda rotas, ativa filtragem e retorna com segurança. Cada fronteira exige evidência própria.

Scrubbing protege o GitHub depois que caches alheios já emitiram os bytes. UDP desligado remove um refletor, não corrige a rede permissiva do atacante. BCP 38 reduz pedidos falsificados, não cria capacidade nem ensaia BGP para a vítima.

Também não é preciso entregar poder permanente a um coordenador central. A Akamai filtrou porque o GitHub escolheu anunciar seu sistema autônomo por aquele caminho. O projeto memcached definiu um início mais seguro sem controlar as máquinas dos usuários. RFCs coordenaram prática sem operar roteadores.

Limites das fontes

Há evidência para o mecanismo, o pico de 1,35 Tbps e a mudança no padrão do software. Não há prova de que toda instância memcached estava exposta, que todo pacote amplificou 51.200 vezes ou que todas as redes de origem careciam de BCP 38. O plano de automação do GitHub permanece um plano no documento consultado.

A conclusão mais resistente é sobre permissão. Um padrão deu a uma máquina o poder de responder a estranhos; uma borda permitiu a um cliente tomar emprestada a identidade de terceiros; uma vítima recuperou o serviço usando decisões que já controlava. A política pode recomendar. O tráfego mostra quem realmente adotou.

Fontes