ZIP Disfarçado: Lendo os Magic Bytes do Arquivo em Vez da Extensão
O desafio
Um analista extraiu report.pdf do notebook de um suspeito, mas ele nunca abre num leitor de PDF. Abra-o no visualizador hexadecimal, compare os primeiros bytes com as assinaturas de referência e digite o formato real do contêiner.
O que você vai aprender
- Ler os primeiros bytes de um arquivo em um visualizador hexadecimal e reconhecer uma assinatura de arquivo conhecida
- Associar a assinatura 50 4B 03 04 ('PK') à família de contêineres ZIP
- Explicar por que a extensão de um arquivo é metadado e os magic bytes são a verdade absoluta
- Reconhecer que documentos do Office e APKs são, por baixo, contêineres ZIP
- Descartar PDF, RAR e 7-Zip comparando suas assinaturas iniciais distintas
Habilidades testadas
Pré-requisitos
- Familiaridade com a leitura de valores de bytes em hexadecimal
- Consciência de que a extensão de um arquivo pode ser alterada livremente sem modificar o conteúdo
Como funciona
Todo formato de arquivo comum começa com uma sequência fixa de bytes chamada de número mágico ou assinatura. O sistema operacional e a maioria dos visualizadores, porém, decidem qual aplicativo abrir com base na extensão do arquivo, um dado de metadado no nome que qualquer usuário pode renomear em segundos. É exatamente essa brecha que este desafio explora: um arquivo chamado report.pdf cujo conteúdo real não é um PDF.
Um PDF genuíno começa com os bytes ASCII 25 50 44 46, que formam %PDF. O arquivo à sua frente, no entanto, começa com 50 4B 03 04. Os dois primeiros bytes, 50 4B, são o ASCII PK, as iniciais de Phil Katz, criador do formato ZIP, e 03 04 é o marcador de cabeçalho de arquivo local. Essa sequência de quatro bytes é a assinatura inconfundível de um arquivo ZIP.
Isso importa muito além de arquivos renomeados. Documentos modernos do Office (.docx, .xlsx, .pptx), JARs Java e APKs do Android são todos contêineres ZIP usando uma extensão diferente. Um defensor que confia na extensão vai classificar mal todos eles. A ação confiável é sempre a mesma: abrir o cabeçalho e ler os magic bytes.
Erros comuns
- Confiar na extensão. Presumir que
report.pdfé um PDF só porque o nome diz isso. O nome é metadado; os bytes são o arquivo. - Interpretar mal 50 4B como 'PK ilegível'. Ignorar a coluna ASCII, onde
50 4Bclaramente aparece comoPK, o sinal revelador da família ZIP. - Confundir ZIP com RAR ou 7-Zip. O RAR começa com
52 61 72 21('Rar!') e o 7-Zip começa com37 7A BC AF; apenas50 4B 03 04é ZIP. - Parar em 'é um arquivo compactado'. O enunciado pede o formato de contêiner específico, e a assinatura aponta para apenas um: ZIP.
Como se proteger
Detecção e triagem devem se basear no conteúdo, não no nome do arquivo, e uploads precisam ser validados pelo tipo real antes de serem armazenados ou processados.
- Use um identificador baseado em conteúdo (uma verificação no estilo libmagic) em todo arquivo enviado ou colocado em quarentena, em vez de confiar na extensão.
- Em uma allow-list de upload, verifique se os magic bytes correspondem ao tipo declarado e rejeite as inconsistências, já que ZIP disfarçado de PDF é um truque clássico de contrabando.
- Trate qualquer assinatura da família ZIP (
50 4B 03 04) com extensão que não seja de arquivo compactado como suspeita e encaminhe para inspeção mais profunda. - Ao descompactar arquivos desconhecidos, faça isso em uma sandbox e proteja-se contra path traversal (Zip Slip) dentro das entradas.