Metadados PDF e dados ocultos

Os metadados de um documento são a informação que um ficheiro transporta sobre si mesmo para além do conteúdo da página: quem os seus campos dizem que o escreveu, que aplicação o produziu, quando diz que foi criado e alterado, e que material anterior ainda está dentro dele. Um PDF pode guardar dois sistemas de metadados sobrepostos, uma cadeia de revisões anteriores, ficheiros completos incorporados e texto desenhado de forma invisível; uma fotografia JPEG guarda um diário de câmara; até uma simples captura PNG nomeia o programa que a fez. Este artigo percorre onde está cada um desses esconderijos, por que razão os dados sobrevivem à edição comum e como aconteceram as fugas reais. Para inspecionar um ficheiro seu enquanto lê, execute a ferramenta de forense de documentos — funciona localmente no seu navegador — e para o lado da estrutura de leitura dos mesmos ficheiros, consulte os seus PDF fazem parte da acessibilidade do seu site.

Dois sistemas de metadados viajam dentro de cada PDF

O mais antigo é o dicionário de informações, um pequeno conjunto de pares chave–valor guardado no trailer do ficheiro: Title, Author, Creator (a aplicação que fez o documento original), Producer (a aplicação que fez o PDF), CreationDate e ModDate. Estes campos são escritos automaticamente na exportação, e a maioria dos autores de documentos nunca abre o diálogo de propriedades que os mostraria — e essa é exatamente a razão pela qual vazam. Um relatório exportado de um portátil pessoal traz o nome da conta do portátil como autor. Um documento começado a partir do modelo do ano passado continua a nomear o autor do ano passado. Nada disto se vê na página impressa, e tudo está a um painel de propriedades de distância para cada destinatário do ficheiro.

O sistema mais novo é o XMP, um pacote XML incorporado no documento, construído sobre a plataforma de metadados extensível da Adobe e descrito juntamente com a própria especificação PDF, ISO 32000-2. O XMP repete grande parte do mesmo terreno em espaços de nomes: dc:title para o título, pdf:Producer, xmp:CreateDate e xmp:ModifyDate, mais campos que o dicionário antigo nunca teve, como a ferramenta criadora. Ter dois sistemas seria inofensivo se fossem mantidos em passo, mas não são: uma ferramenta atualiza o dicionário de informações e ignora o XMP, outra reescreve o XMP e deixa o dicionário desatualizado, uma terceira remove um e fica com o outro. O resultado é que um único ficheiro conta rotineiramente duas histórias ligeiramente diferentes sobre si mesmo — e o desacordo é ele próprio informação, porque regista que mais do que uma ferramenta, em mais do que um momento, pôs as mãos no documento.

Atualizações incrementais: o parágrafo apagado que nunca partiu

O PDF foi desenhado para edição só de acréscimo. Quando um editor guarda uma alteração de forma incremental, não reescreve o ficheiro: acrescenta os objetos alterados, uma nova secção de referências cruzadas e um novo trailer ao fim, encadeando para o trailer anterior através de um ponteiro /Prev. Cada revisão termina com o seu próprio marcador %%EOF, por isso contar esses marcadores dá um limite inferior de quantas vezes o ficheiro foi guardado assim — e cada revisão anterior permanece fisicamente presente e legível nos bytes. Abra um ficheiro assim num visualizador comum e só vê a revisão mais recente. Leia os bytes, ou recue pela cadeia, e o estado anterior do documento continua lá: o número antigo da tabela, a redação anterior da cláusula, o parágrafo apagado antes da publicação.

Este é o mecanismo por trás das falhas de ocultação que continuam a chegar às notícias. Uma equipa precisa de publicar um relatório com nomes ou valores retidos, por isso alguém desenha retângulos pretos sobre as passagens sensíveis — uma operação de desenho que muda o aspeto da página e não toca em nada por baixo — ou apaga o texto num editor que depois guarda de forma incremental, deixando os objetos apagados numa revisão anterior. O ficheiro publicado parece limpo. Dias depois, um leitor seleciona a região «ocultada», copia-a e cola as palavras originais num editor de texto; ou um investigador analisa a cadeia de revisões e recupera o que foi removido. A ocultação real é uma operação diferente de cobrir: o conteúdo subjacente tem de ser removido do fluxo de conteúdo e o ficheiro tem de ser reescrito por completo, para que os próprios bytes já não contenham o que a página já não mostra. Se um ficheiro que vai publicar traz vários marcadores %%EOF, a sua história continua dentro dele — assuma que um leitor motivado lerá essa história.

