
スクリーンショットから認証情報を見つけ、シークレットマネージャーに保存し、画像から不可逆的に墨消しします — ローカル、オフライン、OCRベース。
スクリーンショットから認証情報を見つけ出し、シークレットマネージャーに抽出し、画像から不可逆的に編集(redact)します。これにより、シークレットがノートやスクリーンショット、~/Desktop に放置されるのを防ぎます。
ローカル。オフライン。サイレント。デフォルトではネットワークもテレメトリもありません。
screenscrub は既存の2つのツールカテゴリをつなぎます。GUI 編集ツール(Xnapper、Shhshot、macshot)は手動でPIIをぼかしますが、シークレットと住所の区別がつかず、何を隠したかも記録しません。シークレットスキャナー(gitleaks、TruffleHog)は実際の認証情報を見つけますが、テキストのみであり、PNG内では検出できません。screenscrub は、gitleaks レベルの検出にレッドチームパックとエントロピー分析を加え、ヘッドレスでピクセルに適用します。各シークレットをマネージャーに取り込み、画像を不可逆的に編集し、結果を再OCRしてシークレットが削除されたことを証明します。
セーフティネットであり、保証ではありません。screenscrub は画像が「確実にクリーン」であるとは決して主張しません。OCRと検出はどちらも見落としがあるため、常に結果を目視確認してください。これに依存する前に読んでください。
screenscrub scan ~/Screenshots # ドライラン:検出+報告、書き込みなし
screenscrub clean ~/Screenshots --out ~/clean \ # 抽出、編集、検証、隔離
--sink file://./secrets.age --yes
screenscrub verify ~/clean # フォルダがクリーンであることを証明(違えば終了コード≠0)
screenscrub clean --keep-originals ./tmp
Cleaning 7 image(s) in ./tmp (7 worker(s))…
[1/7] tmp/ssh.jpg — 6 region(s) → tmp/ssh.redacted.jpg ✓ verified
[2/7] tmp/key.jpg — 13 region(s) → tmp/key.redacted.jpg ✓ verified
[3/7] tmp/test2.jpg — 12 region(s) → tmp/test2.redacted.jpg ✓ verified
[4/7] tmp/test5.jpg — 13 region(s) → tmp/test5.redacted.jpg ✓ verified
[5/7] tmp/test3.jpg — error: verification failed: 4 secret region(s) still detectable in tmp/test3.redacted.jpg; original preserved
[6/7] tmp/test4.jpg — error: verification failed: 9 secret region(s) still detectable in tmp/test4.redacted.jpg; original preserved
[7/7] tmp/test6.jpg — error: verification failed: 7 secret region(s) still detectable in tmp/test6.redacted.jpg; original preserved
7/7 file(s) flagged, 382 region(s) total, 3 file(s) errored/unverified.
By kind:
high-entropy 343
keyword-secret 15
db-connection-uri 10
github-pat 6
unix-crypt-hash 6
aws-access-key 1
stripe-key 1
Needs manual attention (3):
tmp/test3.jpg — error: verification failed: 4 secret region(s) still detectable in tmp/test3.redacted.jpg; original preserved
tmp/test4.jpg — error: verification failed: 9 secret region(s) still detectable in tmp/test4.redacted.jpg; original preserved
tmp/test6.jpg — error: verification failed: 7 secret region(s) still detectable in tmp/test6.redacted.jpg; original preserved
| Before — シークレットの値が見える状態 | After clean — 不可逆的に編集 |
![]() |
![]() |
同じスクリーンショットのclean前後:すべてのシークレット値がピクセルにデコードされ、矩形で囲まれ、新しい画像に再エンコードされます(不可逆)。ラベルと構造は読み取り可能なままです。
tesseract OCR バイナリが PATH 上にある必要があります。
brew install tesseractwinget install UB-Mannheim.TesseractOCR(または UB Mannheim インストーラ)apt-get install tesseract-ocrその後ビルド:
go build -o screenscrub ./cmd/screenscrub
クロスコンパイル可能: macOS (arm64/amd64) および Windows (amd64) — cgo ではなく tesseract を外部呼び出しします。macOS でのみテスト済み。
scan <dir|file> — ドライラン検出して報告します。何も書き込みません。
screenscrub scan ~/Screenshots --ignore 'node_modules/**' --ignore '*.thumb.png'
screenscrub scan shot.png --json # 機械可読レポート
screenscrub scan ~/Screenshots --preview ~/review # clean が何を編集するか目視確認
--preview <dir> は、フラグが付いた各画像の非破壊コピーを、検出された領域をアウトライン(塗りつぶしなし)で書き込みます。これにより、clean が何を編集するかをコミット前に確認できます。⚠ これらのコピーにはシークレットがまだ含まれているため、ディレクトリは 0700 で作成され、共有してはいけません。
レポートは集計で終わります。種別ごとの内訳と、明示的な「手動確認が必要」リスト — エラー、検証失敗、またはスクリーンショットであるべき画像から OCR テキストが一切得られなかった ファイルが含まれます(サイレントな OCR の見落としはクリーンな画像と区別がつかないため、信頼するのではなく表面化されます)。
scan --fail-on-findings は何か検出された場合にゼロ以外で終了します — pre-commit/CI ゲートとして。
clean <dir|file> — 抽出、編集、隔離SCREENSCRUB_PASSPHRASE=… screenscrub clean ~/Screenshots \
--out ~/Screenshots/clean \
--sink file://./secrets.age \
--yes
検出結果がある各画像に対して、clean は:
<name>.redacted.png を --out に(または元の場所の隣に)書き込み、<out>/quarantine/ に age 暗号化して移動します。シークレットは --sink に指定したシンクに送られます: age ファイル(デフォルト)、1Password(op://)、KeePassXC(keepassxc://)、macOS キーチェーン(keychain://)、HashiCorp Vault(vault://)— またはハードウェアベースの age 受信者(YubiKey、Touch ID)。シークレットシンク を参照。
フラグ:
| フラグ | 意味 |
|---|---|
--out <dir> | 編集済みコピーの出力先(デフォルト: 元の場所の隣) |
--sink <uri> | file://./secrets.age · op://Vault · keepassxc://./v.kdbx · keychain://service · vault://KV |
--recipient <age1…> | age 受信者に暗号化(繰り返し可能): X25519、YubiKey、または Touch ID |
--recipients-file <f> | age 受信者を1行に1つ記載したファイル |
--passphrase | ファイルシンク / 隔離のパスフレーズ(環境変数または --config を推奨) |
--watch | 常時実行;新しいスクリーンショットが現れるたびに処理(fsnotify) |
--purge | 元のファイルを隔離ではなくシュレッド(以下の注意事項参照) |
--keep-originals | 編集済みコピーのみ書き込み;元のファイルはそのまま(隔離なし、パスフレーズ不要、--yes 不要)— --purge と排他 |
--yes | 元のファイルの破壊的処理を確認(必須) |
--config <file> | JSON 設定ファイル;パスフレーズを argv に含めずに済む |
--no-verify | 編集済み出力の再OCR検証をスキップ(非推奨) |
-i, --interactive | フラグが付いた各画像を開き、編集/スキップを確認してから実行 |
--llm | Claude を使用して良性の過剰検出を除去;候補文字列を Anthropic API に送信 |
--llm-api-key | --llm 用の Anthropic API キー(または ANTHROPIC_API_KEY) |
--jobs N | N個の画像を並列処理(デフォルト: CPU コア数) |
--manifest <file> | 元ファイル→編集済みファイル→領域の JSON マップを書き込む |
--ocr-raw / --ocr-upscale N | 暗い端末の前処理を無効化 / OCR 前にアップスケール |
--exclude-kind <kind> | 特定の種類の検出結果を抑制(繰り返し可能)。例: high-entropy — オフライン精度調整 |
--min-confidence <0..1> | この信頼度未満の検出結果を削除 — オフライン精度調整 |
--json | レポートを JSON で出力 |
--ignore <glob> | 無視するグロブ、繰り返し可能;** は任意の深さにマッチ |
--lang | tesseract 言語(デフォルト eng) |
--exclude-kind と --min-confidence は、ノイズの多いコーパス用のローカル(ネットワーク不要)精度調整つまみです。--llm のオフライン版で、リコールを犠牲にしてレポートを静かにします。意図的に使用してください。どちらも scan/verify で動作し、--config(exclude_kinds、min_confidence)でも設定可能です。
パスフレーズの解決順序: --passphrase、設定ファイル、SCREENSCRUB_PASSPHRASE。コマンドラインでの --passphrase は避けてください — argv は他のプロセスから見えます。
verify <dir|file> — フォルダがクリーンであることを証明各画像を再OCRし、検出を再実行し、シークレット領域がまだ見つかる場合はゼロ以外で終了 — スクリーンショットをクライアントに送る前の納品/CIゲートとして使用します。(OCR がシークレットを読めないことを証明するものであり、人間が決して読めないことを保証するものではありません。)
screenscrub verify ~/deliverable/screenshots
echo $? # 0 = クリーン、非ゼロ = シークレットがまだ検出可能
clean はこの同じチェックをすべての編集済みコピーに対して自動的に実行し、編集済みコピーが検証に失敗した場合は元のファイルを隔離またはシュレッドしません。--no-verify でスキップ可能(非推奨)。
open <store> — シークレットまたは隔離された元ファイルを復元データを取り戻す: open は age シンク(保存されたシークレットレコード)または隔離された元ファイルを復号化し、--out に書き出します。stdout には決して出力しません。ストアの復号化 を参照。
--llm — LLM を使用して良性の過剰検出を削除OCR テキスト(OCR ノイズあり)に対する gitleaks レベルのルールは必然的に過剰検出します。リコール重視の検出器は、オペレーターが保持したい良性の高エントロピー文字列(ホスト名、GUID、git SHA、NTLM ハッシュなど、それ自体が侵害の証拠であるもの)を表面化します。--llm は各候補を Claude(Opus 4.8)に渡し、本当のシークレットを保持し、良性の識別子を削除します。LLM が確認した領域は赤く塗りつぶされます。
ANTHROPIC_API_KEY=… screenscrub clean ~/Screenshots --out ~/clean --llm --yes
これは意図的にローカル・サイレントを破ります。候補文字列(検出されたシークレット)を Anthropic API に送信するため、オプトインのみ、警告を表示し、API キーが必要です。フェイルクローズ: API/ネットワークエラーが発生した場合は、すべての検出結果を保持(すべてを編集)し、本当のシークレットを削除するリスクを避けます。フラグが付いた画像ごとに1回の API 呼び出しを行います(--jobs に関係なく最大4並行)— 大規模なディレクトリではレート制限とコストに注意。
--watchscreenscrub clean ~/Screenshots --watch --sink file://./secrets.age --yes
既存のすべてを処理し、その後新しい/変更された画像を監視し、現れるたびに編集します。*.redacted.png 出力はループを避けるために無視されます。
OCR トークンに対して、screenscrub は以下を組み合わせます: