Referência: Como saber se um PDF foi editado
Quase tudo que se escreve sobre forense de PDF foi calibrado em documentos americanos e europeus, e há uma frase que aparece em todos eles: se o arquivo tem mais de uma revisão, desconfie. Eu queria saber o que essa frase faz com documento brasileiro. Então baixei 250 contratos públicos assinados do PNCP, 62 modelos de documento publicados por órgãos de governo e 33 PDFs publicados por bancos, e rodei os 345 pelo motor.
Nenhum deles é fraude. São contratos administrativos publicados por obrigação legal, modelos oficiais de formulário e material que banco põe no próprio site. Tudo que dispara aqui é falso positivo por definição, e a pergunta interessante não é quantos dispararam — é por quê.
A distribuição é bimodal, e os dois picos têm nome. Dos 250 contratos, 124 caíram na banda baixa e 112 na banda alta, com apenas 14 no meio. A média ficou em 48. Isso não é ruído: são duas populações diferentes de arquivo dentro do mesmo corpus.
O grupo alto é o fluxo de assinatura ICP-Brasil. O
BRySignerPDF aparece como produtor em 76 documentos e anexa
uma revisão incremental por signatário. Um contrato assinado por
três partes carrega três revisões e uma primeira assinatura que já não cobre o
arquivo inteiro — que é, byte a byte, o padrão descrito em todo lugar como sinal
de adulteração.
A lição que eu tiro é estreita e acho que é a que importa: "revisões incrementais" sozinho não é evidência de fraude no Brasil, porque a infraestrutura de assinatura do próprio país produz revisões incrementais por projeto.
O que é o corpus
- 250 contratos públicos assinados, obtidos pelo PNCP. A Lei 14.133 obriga a divulgação do contrato assinado no portal, o que cria uma coisa rara: um acervo grande de documentos assinados digitalmente, autênticos, e públicos por mandato legal.
-
62 modelos publicados por órgãos de governo — 52
.docxe 10 PDF. Editais-modelo, formulários, minutas. - 33 PDFs publicados por bancos em domínio próprio, de 19 emissores diferentes.
-
345 arquivos brasileiros, parte de uma rodada de 705 documentos
naquele dia, somando os alvos brasileiros e americanos.
Zero falhas de parse nos 705 — inclusive nos 52
.docx, que foram o primeiro trabalho pesado do parser de Office.
Nenhum documento de terceiro aparece neste post, e nenhum foi guardado. O motor rodou localmente, em processo, então nenhum arquivo baixado trafegou para uma API hospedada. Os originais foram apagados no mesmo dia em que as anotações foram escritas; o que ficou foi um manifesto com URL de origem, SHA-256 e carimbos de tempo por arquivo — suficiente para reproduzir cada número daqui, insuficiente para reconstruir o documento de alguém. Tudo abaixo é agregado.
A forma bimodal é o achado
Um corpus homogêneo produz uma distribuição com um pico só. Este produziu dois, e o vale entre eles é quase vazio.
O pico alto: uma revisão por signatário
O PDF não reescreve o arquivo quando é salvo de novo: ele anexa. Assinar digitalmente é uma dessas gravações — a assinatura precisa ser adicionada sem alterar os bytes que ela mesma vai cobrir, e a atualização incremental é o mecanismo que o formato oferece para isso. Está descrito em detalhe no guia de PDF editado.
A consequência é aritmética. Cada signatário anexa uma revisão. E como a primeira
assinatura foi aplicada quando o arquivo terminava ali, o /ByteRange
dela cobre menos que o arquivo final — as assinaturas seguintes vieram depois e
estão fora do alcance da primeira.
Nos 250 contratos, os sinais que isso acende são exatamente os que se esperaria:
signature-coverage em 97 arquivos, incremental-updates
em 92, id-inconsistency em 119 e avisos de estrutura em 106. Todos
verdadeiros sobre os bytes. Todos sobre documentos autênticos.
Vale ser preciso sobre o que isso não quer dizer.
signature-coverage continua sendo um sinal bom: a pergunta "o que a
assinatura cobre?" tem uma resposta objetiva e útil. O que muda é a leitura.
"Cobre menos que o arquivo inteiro" descreve o fluxo normal de assinatura
multipartes; "cobre menos que o arquivo inteiro e o que veio depois substituiu
objeto de página" é outra conversa, e é essa a que interessa.
O pico baixo: saída de gerador
O outro aglomerado é material nascido digital, saído direto de um gerador de
relatório. O Telerik Reporting aparece como produtor em 105 dos 250 —
o maior grupo isolado do corpus. Revisão única, metadados coerentes,
/ID consistente, nada anexado depois.
A diversidade de produtores do resto vale registrar, porque é o começo de uma
tabela de impressão digital brasileira que hoje não existe: iText 2.1.7, FPDF
1.82, Word LTSC, Crystal Reports, PDFium, Qt e Quartz do macOS aparecem todos em
contrato público assinado. Um /Producer incomum, sozinho, não separa
nada aqui — a administração pública brasileira gera PDF com o que tem.
E há a armadilha inversa, que é a mais fácil de esquecer: uma revisão só não significa que o arquivo nunca foi mexido. Ferramenta que reescreve o documento inteiro achata o histórico e devolve um arquivo de revisão única e metadados impecáveis. O contrato mais limpo deste corpus e um documento reimpresso do zero se parecem muito.
Os 62 modelos, e um sinal que descreve a população
Os 62 modelos de governo — 52 .docx e 10 PDF — tiveram média 22, com
47 na banda baixa. É o material mais tranquilo da rodada inteira. E é justamente
nele que apareceu a calibração mais desconfortável.
office-structure-anomalies disparou em 53 dos 62 e
office-editor-fingerprint em 52. Um sinal que dispara em 85%
da população honesta não está descrevendo risco, está descrevendo a
população. A gradação de severidade já segurou as bandas embaixo — 47 dos
62 continuaram na banda baixa —, mas isso é a rede de segurança funcionando, não o
sinal estando certo. O texto e o peso desses dois precisam absorver esta medição.
Nada disso é falha do parser. Modelo de governo é documento que passou por muita mão: foi feito numa versão de Office, editado noutra, salvo por alguém que herdou o arquivo do antecessor, exportado, reaberto. A estrutura interna guarda essa história inteira, e a história é honesta.
33 PDFs de banco, 19 emissores
Os 33 PDFs publicados por bancos brasileiros tiveram média 75, com 22 na banda alta. É o material mais barulhento do lado brasileiro, pela mesma razão que vale lá fora: material publicado passa por mais ferramentas que documento operacional. Adobe, Word e Ghostscript aparecem lado a lado, às vezes no mesmo emissor.
O que dá para tirar daí é uma tabela inicial de produtores por emissor — e não é pouco, porque hoje ela não existe. O que não dá para tirar é uma linha de base de extrato. Um PDF institucional publicado no site não descreve o sistema que emite o extrato do cliente; são duas cadeias de ferramenta que só têm o logotipo em comum.
O que falta construir
O guia de boleto já admite o buraco em voz alta: nenhuma linha de base de emissor brasileiro vem pronta no produto. Os 250 contratos deste corpus são o primeiro material sério para começar a fechá-lo.
O formato que os dados pedem é um padrão benigno reconhecido: "assinatura múltipla ICP-Brasil". Se o produtor nomeia um assinador ICP-Brasil e a contagem de revisões bate com a contagem de assinaturas, e nenhuma revisão substituiu objeto de página, então revisões incrementais são o resultado esperado e devem pesar como resultado esperado. Uma revisão a mais que assinaturas continua exatamente tão interessante quanto era.
Isso é a mesma máquina de uma linha de base de emissor, aplicada ao processador em
vez do emissor — e é barata: os fluxos que importam são poucos, se anunciam no
/Producer, e a lista cabe numa revisão manual.
Enquanto não sobe, o comportamento honesto é o que o motor já faz: mostrar o sinal e a severidade e deixar a decisão com quem tem o resto do contexto. Sinal que dá para ler é recuperável; veredicto fechado, não.
Os limites disso aqui
Este corpus não é amostra aleatória de nada. São os contratos que o PNCP tinha para um punhado de consultas, os modelos que alguns órgãos publicam e o que 19 bancos escolheram pôr no site. As porcentagens descrevem estes 345 arquivos. Não descrevem "o documento brasileiro", e eu não vou fingir que sim.
São falsos positivos do escore, não do parser. Cada achado acima é
factualmente correto sobre o arquivo: houve revisão anexada, a assinatura cobre
menos que o total, o /ID mudou. A correção não é detectar menos, é
explicar mais — um sinal que dispara com uma causa benigna nomeada ao lado vale
mais que um sinal calado.
O erro inverso continua sem medida. Um documento fabricado do zero numa ferramenta de geração, ou passado por uma reimpressão limpa, sai deste motor parecendo melhor que a maioria dos contratos autênticos aqui. Nada nesta medição fala sobre isso, e eu não tenho número defensável para oferecer.
Isto reporta sinais, nunca veredictos. "A assinatura não cobre o arquivo inteiro" é uma afirmação sobre bytes. "Este contrato foi adulterado" é uma afirmação sobre pessoas — e 112 contratos públicos autênticos na banda alta são a razão de um parser não ter o direito de fazê-la.
Rode o mesmo parser num arquivo seu
Todo número acima saiu do motor que roda no verificador gratuito, executado localmente sobre arquivos que foram apagados no mesmo dia. Você joga um PDF e recebe o mesmo relatório de que esta calibração foi feita — cadeia de revisões, cobertura da assinatura, produtor e criador, fontes, composição da página. Sem conta, sem guardar nada.
Se o seu problema é o piso de ruído descrito aqui, comparar um documento com outro que você já confia é a versão desta medição que não depende de linha de base nenhuma.