
스크린샷에서 자격 증명을 찾아 비밀 관리자에 저장하고, 이미지에서 복구 불가능하게 삭제합니다 — 로컬, 오프라인, OCR 기반.
스크린샷에서 자격 증명을 찾아 비밀 관리자로 추출하고 이미지에서 복구 불가능하게 삭제하여 비밀번호가 노트, 스크린샷, ~/Desktop에 방치되지 않도록 합니다.
로컬. 오프라인. 조용히. 기본적으로 네트워크 없음, 텔레메트리 없음.
screenscrub는 두 가지 기존 도구 카테고리를 연결합니다: GUI 리뷰어(Xnapper, Shhshot, macshot)는 수동으로 PII를 흐리게 하지만 비밀과 주소를 구분하지 못하거나 숨기는 내용을 캡처하지 못합니다; 비밀 스캐너(gitleaks, TruffleHog)는 실제 자격 증명을 찾지만 텍스트에서만 찾고 PNG에서는 찾지 못합니다. screenscrub는 gitleaks 수준의 탐지(레드팀 팩 및 엔트로피 분석 포함)를 픽셀에 헤드리스로 적용합니다: 각 비밀을 관리자로 캡처하고, 이미지를 복구 불가능하게 삭제한 후, 결과를 다시 OCR하여 비밀이 제거되었음을 증명합니다.
안전망이지 보장이 아닙니다 — screenscrub는 이미지가 "완전히 깨끗하다"고 주장하지 않습니다; OCR과 탐지 모두 누락되는 경우가 있으므로 항상 결과를 직접 확인하세요. 이에 의존하기 전에 읽어보세요.
screenscrub scan ~/Screenshots # dry run: 감지 + 보고, 쓰지 않음
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> — dry run (시험 실행)감지하고 보고합니다; 아무것도 쓰지 않습니다.
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는 무언가 탐지되면 0이 아닌 종료 코드를 반환합니다 — 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/으로 이동합니다.비밀은 --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 수신자가 있는 파일 |
--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> | 무시할 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하고, 다시 탐지를 실행하며, 어떤 비밀 영역이 여전히 발견되면 0이 아닌 종료 코드로 종료합니다 — 클라이언트에게 스크린샷을 전달하기 전에 인도물/CI 게이트로 사용하세요. (OCR이 비밀을 읽을 수 없음을 증명하는 것이지, 사람이 절대 읽을 수 없다는 것은 아닙니다.)
screenscrub verify ~/deliverable/screenshots
echo $? # 0 = 깨끗함, 0이 아님 = 여전히 감지 가능한 비밀 있음
clean은 모든 삭제된 복사본에 대해 이 동일한 검사를 자동으로 수행하며, 삭제된 복사본이 실패하면 원본을 격리하거나 파쇄하지 않습니다; --no-verify는 이를 건너뜁니다(권장되지 않음).
open <store> — 비밀 또는 격리된 원본 복구데이터를 되찾으세요: open은 age 싱크(저장된 비밀 기록) 또는 격리된 원본을 --out으로 복호화하며, 표준 출력으로는 내보내지 않습니다. 저장소 복호화를 참조하세요.
--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/네트워크 오류는 모든 검출 결과를 유지(모든 것을 삭제)하여 실제 비밀을 드롭할 위험을 감수하지 않습니다. 플래그가 지정된 이미지당 하나의 API 호출을 수행하며(동시 4개로 제한, --jobs와 무관) — 대규모 디렉터리에서는 속도 제한과 비용에 주의하세요.
--watchscreenscrub clean ~/Screenshots --watch --sink file://./secrets.age --yes