3 pontos por GN⁺ 2025-12-24 | 1 comentários | Compartilhar no WhatsApp
  • 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
    1. Procura por retângulos (rectangle) no PDF
    2. Procura por caracteres (letter) na mesma posição
    3. Renderiza o retângulo como imagem
    4. 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

 
GN⁺ 2025-12-24
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

    • No estudo de segurança de PDF da Argelius Labs, dizem que é possível fazer um ataque de espaçamento de glifos usando apenas o comprimento da área coberta por caixas pretas para estimar o tamanho das palavras
      Fiquei curioso se o X-ray também aproveita esse tipo de vazamento de métricas de fonte
    • Se for possível reproduzir o kerning da fonte e o resultado em nível de pixel, parece que daria para adivinhar palavras com bastante precisão
      Por exemplo, oioioi e oooiii têm larguras diferentes dependendo da fonte
  • Olhei só uns 10% dos arquivos divulgados hoje, e por exemplo EFTA00037069.pdf tem um ponteiro /Prev, então uma versão anterior está incluída dentro do PDF
    Isso é uma edição pequena, mas provavelmente há outros arquivos com o mesmo problema
    Dá para verificar diretamente com o comando qpdf --show-object=trailer
    Acho que esse tipo de edição desleixada pode ter sido intencional, e não um simples erro

    • Fui conferir por conta própria, e o histórico de revisão desse arquivo era só a adição de numeração em cada página
      O original já era um documento totalmente flattened
    • Não é surpreendente que as pessoas encarregadas disso não conheçam nem instruções básicas
    • Na prática, costumam chamar qualquer pessoa para fazer o trabalho de redaction, então a falta de experiência provavelmente é o problema
  • 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

    • Seria bom existir uma fonte que ajustasse o kerning aleatoriamente de forma automática
      Assim, até a mesma palavra teria espaçamento diferente em cada documento
    • Recentemente também houve casos de extração de informação de sessões de chat criptografadas de LLM por meio de análise de tamanho e temporização de pacotes
      É um tipo de ataque de canal lateral, parecido com este problema
    • Isso depende do comprimento do trecho ocultado e do quão previsível ele é
      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

    • Do ponto de vista legal, só se pode ocultar identidade de vítimas, investigações em andamento, material de abuso sexual infantil e informações ligadas à segurança nacional
      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
    • O WikiLeaks adotava a posição de ocultar apenas informações que pudessem levar a dano físico a uma pessoa
      Por exemplo, quando divulgar coordenadas GPS poderia criar risco de bombardeio
    • As vítimas dizem que não querem redaction se for para proteger os agressores
      Dizem que responsabilização é mais importante
    • O objetivo é proteger a identidade de vítimas, testemunhas e informantes
    • Arquivos de investigações longas costumam conter muitas denúncias falsas ou informações incorretas, então é necessário proteger a privacidade de pessoas inocentes
      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 🤷

    • Eu administro um negócio relacionado a anti-screenshot, e esse tipo de falha em redaction é extremamente comum
      Cobrir com uma caixa preta não faz os dados desaparecerem
      Vejo muito esse tipo de equívoco em ambientes de compliance
    • Mas em alguns casos existe a exigência de que o documento continue pesquisável, então nem sempre é possível convertê-lo em imagem
  • 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

    • Talvez tenham pensado no PDF como se fosse papel e acharam que bastava cobrir com uma caixa preta
      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
    • Advogados e investigadores do governo federal dos EUA recebem treinamento rigoroso em redaction
      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

    • Esse tipo de redaction malfeita é um dos casos típicos que o X-ray consegue detectar
  • É 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