Revisão incremental não é fraude: o que 250 contratos públicos assinados mostram

A infraestrutura de assinatura do país produz, por projeto, exatamente o padrão que um detector calibrado lá fora chama de adulteração.

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 .docx e 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.

Bandas de risco em 250 contratos públicos autênticos do PNCP: baixa 124, elevada 14, alta 112. Média 48. Banda de risco — 250 contratos públicos autênticos baixa 124 elevada 14 alta 112 Média 48. Nenhum destes documentos é fraudulento. O vale no meio é o que diz que são duas populações, e não uma com ruído.
Duas populações de arquivo dentro do mesmo corpus. O que separa uma da outra não é a honestidade de quem assinou — é qual ferramenta gerou o PDF.

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.

Um contrato assinado por três partes: a revisão 1 é o documento gerado, a revisão 2 é a primeira assinatura, a revisão 3 a segunda e a revisão 4 a terceira. A assinatura da revisão 2 cobre apenas até o fim da revisão 2, não o arquivo inteiro. revisão 1 — contrato gerado páginas, fontes, metadados revisão 2 — assinatura do contratado nenhum objeto de página mudou revisão 3 — assinatura do ordenador nenhum objeto de página mudou revisão 4 — assinatura da testemunha nenhum objeto de página mudou %%EOF %%EOF %%EOF %%EOF /ByteRange da 1ª assinatura arquivo entregue 4 revisões 1 assinatura que não cobre o fim tudo autêntico
A barra vermelha é o que a primeira assinatura protege. Ela termina onde o arquivo terminava quando foi aplicada — e o restante foi anexado por quem assinou depois, legitimamente.

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.

Sinais de Office em 62 modelos de governo legítimos: office-structure-anomalies disparou em 53, office-editor-fingerprint em 52, office-metadata-mismatch em 38, office-date-anomalies em 14, office-hidden-content em 13. Sinais de Office — 62 modelos de governo, todos legítimos office-structure-anomalies 53 office-editor-fingerprint 52 office-metadata-mismatch 38 office-date-anomalies 14 office-hidden-content 13
85% de uma população honesta. Uma barra dessas não está medindo risco, está medindo como o Word do serviço público salva arquivo.

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.