Ficheiros incorporados e texto oculto: a carga que ninguém lista

Um PDF pode transportar ficheiros completos dentro de si mesmo. O formato define uma árvore de nomes de ficheiros incorporados, a que se chega através dos objetos /EmbeddedFiles e /Filespec, e as ferramentas de autoria usam-na para folhas de cálculo de origem, apêndices de dados e documentos de portefólio. O painel de anexos que os revelaria é um que a maioria dos leitores nunca abre, por isso a carga incorporada viaja em silêncio: publique o polido resumo em PDF e pode publicar também a folha de cálculo de trabalho por trás dele, completa com os seus próprios metadados, as suas folhas de rascunho e os seus comentários. O mesmo vale ao contrário para os destinatários: um anexo dentro de um PDF recebido herda a confiança do documento que o envolve, e é por isso que os ficheiros incorporados merecem uma linha em qualquer lista de inspeção em vez de uma descoberta por acidente.

O texto pode esconder-se sem ser um ficheiro à parte. O PDF pinta o texto com um modo de renderização, e o modo 3 — definido com o operador 3 Tr — não pinta nem preenchimento nem traço: os caracteres estão no fluxo de conteúdo, podem ser selecionados, pesquisados e extraídos, e são completamente invisíveis na página. Parte do texto invisível é legítimo e valioso: a camada de OCR atrás de uma página digitalizada é exatamente isto, texto oculto que torna uma imagem pesquisável. O problema é tudo o resto que acaba no modo 3 ou nos seus primos — texto branco sobre fundo branco, texto recortado para fora da página visível, uma camada de palavras-chave acrescentada para motores de pesquisa — porque um leitor que extrai a camada de texto recebe palavras que a página nunca mostrou. Quando a camada oculta discorda da visível, o ficheiro diz duas coisas ao mesmo tempo, e só uma delas foi revista.

As imagens também guardam diários: blocos PNG e Exif em JPEG

Um ficheiro PNG é uma sequência de blocos com nome, e vários tipos de bloco existem apenas para transportar texto: tEXt, o seu irmão comprimido zTXt e o internacionalizado iTXt. As ferramentas de exportação escrevem-nos por hábito — uma palavra-chave Software que nomeia o editor, uma cadeia de ferramenta de criação, por vezes um perfil XML incorporado inteiro — e sobrevivem a cada corte e redimensionamento que deixa a lista de blocos intacta. O bloco tIME acrescenta um carimbo de última modificação, um bloco eXIf pode trazer um bloco completo de metadados de câmara, e os bytes acrescentados após o bloco de fecho IEND são ignorados por qualquer visualizador enquanto permanecem no ficheiro. Uma captura de ecrã que parece uma imagem neutra de uma janela pode assim nomear o software da máquina, datar-se a si mesma e transportar dados que o seu autor nunca viu.

As fotografias JPEG vão mais longe. O ficheiro é uma cadeia de segmentos de marcador: APP0 traz o cabeçalho JFIF, APP1 traz um bloco Exif ou um pacote XMP — por vezes ambos. Os campos IFD0 do Exif leem-se como o diário de uma câmara: Make e Model do dispositivo, o DateTime em que a fotografia foi tirada ou modificada pela última vez, o Software que a processou e, em diretórios alargados, as coordenadas GPS. Fotografias de telemóvel publicadas diretamente do rolo da câmara envergonharam organizações e particulares ao colocá-los, com precisão, num momento e num lugar que a própria fotografia nunca mostrou. Os segmentos de comentário (COM) acrescentam texto livre da última ferramenta que guardou o ficheiro, bytes excedentes podem ficar após o marcador de fim de imagem, e a ferramenta que lê tudo isto — o ExifTool de Phil Harvey, citado nas fontes — é uma transferência gratuita, o que significa que os seus destinatários também o podem ler.

