Chave AES de 9 bits: aleatoriedade fraca na criptografia de PDFs permite abrir arquivos sem senha
Aprofundamento CEVIU
Aprofundamento
A pesquisa publicada no v12.sh mostra que várias implementações de PDF geram a chave de arquivo AES-256 a partir de espaços de estado pequenos o bastante para enumerar. A senha não cifra o documento direto. A implementação sorteia uma chave de arquivo de 32 bytes, que cifra o conteúdo, e a senha (com um salt) só deriva outra chave que protege essa chave de arquivo. Se o sorteio é fraco, dá para recuperar a chave sem senha nenhuma.
MuPDF antes da versão 1.28.5 usa a família drand48, um gerador congruencial linear de 48 bits semeado uma vez com o epoch em segundos. Cada byte de saída vem dos bits 17 a 24 do estado, e bits altos nunca afetam os baixos. Sobram 25 bits relevantes, 16 deles fixos (0x330e), então só 9 bits do timestamp contam. Timestamps separados por 512 segundos geram o mesmo fluxo de bytes. A busca por força bruta em Python sem otimização leva cerca de 11 milissegundos, e o /ID em texto claro serve de verificação extra.
Foxit PDF Reader 2026.1.3.36551 deriva a chave com um hash do timestamp atual, 32 bytes não inicializados (na prática zerados) e uma constante. O bloco /Perms tem texto conhecido, então testar cada candidato custa um hash e uma decifragem de bloco AES. Em uma Ryzen 9 7950X com 32 threads, a implementação em Rust testa de 370 a 376 milhões de timestamps por segundo. O padrão já aparecia no commit público inicial do PDFium, de maio de 2014, com crédito à Foxit no cabeçalho do arquivo.
OpenPDF 3.0.5 e iText 9.7.1 usam um IVGenerator, um fluxo ARC4 semeado com timestamp em milissegundos e a memória livre da JVM. Há mais variância, mas o espaço de busca continua menor que o anunciado. Os problemas foram reportados aos fornecedores e corrigidos no caso do MuPDF. Cópias já publicadas de PDFs cifrados não ganham proteção retroativa.
Por que isso importa
Para quem protege PDFs com AES-256 em fluxos de documentos sensíveis, a leitura é direta: o rótulo de 256 bits não garante nada se a chave nasce de um gerador previsível. Vale conferir qual biblioteca ou editor gerou o arquivo e atualizar o MuPDF. Arquivos antigos já distribuídos continuam expostos, então tratar esses PDFs como potencialmente legíveis é a postura mais segura.
Perguntas frequentes
Como é possível abrir um PDF protegido sem saber a senha?
A senha só protege a chave de arquivo de 32 bytes, que de fato cifra o conteúdo. Se essa chave foi gerada com aleatoriedade fraca, como um timestamp, dá para enumerar os candidatos e testar cada um. Assim a senha nunca entra na conta.
Quais softwares foram citados na pesquisa?
MuPDF (antes da 1.28.5), Foxit PDF Reader 2026.1.3.36551, OpenPDF 3.0.5 e iText 9.7.1. O código da Foxit também aparece no commit inicial do PDFium, de 2014, e outros editores podem ter herdado o padrão por esse caminho.
Por que a chave do MuPDF tem só 9 bits efetivos?
O gerador drand48 é semeado com o timestamp em segundos, e cada byte vem dos bits 17 a 24 do estado. Como bits altos não influenciam os baixos, só 9 bits do timestamp afetam a saída. São apenas 512 possibilidades.
PDFs já criados estão protegidos depois da correção?
Não. O MuPDF corrigiu o problema, mas arquivos já gerados e publicados com chaves fracas não podem ser protegidos retroativamente. Esses documentos continuam vulneráveis.
Fontes
- v12.shfonte original
- Categoria
- CEVIU
- Publicado
- 29 de outubro de 2026
- Editoria
- CEVIU

