Sinais de fraude em PDF: o guia de campo

Cada família de sinais que a Tamperlens reporta, o que ela realmente mede, por que dispara em documentos honestos e como a severidade é decidida.

Esta é a página de referência do motor de análise. Dezenove famílias de sinais rodam em todo documento, e cada uma é descrita sob os mesmos quatro títulos: o que detecta, a evidência que devolve, suas causas legítimas e sua lógica de severidade. Elas estão agrupadas nas quatro páginas abaixo, por qual parte do arquivo leem. As seções de causas legítimas não são um aviso legal pregado no final. Elas são a parte de que você precisa para montar uma fila de revisão que a sua equipe de operações não aprenda a ignorar.

Sinais, não veredictos. Cada achado aqui é um fato estrutural sobre um arquivo. "Este documento foi modificado após a geração" é verdadeiro ou falso sobre os bytes; "este documento é fraudulento" é um julgamento sobre uma pessoa, e a Tamperlens não o faz. A API não retorna nenhum campo booleano de veredicto, por decisão de projeto.

Vocabulário de severidade

Quatro severidades, em hierarquia estrita. Elas descrevem quanto um achado isolado estabelece por si só, não a probabilidade de fraude.

  • alta Por si só estabelece que o documento mudou após a geração, ou que uma ferramenta com intenção de edição esteve envolvida.
  • média Um desvio real do padrão "escrito uma única vez por uma única ferramenta", com explicações legítimas comuns.
  • baixa Fraca ou baseada em ausência; remove um fato corroborante em vez de acrescentar um.
  • info Contexto. Não entra no signalCount e não contribui em nada para a pontuação.
Uma família que acha cinco coisas ainda entra no relatório como um sinal só: então contar sinais nunca vira contar problemas.
O QUE A FAMÍLIA ENCONTROU 3 revisões no arquivo um objeto de página sobrescrito a cadeia /Prev conferida inteira reunidos UM SINAL NO RELATÓRIO incremental-updates severidade alta um objeto evidence, com os três achados A ORDEM DOS SINAIS NO RELATÓRIO alta → alta → média → baixa → info Mais severo primeiro; dentro da mesma severidade, alfabético por id. O relatório é estável byte a byte entre execuções.

A invariante corta nos dois sentidos: uma família ausente do relatório não disparou, mas uma família presente não diz quantas vezes o achado dela ocorre no arquivo. Isso está dentro do evidence, não na contagem.

Um relatório contém no máximo um sinal por família. Isso é uma invariante do relatório. Uma família ou dispara uma única vez, com todos os seus achados reunidos em um único objeto evidence, ou não aparece de forma alguma. Os sinais são ordenados do mais severo para o menos severo e, em seguida, alfabeticamente por id, de modo que os relatórios são estáveis byte a byte entre execuções.

Uma família é exceção, e ela é nomeada em vez de escondida. A redaction-exposure reporta uma caixa preenchida desenhada sobre o texto e uma imagem desenhada sobre o texto como dois sinais distintos, porque não são o mesmo achado: a caixa é conclusiva e pontua high, a imagem nunca foi demonstrada como tarja falha em 1.727 documentos publicados e pontua info. Juntar as duas era o comportamento anterior e estava errado: anunciava quatro linhas expostas em severidade alta quando três delas eram um timbre. Todas as outras famílias respeitam a invariante, e um teste prende os três motores a ela em cada fixture do repositório.

As quatro páginas do guia não são temas: são quatro partes diferentes do arquivo, e uma família só enxerga a parte que lê.
O QUE O ARQUIVO GUARDA a papelada trailer · xref · /Info · XMP a tinta da página conteúdo · fontes · imagens o que foi assinado /ByteRange · /DocMDP os valores e a contabilidade dígitos impressos · xref Como um PDF registra a própria origem 5 famílias O que as páginas de um PDF entregam 6 famílias O que uma assinatura realmente cobre 3 famílias Quando os números do documento não fecham 4 famílias

A divisão é o que explica os silêncios: uma reescrita completa do arquivo apaga a papelada e deixa a tinta e os valores intactos, então as duas metades de baixo continuam falando quando as de cima emudecem.

Documentos criptografados: o que o relatório diz que não fez

Quando o trailer referencia um dicionário /Encrypt, as strings e os streams do arquivo são texto cifrado. Valores de metadados, nomes de fontes incorporadas e streams de conteúdo de página não podem ser lidos sem a senha, que a Tamperlens não possui e nunca pede.

O comportamento ingênuo seria rodar todas as famílias de sinais mesmo assim e reportar o que disparasse sobre o ruído. Em vez disso, as cinco famílias dependentes de conteúdo não rodam de forma alguma e a omissão é divulgada como parte de primeira classe do relatório:

  • metadata-mismatch
  • date-anomalies
  • producer-fingerprint
  • font-anomalies
  • hybrid-page
Num arquivo com senha, cinco famílias não rodam, e o relatório diz isso em vez de reportar silêncio.
NÃO RODA · O CONTEÚDO É TEXTO CIFRADO metadata-mismatch date-anomalies producer-fingerprint font-anomalies hybrid-page RODA · A ESTRUTURA NÃO É CIFRADA contagem de revisões o par /ID do trailer o /ByteRange de cada assinatura consistência das referências cruzadas dicionários de ação A OMISSÃO É DIVULGADA, NÃO SUBENTENDIDA structure-warnings · encrypted-content-not-analysed com a lista suppressedFamilies e contentAnalysed: false

Muitos emissores protegem extratos com senha por rotina, então a criptografia não é, por si só, um sinal, e a ausência de um achado de conteúdo aqui não diz nada sobre o documento.

