X-ray, une bibliothèque Python pour détecter les masquages incorrects dans les documents PDF
(github.com/freelawproject)- Bibliothèque Python qui détecte automatiquement les masquages inadéquats dans les documents PDF, en identifiant les cas où le texte est simplement recouvert par un rectangle noir
- Développée par Free Law Project pour résoudre un problème récurrent découvert lors de la collecte de millions de PDF
- Peut être exécutée en ligne de commande ou depuis du code Python, avec des résultats renvoyés sous forme de JSON ou d’objets Python
- Utilise en interne PyMuPDF pour analyser les rectangles, le texte et les couleurs d’un PDF afin de déterminer si le masquage cache réellement le texte
- Outil de vérification automatique à forte valeur pour empêcher l’exposition de données personnelles dans des documents juridiques ou des publications publiques
Aperçu
x-rayest une bibliothèque Python qui détecte les redactions incorrectes dans les fichiers PDF- Lorsque l’utilisateur fournit le chemin d’un PDF, elle repère les zones où le masquage n’a pas été correctement appliqué
- Les résultats sont renvoyés en JSON, page par page, avec les coordonnées (
bbox) et le texte (text) de chaque zone
Contexte de développement
- Free Law Project a découvert de nombreux documents dont le masquage était mal effectué lors de la collecte de millions de PDF
- Certains utilisateurs, au lieu de supprimer le texte, utilisaient simplement des rectangles noirs ou des surlignages pour le recouvrir
- Dans ce cas, il suffit de sélectionner le texte sous le rectangle pour voir apparaître le contenu original
- L’outil
x-raya été créé pour mesurer la fréquence de ce problème
Utilisation
- Installation
- Installation possible avec
pip install x-rayouuv add x-ray
- Installation possible avec
- Exécution en ligne de commande
- Exécuter
xray path/to/file.pdfpour obtenir un résultat en JSON - Si une URL est fournie, le PDF distant est téléchargé puis analysé
- Pour analyser plusieurs URL en une seule fois, utiliser
xargs -n 1 xray < urls.txt
- Exécuter
- Utilisation dans du code Python
- L’appel à
xray.inspect("file.pdf")renvoie le résultat sous forme d’objet Python - Si l’entrée est une chaîne, elle est traitée comme un fichier local ; si elle commence par
https://, comme une URL ; si c’est unbytes, comme un PDF en mémoire - Le passage d’un chemin de fichier en type
bytesne fonctionne pas
- L’appel à
Principe de fonctionnement
- Le PDF est analysé en interne avec PyMuPDF
- Recherche des rectangles dans le PDF
- Recherche des lettres à la même position
- Rendu du rectangle sous forme d’image
- Si le rectangle est rempli d’une seule couleur, il est considéré comme un masquage incorrect
- La structure des PDF étant complexe, une détection parfaite est difficile, mais le projet continue de s’améliorer
- Le projet est maintenu grâce aux dons et au soutien
Contribution et publication
- La liste des issues sur GitHub permet de consulter les cas non pris en charge ou les demandes d’amélioration
- Avant une première contribution, il faut signer un Contributor License Agreement (CLA)
- La publication est automatisée via GitHub Actions ; pour une publication manuelle, utiliser la commande
poetry publish --build
Licence
- Publié sous licence BSD, le projet peut être librement intégré à d’autres projets
- Les Pull Requests et propositions de fonctionnalités sont les bienvenues, et des modifications peuvent être faites directement via l’interface web de GitHub
1 commentaires
Commentaires sur Hacker News
En travaillant au Free Law Project, j’ai participé à de nombreux projets complexes sur plusieurs années, mais ce projet X-ray est de loin celui qui a suscité le plus d’attention
Nous avons créé X-ray pour analyser des millions de documents de CourtListener, avec l’objectif d’alerter le public sur ce problème
Nous avons analysé des millions de documents en quelques minutes avec un job batch S3, mais la vraie partie difficile — trier les résultats et faire le reporting — reste encore à faire
Je me demande si X-ray exploite aussi ce type de fuite liée aux métriques de police
Par exemple,
oioioietoooiiin’ont pas la même largeur selon la policeJe n’ai regardé qu’environ 10 % des fichiers publiés aujourd’hui, mais par exemple
EFTA00037069.pdfcontient un pointeur/Prev, ce qui signifie qu’une version précédente est incluse dans le PDFC’est une modification mineure, mais il est probable que d’autres fichiers soient dans le même cas
On peut le vérifier directement avec la commande
qpdf --show-object=trailerJe pense que ce type d’édition bâclée pourrait être intentionnel plutôt qu’accidentel
L’original était déjà un document aplati
Plus j’y pense, plus les informations de kerning me semblent être une faiblesse majeure du caviardage
La seule position du texte autour d’un rectangle noir peut permettre d’estimer la longueur et la forme du mot masqué
Si l’on connaît l’algorithme de rendu, on pourrait peut-être même retrouver le texte réel par brute force
Je me demande si quelqu’un a déjà étudié ce problème
De cette façon, l’espacement varierait d’un document à l’autre même pour le même mot
C’est une forme d’attaque par canal auxiliaire, assez similaire à ce problème
Si c’est court et que le contexte limite les possibilités à « yes » ou « no », c’est facile à deviner, mais des noms ou de longues phrases sont bien plus difficiles
C’est dommage que les PDF restent encore aussi largement utilisés alors qu’ils ont toujours trop de défauts fondamentaux en tant que documents numériques
Question toute simple : dans ce type de publication de documents, quel est exactement l’objectif du caviardage ?
Je ne comprenais pas non plus pourquoi il fallait préserver l’anonymat
(Après réflexion) en pensant au fait que des personnes innocentes peuvent aussi être concernées, ça devient compréhensible
Il est interdit de masquer des éléments pour des raisons de réputation ou des motifs politiques
Mais beaucoup craignent que le caviardage réel ne respecte pas ces critères
Par exemple, si la publication de coordonnées GPS pouvait entraîner un risque de bombardement
Selon elles, la mise en cause des responsabilités est plus importante
Mais dans cette affaire, l’importance du dossier rendait la publication inévitable
Lorsqu’on publie un PDF caviardé, la procédure de base devrait probablement être de dessiner des rectangles noirs puis de rastériser le document en image 🤷
Recouvrir simplement avec un rectangle noir ne supprime pas les données
On voit souvent ce malentendu dans les environnements de conformité
Si l’on utilise correctement Adobe Pro, il est possible de supprimer définitivement (redact) le contenu d’un PDF
Dans cette affaire, il s’agit simplement d’une erreur d’amateur due à une mauvaise utilisation d’un éditeur PDF
C’est le résultat du non-respect d’une procédure utilisée depuis des décennies par des milliers d’avocats et de juristes
Autrefois, on traçait des barres noires sur papier puis on utilisait l’impression comme version finale ; ils ont probablement travaillé avec cet état d’esprit
Comme la sélection du texte était bloquée, ils ont pu croire que le contenu était bien masqué
Ou alors c’était peut-être une manière délibérée de faire semblant à une erreur involontaire
C’est pourquoi beaucoup considèrent qu’il ne s’agit pas d’une simple erreur, mais d’une forme de malicious compliance intentionnelle
Fait surprenant, on peut aussi voir les informations caviardées dans le lecteur PDF du navigateur
Dans Brave (Linux), si l’on ouvre ce document puis qu’on copie la première ligne du paragraphe 90, le texte masqué est collé tel quel
C’est intéressant de voir le concept d’ediscovery (production électronique de preuves) se diffuser jusque dans le grand public
Les gens de la tech seraient surpris s’ils réalisaient à quel point beaucoup de personnes hors du secteur sont illettrées numériquement
Ça rappelle l’époque où l’IT de l’entreprise était considérée comme un dieu tout-puissant