- PDFドキュメントの不適切なマスキング処理を自動で見つけ出すPythonライブラリで、テキストが単に黒い四角形で覆われているだけのケースを識別
- Free Law Projectが数百万件のPDFを収集する過程で発見した反復的な問題を解決するために開発
- コマンドラインまたはPythonコードから実行でき、結果をJSONまたはPythonオブジェクトの形で返す
- 内部的にPyMuPDFを使ってPDFの四角形、テキスト、色情報を分析し、マスキングが実際にテキストを隠しているかを判定
- 法的文書や公開資料における個人情報漏えい防止のための自動検証ツールとして活用価値が高い
概要
x-rayは、PDFファイル内の**不適切なマスキング(redaction)**を検出するPythonライブラリ
- ユーザーがPDFパスを入力すると、マスキングが適切に行われていない領域を見つけ出す
- 結果はページごとに座標(
bbox)と該当領域のテキスト(text)を含むJSON形式で出力
開発背景
- Free Law Projectは数百万件のPDFを収集する過程で、マスキングが適切に行われていない文書を多数発見
- 一部のユーザーは、テキストを削除せずに黒い四角形やハイライトで覆う方式を使用
- この場合、四角形の下のテキストを選択すると元の文面がそのまま露出する
- この問題の頻度を把握するために
x-rayツールを制作
使い方
- インストール
pip install x-rayまたはuv add x-rayコマンドでインストール可能
- コマンドライン実行
xray path/to/file.pdfの形で実行するとJSON結果を出力
- URL入力時はリモートPDFをダウンロードした後に検査を実行
- 複数のURLを一度に検査するには
xargs -n 1 xray < urls.txtを使用
- Pythonコード内で使用
xray.inspect("file.pdf")を呼び出すとPythonオブジェクトとして結果を返す
- 入力値が文字列ならローカルファイル、
https://で始まる場合はURL、bytesならメモリ内PDFとして処理
bytes型でファイルパスを渡しても動作しない
動作原理
- 内部的にPyMuPDFを用いてPDFを分析
- PDF内の**四角形(rectangle)**を探索
- 同じ位置の**文字(letter)**を探索
- 四角形を画像としてレンダリング
- 四角形が単一色で塗りつぶされていれば不適切なマスキングと判定
- PDF構造が複雑なため完全な検出は難しいが、継続的に改善中
- プロジェクトは寄付と支援によって維持
貢献と配布
- GitHubのissues一覧を通じて未対応ケースや改善要望を確認可能
- 初回の貢献前には**貢献者ライセンス契約(CLA)**への署名が必要
- 配布はGitHub Actionsによって自動化されており、手動配布時は
poetry publish --buildコマンドを使用
ライセンス
- BSDライセンスで公開されており、他のプロジェクトに自由に統合可能
- Pull Requestおよび機能提案を歓迎し、GitHubのWebインターフェースから直接修正可能
1件のコメント
Hacker Newsのコメント
Free Law Projectで働きながら何年もかかる複雑なプロジェクトを数多く手がけてきたが、今回の X-rayプロジェクト が最も話題になった事例だった
CourtListenerの数百万件の文書を分析するためにX-rayを作り、人々にこの問題を知らせるのが目的だった
S3のバッチジョブで数百万件の文書を数分で分析できたが、結果を整理して報告するという 本当に難しい部分 はまだ残っている
X-rayがこうしたフォントメトリクスの漏えいも利用しているのか気になる
たとえばoioioiとoooiiiは、フォントによって幅が異なる
今日公開されたファイルのうち10%ほどしか見ていないが、たとえば
EFTA00037069.pdfには/Prevポインタがあり、以前のバージョンがPDF内部に含まれているこれは些細な修正だが、ほかのファイルにもある可能性が高い
qpdf --show-object=trailerコマンドで直接確認できるこういう ずさんな編集 はミスというより意図的だった可能性もあると思う
元の文書はすでに完全に flattenedされた文書 だった
考えれば考えるほど、フォントの kerning情報 はredactionの大きな弱点になり得る
黒いボックスの周囲にあるテキストの位置だけでも、隠された単語の長さや形を推定できる
レンダリングアルゴリズムがわかっていれば、brute-forceで実際のテキストを推測することもできそうだ
この問題を研究した人がいるのか気になる
同じ単語でも文書ごとに間隔が変わる方式だ
一種の サイドチャネル攻撃 で、この問題に似ている
短くて文脈上 “yes” や “no” 程度に限られるなら簡単に推測できるが、名前や長い文ははるかに難しい
PDFはいまだに デジタル文書として基本的な欠陥 が多すぎるのに、それでも広く使われ続けているのが残念だ
単純な質問だが、こうした文書公開で redactionの目的 が正確には何なのか気になる
なぜ匿名性を維持しなければならないのかも理解できなかった
(編集後)無実の人々も含まれ得ると考えると納得できる
評判毀損や政治的理由で隠すことは禁止 されている
だが実際のredactionがこの基準を守っていないのではないかという懸念が大きい
たとえばGPS座標の公開で爆撃の危険が生じるような場合だ
責任追及 のほうが重要だという
だが今回の事件はあまりにも重要で、公開は避けられない
redacted PDFを公開する際は、黒い長方形を描いて 画像としてラスタライズ するのが基本手順のように思える 🤷
単に黒いボックスをかぶせただけではデータは消えない
コンプライアンスの現場では、こうした 誤解 を頻繁に目にする
Adobe Proを正しく使えば、PDFの内容を 恒久的に削除(redact) できる
今回の件は、単にPDFエディタをきちんと扱えなかった アマチュアのミス だ
何千人もの弁護士や法務担当者が何十年も使ってきた手順を無視した結果だ
昔は紙に黒い線を引き、印刷物を最終版として使う方式だったので、その時代の感覚で作業したのかもしれない
テキスト選択ができなくなるので、隠せたと勘違いした可能性がある
あるいは、わざとこう処理しておいて ミスのふり をしようとした意図だった可能性もある
そのため今回は単純ミスではなく、悪意ある形式的順守(malicious compliance) だと見る向きが多い
驚くことに、ブラウザのPDFビューアでもredacted情報が見えてしまう
Brave(Linux)で この文書 を開き、90番段落の最初の行をコピーすると、隠されたテキストがそのまま貼り付けられる
ediscovery(電子証拠開示) という概念が一般大衆にまで広がっているのを見ると興味深い
技術業界の人たちは、非技術分野の人々がどれほど 技術に疎い かを知ると驚くだろう
昔のようにIT担当者が会社の 全知全能の神 扱いされていた時代を思い出す