Cruze os carimbos de tempo e depois limpe antes de publicar

Um único carimbo de tempo é uma afirmação; vários carimbos de tempo são uma história que pode ser cruzada consigo mesma. Uma data de criação que cai depois da data de modificação não pode descrever um documento produzido por uma ferramenta numa só passagem. Uma data do dicionário de informações que discorda da data XMP para o mesmo acontecimento regista duas ferramentas com dois relógios. Uma data no futuro regista um relógio mal acertado, um campo editado à mão ou um ficheiro montado a partir de peças. Até o próprio formato de data do PDF convida à ambiguidade: a cadeia D: pode omitir o seu fuso horário, deixando os leitores a adivinhar de que relógio saíram os números. Trate cada incoerência como um auditor trata uma discrepância contabilística: normalmente tem uma explicação inocente — reutilização de um modelo, o relógio de um portátil, um otimizador que reescreveu o ficheiro no envio — e é uma evidência a ponderar, nunca um veredito por si só. Os campos de metadados podem ser editados por qualquer pessoa com ferramentas gratuitas, por isso corroboram ou contradizem uma história; não a podem provar.

Limpar é, por isso, um fluxo de trabalho, não um botão. Primeiro, inspecione: passe o ficheiro pela ferramenta de forense de documentos e anote o que ele diria a um desconhecido — nomes de autor e de ferramentas, número de revisões, ficheiros incorporados, texto oculto, carimbos de tempo que discutem entre si. Segundo, corrija na origem quando puder: corrija as propriedades do documento na aplicação de autoria em vez de remendar a sua saída. Terceiro, exporte uma reescrita completa e nova — imprimir para PDF, um limpador dedicado ou o ExifTool para as imagens — porque uma reescrita completa descarta as revisões anteriores, os objetos órfãos e os dados excedentes de uma forma que o guardado incremental nunca fará. Por último, volte a verificar a cópia que realmente envia, não a que pretendia enviar. E mantenha a distinção em que todo o artigo assenta: os originais internos devem conservar os seus metadados, porque a proveniência, o valor de arquivo e até a acessibilidade — um título de documento também é um metadado — dependem disso. Limpe a cópia publicada e conserve o registo intacto em casa.

Fontes e leituras adicionais

Perguntas frequentes

Os metadados podem provar quem criou um documento?

Não. Os campos de metadados são texto escrito por um programa; podem ser editados com ferramentas gratuitas, herdados de um modelo ou copiados de outro ficheiro, por isso são testemunho e não prova. O que podem fazer é corroborar uma afirmação — ou contradizê-la, quando os carimbos de tempo discordam entre si ou a ferramenta nomeada não poderia ter produzido o ficheiro. Trate-os como uma peça de evidência entre várias, nunca como um veredito de autoria.

Por que razão o texto que apaguei há meses ainda pode ser recuperado do meu PDF?

Por causa das atualizações incrementais. Se o seu editor guarda acrescentando revisões, o texto apagado permanece numa revisão anterior dentro do mesmo ficheiro, atrás de uma cadeia de trailers ligados por /Prev. Os visualizadores mostram apenas a revisão mais recente, mas todos os bytes continuam lá. A correção é uma reescrita completa — reexportar ou imprimir para PDF — que escreve um ficheiro novo contendo apenas o estado atual, e depois verificar que a contagem de %%EOF do ficheiro novo é um.

Devo remover sempre os metadados antes de publicar?

Remova a cópia publicada, não o registo. As cópias externas não devem trazer nomes de contas de autor, cadeias internas de ferramentas, ficheiros de trabalho incorporados nem históricos de revisões. Mas os metadados também fazem um trabalho legítimo: o título do documento é o que a tecnologia de apoio anuncia e o que o separador do navegador mostra, e os arquivos dependem dos campos de proveniência. Conserve o original interno intacto e produza uma cópia limpa para publicação — e verifique essa cópia, porque as ferramentas de limpeza por vezes removem menos do que afirmam.