O arquivo de negação de serviço clássico era a bomba zip recursiva: o 42.zip aninha seis camadas de arquivos zip e chega a 4,5 PB apenas se o descompactador continuar desempacotando arquivos aninhados. A maioria dos parsers reais descompacta uma vez, então a camada superior rende uns míseros 0,6 MB, e os scanners se defendiam limitando a profundidade de recursão e o tamanho descompactado. O ataque que todos conheciam tinha a forma de uma árvore.
A jogada de David Fifield foi remover a recursão. Ele comprime um único núcleo de bytes repetidos e então aponta dezenas de milhares de entradas do diretório central para intervalos sobrepostos desses bytes, citando cada cabeçalho de arquivo local interveniente dentro de blocos não comprimidos do DEFLATE para que os parsers comuns ainda vejam arquivos distintos e bem formados. Cada byte do núcleo é descompactado uma vez por arquivo, então a saída cresce quadraticamente em relação à entrada, e a bomba detona em um único unzip.
Os números superaram toda construção anterior: com 42.374 bytes, o tamanho da camada externa do 42.zip, o arquivo se expande para 5,5 GB (uma razão de 129.000); a versão de 10 MB se expande para 281 TB, uma razão superior a 28 milhões e 99,97% do máximo teórico do formato zip; com a extensão Zip64, 46 MB se expandem para 4,5 PB. A USENIX aceitou o artigo para seu workshop WOOT 2019 e o premiou como Best Paper.
O lançamento se tornou um teste ao vivo das defesas da indústria. Varreduras do VirusTotal da amostra de 10 MB deram timeout em muitos mecanismos; o ClamAV queimou CPU até sua detecção ser corrigida, e depois corrigida de novo; Mark Adler escreveu um detector de arquivos sobrepostos para o UnZip que o Debian distribuiu enquanto o SUSE recusou (CVE-2019-13232); o Chromium adicionou métricas para razões de compressão anômalas; e a Apple mitigou o esgotamento de cache do Quick Look no iOS 14.
Sobrepor muitos arquivos sobre um único núcleo comprimido para que cada byte armazenado se expanda N vezes
Ataca a premissa sob a defesa padrão: os scanners limitavam a profundidade de recursão, então uma bomba que se expande totalmente em uma única passagem parece comum até inundar o disco.
A sobreposição torna a razão superlinear, porque cada byte armazenado contribui para todos os arquivos de saída, então o arquivo se torna mais letal à medida que cresce, em vez de adicionar um fator fixo por camada.
A compatibilidade foi projetada com nomes correspondentes, CRCs corretos e DEFLATE puro, então a demonstração rodou nos parsers Info-ZIP, Python, Go e Android em vez de ser um caso isolado.
Fifield publicou amostras funcionais e aliou o ataque à correção, à detecção de sobreposição e ao sandboxing de parsers, o que transformou uma curiosidade em patches que os fornecedores podiam adotar.
Quando os defensores corrigem um formato de ataque, mude o formato: arquivos sobrepostos tornaram a recursão opcional e os limites de profundidade inúteis. Limite tempo e disco dentro do parser em vez de enumerar assinaturas.
O detector de sobreposição de Mark Adler chegou ao UnZip e ao Debian, o ClamAV primeiro verificou apenas pares adjacentes, depois impôs um limite de tempo, o std.zip do D aprendeu a rejeitar sobreposições, o Chromium adicionou métricas de razão anômala, e a Apple mitigou o esgotamento do Quick Look no iOS 12/13 no iOS 14. O VirusTotal documentou mecanismos que deram timeout, e os fornecedores de antivírus atualizaram a detecção ao longo de 2019. O Google Safe Browsing sinalizou todo o bamsoftware.com do final de julho a meados de agosto de 2019, quebrando brevemente o broker Snowflake do Tor, e a Xfinity bloqueou a página em novembro de 2019. Fifield ganhou o Best Paper na USENIX WOOT 2019.
CONFIRA AS EVIDÊNCIAS
As fontes
- A better zip bomb David Fifield · bamsoftware.com
- A better zip bomb (Best Paper), USENIX WOOT 19 USENIX Association · usenix.org
- A better zip bomb — Hacker News discussion Hacker News · news.ycombinator.com ·