A divulgação chega como o sinal structure-warnings, com o título "Documento criptografado: conteúdo não analisado", carregando evidence.code: "encrypted-content-not-analysed", a lista explícita suppressedFamilies, contentAnalysed: false e structuralAnalysisRan: true. Ela viaja em structure-warnings em vez de chegar como sinal próprio por causa da invariante de um sinal por família.

A análise estrutural não é afetada e de fato roda. A contagem de revisões, o par /ID do trailer, os intervalos de bytes das assinaturas e a consistência das referências cruzadas são todos legíveis sem a senha, assim como a detecção de dicionários de ação. Chaves de dicionário também não são criptografadas. Metadados que por acaso sejam legíveis como texto simples ainda são reportados: um produtor pode deixar o pacote XMP em claro via /EncryptMetadata false, e um teste de plausibilidade de texto deixa isso passar enquanto descarta campos cujos bytes não são texto legível. Quaisquer campos descartados dessa forma são nomeados em metadataFieldsSuppressed.

Leia isto com atenção ao triar um arquivo criptografado. A ausência de um sinal de nível de conteúdo no relatório de um documento criptografado não diz absolutamente nada sobre aquele documento. Essas verificações não rodaram. Trate o relatório como estritamente estrutural, e não como um atestado de idoneidade, e note que muitos emissores protegem extratos com senha por rotina, então a criptografia não é, por si só, um sinal.

Como os sinais viram uma pontuação

summary.riskScore é uma agregação ponderada de 0 a 100, não uma probabilidade e não uma confiança. As regras são curtas o bastante para serem enunciadas por completo, e esse é o ponto: você deve conseguir reconstruir o número a partir da lista de sinais.

  • Pesos. high 70, medium 25, low 10, info 0.
  • Pisos. Um sinal high força a pontuação para pelo menos 70; um medium força pelo menos 30.
  • Retornos decrescentes. Os dois primeiros sinais de uma dada severidade contribuem com seu peso integral; a partir daí, cada sinal adicional da mesma severidade contribui com uma fração que decai acentuadamente. Um acúmulo de achados fracos converge em vez de somar indefinidamente.
  • A faixa alta é reservada. Sem nenhum sinal high presente, a pontuação é limitada a 69, diga o que disser a aritmética. Assim, riskBand === "high" é exatamente equivalente a "pelo menos um achado que, por si só, estabelece uma mudança".
  • Faixas. Abaixo de 30, low; de 30 a 69, elevated; 70 ou mais, high.
  • signalCount conta os sinais acima de info. Um achado informativo é visível no relatório, mas invisível para a contagem e para a pontuação.
A faixa high é reservada: sem um achado que sozinho estabeleça uma mudança, a aritmética não passa de 69.
sem nenhum sinal alta, a pontuação para aqui low elevated high 0-29 30-69 70-100 um sinal média força pelo menos 30 um sinal alta força pelo menos 70 Pesos: alta 70 · média 25 · baixa 10 · info 0. Do terceiro sinal da mesma severidade em diante, cada um contribui com uma fração que decai.

É por isso que riskBand === "high" significa exatamente uma coisa: existe pelo menos um achado que, sozinho, estabelece uma mudança. Nenhum acúmulo de sinais fracos chega lá.

Os pesos são versionados por engineVersion: alterá-los é uma mudança de versão, então uma pontuação que você registrou no trimestre passado continua significando o que significava. O motor é determinístico (bytes idênticos produzem um relatório idêntico, exceto pelo id de cada chamada), o que significa que você pode fixar fixtures e testar por regressão os seus próprios limiares contra nós.

Como usar isto com honestidade

Três hábitos que separam uma etapa de triagem útil de um gerador de clientes furiosos:

  1. Estabeleça a baseline antes de definir limiares. Rode pelo motor documentos que você acredita serem genuínos, agrupados por emissor, e observe quais sinais disparam normalmente na sua população. Strings de producer e hábitos de revisão variam enormemente entre instituições.
  2. Reporte o fato, não a inferência. "Este arquivo contém duas revisões e nomeia um editor de PDF online" é defensável e específico. "Nosso sistema marcou este documento como fraudulento" não é nenhum dos dois, e é a frase que acaba em uma reclamação.
  3. Correlacione. Um único sinal de severidade média é uma pergunta. Um editor de consumo mais uma revisão que sobrescreve conteúdo mais dois subconjuntos de um mesmo tipo de letra é uma história coerente, e a história é aquilo sobre o que um revisor humano pode agir.
Um sinal sozinho é uma pergunta. Três sinais que contam a mesma história é o que um revisor humano consegue usar.
UM SINAL SOZINHO producer-fingerprint média uma pergunta peça o download do próprio emissor TRÊS QUE CONTAM A MESMA HISTÓRIA producer-fingerprint incremental-updates font-anomalies um editor de consumo uma revisão reescreveu a página dois subconjuntos do mesmo tipo uma história coerente e a história é aquilo sobre o que um revisor humano pode agir E os dois lados só significam algo depois da baseline: rode primeiro documentos que você acredita genuínos. Strings de producer e hábitos de revisão variam muito entre instituições. O normal de um emissor é o incomum de outro.

A frase que sai daqui também muda: “este arquivo contém duas revisões e nomeia um editor de PDF online” é defensável e específico. “Nosso sistema marcou este documento como fraudulento” não é nenhum dos dois, e é a frase que acaba em uma reclamação.

Veja o relatório do seu próprio arquivo

O verificador gratuito roda todas as famílias descritas nesta página e exibe a evidência completa, sem conta, nada é armazenado. Para rodá-lo no seu próprio pipeline, veja o guia rápido da API ou crie uma conta para uma chave com 25 documentos grátis por mês.

A Tamperlens reporta sinais de risco, não veredictos de autenticidade. Sinais podem ter causas legítimas; combine-os com a sua própria lógica de decisão.

Leitura relacionada