- Biblioteca Python que detecta automaticamente redações inadequadas em documentos PDF, identificando casos em que o texto foi apenas coberto por retângulos pretos
- Desenvolvida pelo Free Law Project para resolver um problema recorrente encontrado durante a coleta de milhões de PDFs
- Pode ser executada pela linha de comando ou em código Python, retornando resultados em formato de JSON ou objetos Python
- Internamente usa PyMuPDF para analisar retângulos, texto e informações de cor do PDF e determinar se a redação realmente oculta o texto
- Tem alto valor como ferramenta de verificação automática para evitar a exposição de dados pessoais em documentos jurídicos ou materiais públicos
Visão geral
x-ray é uma biblioteca Python para detectar redações incorretas em arquivos PDF
- Quando o usuário fornece o caminho de um PDF, ela encontra áreas em que a redação não foi feita corretamente
- O resultado é exibido em formato JSON por página, incluindo coordenadas (
bbox) e o texto (text) da área correspondente
Contexto de desenvolvimento
- O Free Law Project encontrou muitos documentos com redação mal feita durante a coleta de milhões de PDFs
- Alguns usuários cobriam o texto com retângulos pretos ou realces, sem realmente removê-lo
- Nesse caso, ao selecionar o texto sob o retângulo, o conteúdo original continua exposto
- Para medir a frequência desse problema, a ferramenta
x-ray foi criada
Como usar
- Instalação
- Pode ser instalada com
pip install x-ray ou uv add x-ray
- Execução pela linha de comando
- Ao executar no formato
xray path/to/file.pdf, o resultado em JSON é exibido
- Ao informar uma URL, o PDF remoto é baixado e analisado
- Para verificar várias URLs de uma vez, use
xargs -n 1 xray < urls.txt
- Uso em código Python
- Ao chamar
xray.inspect("file.pdf"), o resultado é retornado como objeto Python
- Se a entrada for uma string, ela é tratada como arquivo local; se começar com
https://, como URL; se for bytes, como PDF em memória
- Passar um caminho de arquivo no tipo
bytes não funciona
Como funciona
- Internamente, o PDF é analisado com PyMuPDF
- Procura por retângulos (rectangle) no PDF
- Procura por caracteres (letter) na mesma posição
- Renderiza o retângulo como imagem
- Se o retângulo estiver preenchido com uma única cor, ele é considerado uma redação incorreta
- Como a estrutura de PDFs é complexa, a detecção perfeita é difícil, mas melhorias contínuas estão em andamento
- O projeto é mantido por meio de doações e apoio financeiro
Contribuição e distribuição
- Casos ainda não suportados ou pedidos de melhoria podem ser verificados na lista de issues do GitHub
- Antes da primeira contribuição, é necessário assinar o Contributor License Agreement (CLA)
- A distribuição é automatizada via GitHub Actions e, para publicação manual, usa-se o comando
poetry publish --build
Licença
- Disponibilizada sob a licença BSD, podendo ser integrada livremente a outros projetos
- Pull Requests e sugestões de funcionalidades são bem-vindos, e edições podem ser feitas diretamente pela interface web do GitHub
1 comentários
Comentários do Hacker News
Trabalhando no Free Law Project, participei de muitos projetos complexos ao longo de vários anos, mas este projeto X-ray foi o caso que mais chamou atenção
Criamos o X-ray para analisar milhões de documentos do CourtListener, com o objetivo de alertar as pessoas sobre esse problema
Conseguimos analisar milhões de documentos em poucos minutos com um job em lote no S3, mas a parte realmente difícil de organizar os resultados e reportá-los ainda continua pendente
Fiquei curioso se o X-ray também aproveita esse tipo de vazamento de métricas de fonte
Por exemplo,
oioioieoooiiitêm larguras diferentes dependendo da fonteOlhei só uns 10% dos arquivos divulgados hoje, e por exemplo
EFTA00037069.pdftem um ponteiro/Prev, então uma versão anterior está incluída dentro do PDFIsso é uma edição pequena, mas provavelmente há outros arquivos com o mesmo problema
Dá para verificar diretamente com o comando
qpdf --show-object=trailerAcho que esse tipo de edição desleixada pode ter sido intencional, e não um simples erro
O original já era um documento totalmente flattened
Quanto mais penso nisso, mais parece que a informação de kerning da fonte pode ser uma grande vulnerabilidade em redaction
Só pela posição do texto ao redor das caixas pretas já dá para estimar o comprimento e o formato das palavras ocultas
Se você souber o algoritmo de renderização, talvez até dê para inferir o texto real por brute force
Fico curioso se alguém já pesquisou esse problema
Assim, até a mesma palavra teria espaçamento diferente em cada documento
É um tipo de ataque de canal lateral, parecido com este problema
Se for algo curto e limitado pelo contexto a algo como “sim” ou “não”, dá para adivinhar fácil, mas nomes ou frases longas são bem mais difíceis
É frustrante que o PDF continue sendo tão amplamente usado, apesar de ainda ter defeitos fundamentais como formato de documento digital
É uma pergunta simples, mas fiquei curioso sobre qual é exatamente o objetivo da redaction nesse tipo de divulgação de documentos
Também não entendi por que seria necessário manter anonimato
(Editado) Pensando melhor, faz sentido porque pessoas inocentes também podem estar envolvidas
Ocultar por dano reputacional ou motivos políticos é proibido
Mas existe grande preocupação de que, na prática, a redaction não siga esse critério
Por exemplo, quando divulgar coordenadas GPS poderia criar risco de bombardeio
Dizem que responsabilização é mais importante
Mas este caso é importante demais, então a divulgação acabou sendo inevitável
Ao publicar um PDF redigido, parece que o procedimento básico deveria ser desenhar retângulos pretos e rasterizar como imagem 🤷
Cobrir com uma caixa preta não faz os dados desaparecerem
Vejo muito esse tipo de equívoco em ambientes de compliance
Se o Adobe Pro for usado corretamente, dá para remover permanentemente (redact) o conteúdo de um PDF
Neste caso, foi só um erro amador de quem não sabia usar direito um editor de PDF
Foi o resultado de ignorar procedimentos usados por milhares de advogados e profissionais jurídicos há décadas
Antigamente, faziam uma linha preta no papel e usavam a cópia impressa como versão final, então talvez tenham trabalhado com essa mentalidade antiga
Como a seleção de texto fica bloqueada, podem ter acreditado que estava ocultado
Ou talvez tenham feito assim de propósito para depois fingir que foi um erro
Por isso, muita gente vê este caso não como um erro simples, mas como conformidade maliciosa (malicious compliance)
Surpreendentemente, até no visualizador de PDF do navegador dá para ver a informação redigida
No Brave (Linux), se você abrir este documento e copiar a primeira linha do parágrafo 90, o texto oculto é colado normalmente
É interessante ver o conceito de ediscovery (produção eletrônica de provas) chegando até o público em geral
Quem trabalha com tecnologia ficaria surpreso ao perceber o quanto as pessoas de áreas não técnicas são analfabetas digitais
Isso me faz lembrar da época em que o pessoal de TI era tratado como o deus todo-poderoso da empresa