
keyhog v0.5.47
Rust 기반 오픈소스 시크릿 스캐너
웹사이트 · 문서 · 아키텍처 · Vyre GPU 엔진
KeyHog: 코드, 클라우드, CI를 위한 GPU 가속 비밀 스캐너
KeyHog은 Rust로 작성된 오픈소스 비밀 스캐너로, 소스 코드, Git 히스토리, 컨테이너, 클라우드 스토리지, 브라우저 자산, 협업 콘텐츠, 실행 중인 시스템 전반에서 유출된 API 키, 토큰, 비밀번호, 자격 증명을 탐지하고 검증합니다.
대부분의 비밀 스캐너는 저장소 체크아웃에서 CPU 정규식 매칭에 그칩니다. KeyHog은 934개의 서비스별 탐지기, 은닉 자격 증명을 위한 디코드 통과, 컨텍스트 인지 증거 및 억제, 실시간 공급자 검증, 그리고 Vyre를 통한 일급 CUDA, Metal, WGPU 실행을 결합합니다. 캘리브레이션은 적격한 모든 순수 Rust CPU, Hyperscan/SIMD, GPU 백엔드를 측정합니다. 이후 자동 라우팅은 정확한 호스트와 워크로드 클래스에 대해 가장 빠른 패리티 검증 경로를 사용합니다.
| GPU는 실제 백엔드입니다 | 실제 공격 표면을 스캔합니다 | 신호와 노이즈를 분리합니다 | 결과에 따라 조치합니다 |
|---|---|---|---|
| CUDA, 네이티브 Metal, WGPU는 조용한 폴백 체인이 아닌 측정된 동급 백엔드입니다. | Git 히스토리, Docker 레이어, 아카이브, 클라우드 버킷, 소스 맵, WASM, HAR 캡처, 호스팅 Git 컬렉션, 전체 시스템을 스캔합니다. | 증거, 예제 억제, 기준선을 적용하기 전에 base64, hex, URL, protobuf, 멀티라인, 구조화된 구성을 디코드합니다. | 적격 자격 증명을 공급자 API로 검증하고, SARIF 또는 구조화된 봉투를 내보내며, 정확한 커버리지와 종료 의미를 보존합니다. |
| cargo install --locked keyhog | |||
| keyhog scan . |
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/7654/dfb768a9b8e8fa64082992f11d0b284d5ec6a199fc1eac85e0352fb20452186f.gif" alt="KeyHog 스캔이 심각도, 증거, 파일 및 줄, 수정 방법, 결과, 적용 범위 상태를 보여줍니다" width="900" />
</p>
## GPU를 중심으로 구축된 시크릿 스캐너
KeyHog는 일반적인 컴퓨트 셰이더에 정규 표현식 몇 개를 넘겨주지 않습니다.
GPU 경로는 KeyHog와 함께 개발된 Rust GPU 컴퓨트 기반인
[Vyre](https://github.com/santhreal/vyre) 위에 구축되어 있습니다.
디텍터 트리거는 변경 불가능한 GPU 상주 테이블로 컴파일됩니다.
제한된 소스 배치는 CPU 및 Hyperscan 경로에서 사용되는 것과 동일한
확인, 억제, 증거, 보고 파이프라인에 대한 완전한 매치 위치를 생성합니다.
- **세 가지 물리적 GPU 피어.** CUDA, 네이티브 Metal, 휴대용 WGPU가
각각 독립적으로 획득, 측정, 보고됩니다.
- **정확한 결과 일치.** 보정(Calibration)은 참조 경로와 발견 항목
식별자가 다른 후보를 거부합니다. 더 빠른 잘못된 답변은 라우팅 테이블에
절대 들어가지 않습니다.
- **영구 경로 증거.** KeyHog는 바이너리, 디텍터 코퍼스, 구성, 워크로드
클래스, 호스트, 가속기, 드라이버, 측정된 타이밍 증거를 기록합니다.
일반 스캔은 핫 경로에서 벤치마킹하지 않습니다.
- **상주 실행.** 데몬 워커는 컴파일된 디텍터와 가속기 상태를 따뜻하게
유지하여 반복적인 파일, 아카이브, 히스토리, 원격, 클라우드 배치를 처리합니다.
- **숨겨진 CPU 탈출구 없음.** 명시적으로 선택된 가속기가 초기화되거나
디스패치할 수 없으면 GPU 라벨 아래에서 CPU 결과를 반환하는 대신
명시적으로 실패합니다.
기본 crates.io 설치에서는 휴대용 순수 Rust CPU 경로를 사용하므로
깨끗한 Rust 호스트에서 작동합니다. Hyperscan을 획득하지 않고도
세 가지 GPU 피어를 활성화할 수 있습니다:```sh
cargo install --locked keyhog --no-default-features --features portable,gpu
Hyperscan 또는 Vectorscan SIMD 정규식 피어를 활성화합니다:```sh cargo install --locked keyhog --no-default-features --features portable,simd
생산 백엔드 진단을 실행한 다음, 측정된 라우트를 검사합니다:```sh
keyhog backend --self-test
keyhog calibrate-autoroute --policy all
keyhog backend --autoroute --json
백엔드 가이드는 상주 테이블, 제한된 디스패치 모델, 패리티 계약, 그리고 재현 가능한 교차 검증 증거를 문서화합니다.
시작하기
설치 및 첫 스캔 실행
위의 두 명령은 최신 crates.io 릴리스를 설치하고 휴대용 순수 Rust 경로로 현재 트리를 스캔합니다.
CI 환경을 정확히 하나의 릴리스로 고정하려면
cargo install --locked --version '=0.5.86' keyhog을 사용하세요. KeyHog는 Rust 1.89
이상이 필요합니다. GPU, Hyperscan, CI, 휴대용, 소스 빌드 프로필에 대한 자세한 내용은
설치 가이드를 참조하세요.
KeyHog는 발견 항목이 활성 증거 정책을 차단하면 1로 종료됩니다. 기본
정책은 likely 및 confirmed 발견 항목을 차단하고 review 발견 항목은
종료 코드 0으로 표시된 상태로 유지합니다. --evidence-policy paranoid는 모든 등급을 차단합니다.
각 발견 항목의 정확한 증거 등급, 이유 코드, 파일, 줄, 탐지기, 그리고
수정 방법을 검토하세요. 다른 0이 아닌 코드는 입력, 시스템, 검증, 또는
커버리지 실패를 설명합니다. 자세한 내용은
종료 코드 참조를 참조하세요.
전체 프로세스 계약은 다음과 같습니다:
| 종료 코드 | 의미 |
|---|---|
0 성공 | 활성 증거 정책을 차단하는 발견 항목이 없고 커버리지 실패도 발생하지 않았습니다. 기본 정책에서는 검토 등급 발견 항목이 표시된 상태로 유지될 수 있습니다. |
1 차단 발견 항목 | 활성 증거 정책을 차단하는 발견 항목이 하나 이상 있지만, 라이브로 확인된 항목은 없습니다. |
2 운영자 오류 | 인수, 구성, 탐지기 코퍼스, 또는 운영자가 수정할 수 있는 입력을 수정하세요. |
3 시스템 오류 | 실행기를 복구하거나 재시도하세요. 여기에는 저수준 I/O, 치명적 데몬 서비스, 증분 캐시, 명시적으로 선택된 SIMD 실패가 포함됩니다. |
4 상태/자가 테스트 실패 | doctor 또는 backend --self-test 상태 검사가 비정상이었습니다. |
10 라이브 자격 증명 | 하나 이상의 자격 증명이 라이브로 확인되었습니다. |
11 스캐너 패닉 | 스캐너 상태를 신뢰할 수 없으므로 스캔 결과를 폐기하세요. |
12 필수 GPU 실패 | 명시적으로 선택되거나 필수인 GPU 경로를 실행할 수 없습니다. |
13 불완전한 커버리지 | 요청된 소스가 실패했거나 입력 커버리지가 불완전했으며, 어떤 발견 항목 결과도 우선하지 않았습니다. |
130 중단됨 | SIGINT 또는 Ctrl-C로 프로세스가 중단되었습니다. |
필터, 형식, 게이트:
필터로 사용하기 전에 기준선을 생성하세요:```sh keyhog scan . --create-baseline .keyhog-baseline.json keyhog scan . --baseline .keyhog-baseline.json --format json-envelope --output keyhog.json
첫 번째 명령은 검토된 발견 사항을 스냅샷으로 저장하고 `0`으로 종료되며 이를 출력하지
않습니다. 해당 파일을 커밋한 다음, 두 번째 명령을 사용하여 새 발견 항목 식별자만 보고하세요.
기준 항목은 탐지기와 자격 증명 값에서 일치하며 파일 경로에서는 절대 일치하지 않으므로,
기록된 비밀을 이동해도 게이트가 실패하지 않지만 회전시키면 실패합니다. 변경된 자격 증명과
불완전한 적용 범위는 계속 표시됩니다. 모노레포 파티션을 포함한 전체 경로는 [새 비밀에 대해서만
실패](https://santhreal.github.io/keyhog/workflows/ci.html#fail-only-on-new-secrets)에 있습니다.
다음 스캔을 위해 [레시피
쿡북](https://santhreal.github.io/keyhog/recipes.html) 또는 [올바른 워크플로 선택](#choose-the-right-workflow)의
복사 가능한 명령을 사용하세요. 도구를 변경하지 않고도 Git 기록, 컨테이너 이미지, 클라우드 버킷,
저장소 컬렉션, URL 및 전체 머신을 스캔할 수 있습니다.
### 빠른 사전 커밋 스캔을 위한 저장소 보호
상주 KeyHog 데몬에 저장소를 등록하여 빠른 사전 커밋 비밀 탐지를 수행하세요
(Unix 필요, Windows에서는 프로세스 내 `keyhog scan` 사용):```sh
# 1. Start the daemon (accelerated by CUDA, Metal, WGPU, or SIMD)
keyhog guard up
# 2. Guard your repository (indexes baseline and installs pre-commit hook in one step)
keyhog guard add /path/to/repo
# 3. Every staged commit checks only changed blobs against in-memory attestations
keyhog scan --git-staged
# 4. View all active guarded repositories and their states
keyhog guard list
# 5. Turn the daemon on and off cleanly without losing registrations or durable index
keyhog guard down
perpetual guard 가이드와 pre-commit 워크플로우를 참조하여 전체 구성, 상태 머신 수명 주기, 후크 자동화에 대해 알아보세요.
GitHub Actions에 추가하기
.github/workflows/keyhog.yml 파일을 생성하세요:```yaml
name: keyhog
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
security-events: write
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: santhreal/keyhog@v0
with:
path: .
severity: high
The Action scans the checked-out tree, fails on findings at `high` or
`critical`, uploads SARIF to Code Scanning, and retains the report as a workflow
artifact. Installation, coverage, backend, and report-publication failures also
fail the job.
Use the [GitHub Action guide](https://santhreal.github.io/keyhog/workflows/github-action.html)
for inputs, outputs, baseline adoption, monorepo partitions, verification, and
failure behavior. Use the [CI guide](https://santhreal.github.io/keyhog/workflows/ci.html)
for GitLab, CircleCI, Jenkins, Buildkite, and generic shell jobs. Use the
[mass-scanning guide](https://santhreal.github.io/keyhog/guides/mass-scanning.html)
for repository organizations, hosted Git groups, cloud buckets, and partitioned
inventories.
## 다른 도구들이 별도 제품으로 취급하는 스캔 표면
KeyHog는 추적된 소스 파일뿐만 아니라 유출될 수 있는 경계의 바이트를 스캔합니다.
경계마다 보고서 하나를 사용하여 CI가 정확한 커버리지와 실패 상태를 유지하도록 하세요.
| 노출 표면 | 예시 |
|---|---|
| 최종 패키지 아티팩트 | `npm pack`을 실행한 후 생성된 `.tgz`를 `keyhog scan package.tgz`로 스캔합니다. 아카이브 확장은 예상 소스 트리에 없는 생성 파일, 소스 맵, 픽스처, 메타데이터를 확인합니다. |
| 배포된 브라우저 애플리케이션 | `keyhog scan --url https://app.example.com/assets/app.js`는 제한된 JavaScript, 소스 맵, WASM, 응답 디코딩을 따르며 스캐너를 무제한 크롤러로 만들지 않습니다. |
| GitHub 이슈, 풀 리퀘스트, 디스커션, 위키, gist | `keyhog scan --github-collaboration owner/repo --github-all`은 체크아웃 외부의 모든 협업 표면을 스캔합니다. |
| AI 에이전트 및 MCP 구성 | `keyhog scan ~/.config ~/.claude ~/.codex`는 동일한 탐지기, 디코드, 증거, 보고 파이프라인을 로컬 도구 구성에 적용합니다. |
| 컨테이너 이미지 레이어 | `keyhog scan --docker-image registry.example.com/team/app:v1`은 빌드 중 도입된 파일을 포함하여 실행될 이미지 콘텐츠를 스캔합니다. |
| 클라우드 객체 인벤토리 | `keyhog scan --s3-bucket BUCKET`, `--gcs-bucket BUCKET`, 또는 `--azure-container-url URL`은 터미널 보고서에서 공급자 페이지네이션, 객체, 바이트 한도 커버리지를 보존합니다. |
| 전체 개발 호스트 | `sudo keyhog scan-system --space 50G`는 하드 스토리지 예산 하에서 마운트된 파일시스템과 도달 가능한 Git 히스토리를 발견합니다. |
이 경로들은 하나의 탐지 및 보고 계약을 공유합니다. 소스별 실패가
조용히 더 좁은 로컬 스캔으로 바뀔 수 없습니다.
## 올바른 워크플로 선택
먼저 소스 경계를 선택하세요. 프리셋은 탐지 작업을 변경하고, 백엔드는
실행을 변경합니다. 둘 다 작업 트리 스캔을 Git 히스토리, 공급자 인벤토리,
클라우드 스토리지, 또는 호스트 감사로 확장하지 않습니다.
정직한 `scan everything` 단축키는 없습니다. 완전한 에스테이트 검토는
아래 관련 경계를 별도 작업으로 실행하고 각 `json-envelope` 보고서를
원시 종료 코드와 함께 보관합니다.
| 필요 사항 | 시작 방법 | 처리량 및 재사용 | 커버리지 경계 |
|---|---|---|---|
| 빠른 로컬 피드백 | `keyhog scan . --fast --incremental` | 변경되지 않은 파일 해시를 재사용합니다. fast 프리셋은 디코드, 엔트로피, ML 작업을 건너뜁니다. | fast는 의도적으로 더 좁기 때문에 병합 전에 기본 정책을 실행하세요. |
| 전체 저장소 스캔 | `keyhog scan .` | 보정된 `auto` 및 CPU 코어 워커 기본값. 동일한 신뢰 트리의 반복 스캔에는 `--incremental`을 추가하세요. | 현재 파일만. Git 히스토리를 추가하지 않습니다. |
| 스테이징 커밋 게이트 | `keyhog scan --git-staged` 또는 `keyhog hook install` | 정확한 인덱스 블롭을 읽으므로 스테이징되지 않은 편집이 결과를 변경할 수 없습니다. | 스테이징된 콘텐츠만. 로컬 스테이징되지 않은 바이트가 중요할 때 작업 트리 스캔을 별도로 실행하세요. |
| 영구 저장소 가드 | `keyhog guard add . --mode repo` 그 다음 `keyhog guard status .` | 데몬 상주 루트 레지스트리, 7-상태 머신, 깨끗한 증명 캐시, 정책 ID 추적. | 실행 중인 데몬 필요. 가드는 스테이징 및 작업 트리 스캔을 보완하며 대체하지 않습니다. |
| GitHub 풀 리퀘스트 게이트 | `santhreal/keyhog@v0` | Action이 설치, 스캔, SARIF 및 아티팩트 게시 후 KeyHog의 상태를 보존합니다. | 체크아웃된 경로 하나. 조직에는 공급자 인벤토리 스캔을 사용하세요. |
| GitLab, Jenkins, Buildkite 또는 셸 CI | `keyhog scan . --format json-envelope --output keyhog.json` | 성공, 발견, 오류 시 보고서와 종료 코드를 유지합니다. 명시적으로 더 좁은 변경 라인 게이트에만 `--git-diff <base>`를 사용하세요. | 체크아웃에 존재하는 바이트 또는 선택된 diff. |
| 알려진 발견 사항이 있는 저장소 채택 | `.keyhog-baseline.json`을 생성하고 커밋한 후 `--baseline .keyhog-baseline.json`으로 스캔합니다. | 기존 ID는 베이스라인에 계속 표시되고 새 발견 사항만 게이트를 실패시킵니다. | 베이스라인은 변경된 자격 증명이나 불완전한 커버리지를 억제하지 않습니다. |
| 재귀적 Git 복구 | `keyhog scan --deep --git-history . --git-blobs . --daemon=off` | 딥 정책을 워커 클래스당 한 번 보정합니다. 프로세스 내에서 실행합니다. | 저장소 하나. `--git-history`는 현재 체크아웃의 조상만 다루므로 체크아웃하지 않은 브랜치는 커버리지 갭 없이 누락됩니다. `--git-blobs`는 댕글링 블롭, 수정된 커밋, 스태시, 노트, 주석 태그 메시지, 패킹된 refs에도 도달합니다. |
| 컨테이너 또는 아카이브 검사 | `keyhog scan --docker-image registry/app:v1` 또는 `keyhog scan incoming/` | 건너뛴, 손상된, 암호화된, 안전하지 않은, 또는 초과 크기 멤버가 계속 표시되도록 인벨로프 보고서를 유지하세요. | 선택된 이미지 또는 파일시스템 경로와 지원되는 중첩 형식만. |
| URL, 응답 또는 HAR 검사 | `keyhog scan --url https://api.example.com/config` 또는 `keyhog scan capture.har` | 제한된 소스 한도를 사용하고 터미널 인벨로프를 보존하세요. | 가져온 응답 또는 캡처 항목만. 크롤러가 아닙니다. |
| 조직 또는 클라우드 인벤토리 | `keyhog scan --daemon=off --github-org acme --format json-envelope --output acme.json` | 공급자, 소유자 또는 버킷별로 분할합니다. 독립 파티션을 각각 하나의 보고서와 상태로 동시에 실행하세요. | 작업당 선택된 공급자 인벤토리 하나. 페이지네이션 또는 객체 한도가 커버리지 경계로 남습니다. |
| 적격 발견 사항이 활성 상태인지 확인 | `keyhog scan . --verify` | 공급자 동시성 및 속도 제어는 스캐너 워커와 분리됩니다. | 선언된 공급자 엔드포인트에 자격 증명 파생 요청을 보냅니다. 모든 탐지기가 검증을 지원하지는 않습니다. |
| 전체 호스트 상태 스캔 | `sudo keyhog scan-system --space 50G` | 기본적으로 모든 CPU 코어를 사용하고 파일시스템 데이터 후 발견된 Git 히스토리를 스캔합니다. | 로컬 마운트된 파일시스템. 네트워크 마운트는 옵트인이며 공간 상한은 하드입니다. |
| Unix에서 GPU 지원 디렉터리, 히스토리, 아카이브, 원격 또는 클라우드 인벤토리 | autoroute를 보정하고 `keyhog daemon start --mass`를 시작한 후 `keyhog scan --daemon=mass <SOURCE>`를 실행합니다. | 제한된 배치를 하나의 컴파일된 CPU, Hyperscan, CUDA, Metal 또는 WGPU 워커로 스트리밍합니다. 웜 변경되지 않은 파일시스템 트리에는 `--incremental`을 추가하세요. 터미널 영수증은 정확한 총 및 GPU 배치, 청크, 바이트, GPU 점유율, 처리량을 보고합니다. | 베이스라인, 검증, 잠금, 프리셋, 오버레이 및 기타 스캐너 정책 변경은 획득 전에 거부됩니다. 증분 상태는 데몬 로컬 파일시스템 루트에만 적용됩니다. |
### 지원되는 모든 소스 경계 스캔
경계당 하나의 명령을 사용하세요. 각 인벤토리 파티션에 대해 `json-envelope` 보고서와
원시 종료 상태를 유지하세요.
| 소스 또는 사용 사례 | 명령 |
|---|---|
| 여러 로컬 루트 | `keyhog scan services/api services/web deploy/` |
| 지속적으로 변경되는 파일 | `keyhog watch services/api deploy/` |
| 스테이징된 바이트, 변경된 라인, 도달 가능한 히스토리 또는 블롭 | `keyhog scan --git-staged`, `--git-diff main`, `--git-history .`, 또는 `--git-blobs .` |
| 네이티브 바이너리 및 펌웨어 문자열 | `keyhog scan --binary firmware.bin` (일반 디렉터리 스캔은 바이너리를 건너뛰고 여전히 `0`으로 종료) |
| 아카이브 및 압축 소스 | `keyhog scan incoming/` (지원되는 멤버는 자동으로 확장) |
| Docker 이미지 레이어 | `keyhog scan --docker-image registry/app:v1` |
| JavaScript, 소스 맵, WASM 또는 엔드포인트 응답 | `keyhog scan --url https://api.example.com/config` |
| HTTP 요청 및 응답 캡처 | `keyhog scan capture.har` |
| GitHub 이슈, 풀 리퀘스트, 디스커션, 위키, gist | `keyhog scan --github-collaboration owner/repo --github-all` |
| GitHub, GitLab 또는 Bitbucket 인벤토리 | `--github-org ORG`, `--gitlab-group GROUP`, 또는 `--bitbucket-workspace WORKSPACE` |
| S3, GCS 또는 Azure Blob 인벤토리 | `--s3-bucket BUCKET`, `--gcs-bucket BUCKET`, 또는 `--azure-container-url URL` |
| 다른 도구의 제한된 스트림 | `producer \| keyhog scan --stdin` (`set -o pipefail`을 사용하여 실패한 프로듀서가 0바이트 스캔이 아닌 자체 오류를 표시하도록) |
일반 디렉터리 스캔은 네이티브 바이너리를 읽지 않습니다. 각각은
`binary (extension or content sniff)` 커버리지 갭이 되고 스캔은 여전히 `0`으로
종료하며 `--no-default-excludes`는 이를 변경하지 않으므로 컴파일된 아티팩트가
범위에 있을 때 `--binary`를 전달하세요. 해당 플래그는 `binary` 기능이 있는
빌드가 필요하며, 기본 crates.io 설치에는 있고 lean `ci` 기능에는 없습니다.
네이티브 바이너리 추출은 명명된 탐지기의 명시적 형태 계약을 충족하는
완전한 자격 증명을 보고합니다. 컴파일된 데이터 섹션의 짧은 접두사 조각과
일반 할당 형태 문자열은 소스 컨텍스트를 유지하지 않으므로 억제합니다.
엔드포인트 가져오기는 제한되고 SSRF-스크리닝됩니다. 크롤러가 아닙니다.
프라이빗 클라우드 엔드포인트와 자격 증명 전달에는 명시적 신뢰 플래그가 필요합니다.
공급자 토큰은 프로세스 인수가 아닌 문서화된 환경 변수에 속합니다.
소스 및 정책 세부 사항은 [워크플로 선택기](https://santhreal.github.io/keyhog/capabilities.html),
유지 관리되는 저장소 게이트는 [GitHub Action
가이드](https://santhreal.github.io/keyhog/workflows/github-action.html), 내구성 있는 보고서와
종료 처리는 [직접 CI
가이드](https://santhreal.github.io/keyhog/workflows/ci.html), 분할 및 집계는 [대량 스캔
가이드](https://santhreal.github.io/keyhog/guides/mass-scanning.html)를 사용하세요. [레시피
쿡북](https://santhreal.github.io/keyhog/recipes.html)은 컨테이너, 아카이브, URL, GitHub 협업 콘텐츠, 클라우드 소스를 다룹니다.
### 추측 없는 속도 및 동시성
기본값으로 시작하세요. Cargo는 `cargo install` 후 KeyHog를 실행할 수 없으므로
멀티 백엔드 Cargo 빌드를 설치한 후 아래 명령을 한 번 실행하고 호스트, 바이너리,
탐지기 코퍼스, 드라이버 또는 워크로드 클래스가 변경된 후 다시 실행하세요.```sh
keyhog calibrate-autoroute --policy all
keyhog backend --autoroute --json
| 제어 | 용도 | 유지해야 할 불변 조건 |
|---|---|---|
보정된 --backend auto | 일상적인 CPU, Hyperscan 또는 GPU 선택. | 명시적 백엔드는 진단용 오버라이드이지 더 빠른 기본값이 아님. |
--threads <N> | 공유 러너에서 CPU 용량 예약. 전용 호스트는 일반적으로 설정하지 않은 채로 두어 KeyHog가 사용 가능한 코어를 사용하도록 해야 함. | 모든 값은 양수여야 함. 여러 동시 KeyHog 프로세스는 각각 작업자 풀을 소유하므로 호스트 예산을 파티션별로 나누어야 함. |
--reader-threads <N> | 측정된 스토리지 파이프라인에서 스캔이 아닌 리더 작업이 병목인 경우. | 기본값은 스캔 작업자 풀에서 파생됨. 프로파일링에서 리더 병목이 확인될 때까지 설정하지 않은 채로 둠. |
--incremental 및 --incremental-cache <PATH> | 동일한 신뢰 트리의 반복 스캔. | 하나의 인덱스를 관련 없는 저장소나 신뢰할 수 없는 작업 간에 공유하지 말 것. |
| 공급자 또는 저장소 파티션 | 동시 에스테이트 스캔 및 독립적 재시도. | 파티션별로 하나의 터미널 봉투와 원시 종료 코드를 유지할 것. 발견 항목을 연결하고 커버리지 상태를 폐기하지 말 것. |
--verify-concurrency, --verify-rate 및 --verify-batch | 파일 스캔과 독립적으로 라이브 공급자 검사를 제한. | 검증은 자격 증명 파생 요청을 전송함. 이 동시성은 CPU 수가 아닌 공급자 속도 제한이 결정함. |
| 대량 데몬 | 단일 Unix 작업자에서 TB 규모의 디렉터리, 히스토리, 아카이브, 원격 또는 클라우드 스트림. | 각 프레임은 8 MiB 및 1,024 청크로 제한됨. 데몬은 프래그먼트 상태를 직렬화하고 정확한 CPU/GPU 실행 영수증을 반환함. |
--fast, 기본값, --deep 또는 --precision | 명시적 탐지 비용 및 재현 정책 선택. | 이 프리셋은 상호 배타적이며 커버리지를 변경함. 서로 바꿔 쓸 수 있는 속도 노브가 아님. |
keyhog config --effective로 해석된 정책을 검사하십시오. --profile을
사용하여 리더, 배치 또는 채널 깊이 제어를 변경하기 전에 고정된 스캐너 단계와
전체 운영자 실행을 측정하십시오. 저오버헤드 보고서는 소스, 백엔드, 캐시,
워크로드, 스레드, 입력, 상태 전환, CPU 시간, 최대 메모리, 정확한 바이너리
SHA-256, 활성 기능 SHA-256, 대상 트리플, 빌드 프로필, 컴파일러, 할당자,
연결된 백엔드 SHA-256, 탐지기 코퍼스 SHA-256, 활성 탐지기 BLAKE3, 컴파일된
계획 BLAKE3, 해시된 탐지기 출처, 완전한 해석 구성 BLAKE3, 성능 정책 BLAKE3,
프리셋, 적용된 보호 상태, 소스 어댑터, 해시된 소스 대상 BLAKE3, 해시된 소스
파티션 BLAKE3, 원시 소스 바이트, 소스 단위 팬아웃, 디코드 파생 바이트,
완료된 백엔드 디스패치 바이트 및 안정적인 크기/팬아웃 버킷을 기록합니다.
소스 어댑터가 아직 구분할 수 없는 바이트 도메인은 측정된 0이 되는 대신
명시적으로 사용 불가로 유지됩니다. 보고서는 소스 콘텐츠, 자격 증명 값, 원시
경로, 원시 URL 또는 원시 구성 값을 기록하지 않습니다. --perf-trace는
비용이 많이 드는 패턴별 및 백엔드 진단 카운터에만 사용하십시오.
대상 작업자에서 재현 가능한 측정이 개선을 보여줄 때까지 고급 파이프라인
제어는 설정하지 않은 채로 두십시오.
반복적인 전체 저장소 스캔의 경우:```sh
keyhog scan . --incremental
--format json-envelope --output keyhog.json
공유 러너의 경우 작업에 스캐너 워커 4개와 리더 워커 1개가 할당됩니다:```sh
keyhog scan . --threads 4 --reader-threads 1 \
--format json-envelope --output keyhog.json
두 번째 명령은 리소스 예산일 뿐, 보편적인 최적값이 아닙니다. 명시적 워커 수를 선택하기 전에 대상 호스트를 측정하세요.
심층 복구 및 시스템 전체 분류의 경우, 해당 전용 가이드를 사용하세요. 이들의 적용 범위와 완료 규칙은 일반 저장소 스캔과 다르기 때문입니다.
시크릿 스캐너 벤치마크
이 패널들은 탐지 정책, CPU 및 GPU 실행 요청, 증분 캐시 동작, 웜 데몬 요청을 비교합니다. 모든 값은 확인된 벤치마크 스냅샷에서 생성됩니다. 스냅샷은 스캐너 버전, 실행 파일 다이제스트, 탐지기 다이제스트, 코퍼스, 호스트, 실행 타임스탬프를 바인딩합니다. 경쟁사 출처 및 카테고리별 재현율은 전체 벤치마크 증거를 사용하세요.
탐지 정확도
KeyHog KeyHog v0.5.70이(가) mirror 코퍼스를 스캔했습니다: 15,000개 픽스처, 3,000개 라벨링된 양성, 2,431,242 입력 바이트. 정답 키 매니페스트는 스캔 트리에서 제외되었습니다. 행은 AMD Ryzen 9 9950X 16-Core Processor에서 명시적 Hyperscan/SIMD 경로의 기본 정책을 사용합니다.
| 정밀도 | 재현율 | F1 | 실제 양성 | 오탐 | 미탐 |
|---|---|---|---|---|---|
| 0.9651 | 0.9027 | 0.9328 | 2,708 | 98 | 292 |
추적된 소스 트리는 깨끗했습니다.
실행 경로, 프리셋 및 캐시
AMD Ryzen 9 9950X 16-Core Processor 및 NVIDIA GeForce RTX 5090, 32개 논리 코어, 15,000개 픽스처, 3,000개 라벨링된 양성, 2,431,242 입력 바이트에서 측정. 스캐너: KeyHog v0.5.70. 추적된 소스 트리는 깨끗했습니다.
실행 경로별 전체 스캔
모든 행은 증분 캐시 및 데몬이 꺼진 기본 탐지 정책을 사용합니다. 자동 행은 요청된 정책을 기록하지만, 벤치마크 결과는 선택된 영구 경로를 바인딩하지 않으므로 라우팅 증거가 아닙니다. GPU 행은 이 작은 코퍼스에서 획득 및 전체 스캐너 시작을 포함합니다. GPU 커널 크로스오버 측정이 아닙니다.
| 요청된 경로 | 벽시계 | 처리량 | 최고 RSS | F1 |
|---|---|---|---|---|
| Hyperscan/SIMD | 860 ms | 2.70 MB/s | 416 MiB | 0.9328 |
| Pure-Rust CPU | 903 ms | 2.57 MB/s | 509 MiB | 0.9328 |
| CUDA | 2.03 s | 1.14 MB/s | 963 MiB | 0.9328 |
| WGPU | 1.97 s | 1.18 MB/s | 1264 MiB | 0.9328 |
| 자동 | 1.46 s | 1.59 MB/s | 634 MiB | 0.9328 |
Hyperscan/SIMD의 탐지 정책
경로, 캐시, 데몬 상태, 코퍼스, 호스트는 고정됩니다. 프리셋은 탐지 작업을 변경하므로 시간뿐만 아니라 정밀도와 재현율도 비교하세요.
| 정책 | 벽시계 | 정밀도 | 재현율 | F1 | 발견 수 |
|---|---|---|---|---|---|
| Fast | 737 ms | 0.9700 | 0.8837 | 0.9248 | 2,738 |
| Default | 860 ms | 0.9651 | 0.9027 | 0.9328 | 2,816 |
| Deep | 861 ms | 0.9645 | 0.9067 | 0.9347 | 2,845 |
| Precision | 849 ms | 0.9590 | 0.6397 | 0.7674 | 2,001 |
증분 웜 재실행
벤치마크는 BLAKE3 Merkle 인덱스를 채운 다음 두 번째 동일한 스캔의 시간을 측정합니다. 스캐너 시작이 지배적이므로 작은 합성 트리는 거의 변하지 않습니다. 속도 향상을 주장하기 전에 저장소를 측정하세요.
| Hyperscan/SIMD 기본 정책 | 벽시계 | 처리량 | 최고 RSS |
|---|---|---|---|
| 캐시 꺼짐 | 860 ms | 2.70 MB/s | 416 MiB |
| 웜 증분 캐시 | 617 ms | 3.76 MB/s | 457 MiB |
웜 데몬 요청
결정적 8 MiB 일반 파일(sha256:afafbe7b6487fd62866f510e7c281a9e7bfeaa8dc585d7b0478c92ee6c4f5ef5)이 프로세스 내에서 한 번, 워밍업 요청 후 소유 데몬을 통해 한 번 스캔되었습니다. 데몬 시간은 클라이언트 요청입니다. 데몬 RSS는 상주 서버에 속합니다.
| 명시적 경로 | 프로세스 내 | 웜 데몬 | 웜 / 일회성 | 프로세스 내 RSS | 데몬 RSS |
|---|---|---|---|---|---|
| Hyperscan/SIMD | 323 ms | 106 ms | 0.33× | 63 MiB | 74 MiB |
| Pure-Rust CPU | 278 ms | 109 ms | 0.39× | 62 MiB | 66 MiB |
| CUDA | 1.65 s | 232 ms | 0.14× | 674 MiB | 666 MiB |
| WGPU | 1.33 s | 237 ms | 0.18× | 596 MiB | 600 MiB |
이 행들은 웜 단일 파일 경로를 다룹니다. 대량 경로는 또한 제한된 디렉터리 및 원격 소스 배치를 허용합니다. 증분 파일 시스템 경로는 별도로 측정됩니다.
CPU, 리더, 스토리지, 크기 및 파티션 확장
benchmarks/reports/readme-scaling.json에서 make -C benchmarks readme-scaling으로 생성. 하네스는 명시적 simd 및 데몬 라우팅이 꺼진 상태에서 1회 워밍업 후 3회 측정 시도를 실행했습니다. 워커 확장은 CPU 작업을 분리하기 위해 웜 클라이언트 페이지 캐시를 사용합니다. 리더, 코퍼스 크기, 스토리지 및 파티션 행은 플랫폼이 지원하는 경우 posix_fadvise로 클린 페이지 축출을 요청합니다. 스냅샷은 모든 행에 정책을 기록합니다. 모든 워크로드는 바이트 결정적이며 발견이 없습니다.
호스트: AMD Ryzen 9 9950X 16-Core Processor, 32개 유효 논리 코어, 94,140 MiB RAM, Linux 6.17.0-19-generic. 증거: clean, 바이너리 274b045489c4.
스캔 워커 확장
| 워커 | 리더 스레드 | 중앙값 벽시계 | p95 벽시계 | 처리량 | 속도 향상 | 효율 | 중앙값 최고 RSS |
|---|---|---|---|---|---|---|---|
| 1 | auto | 8,134.4 ms | 8,135.4 ms | 7.9 MiB/s | 1.00x | 100.0% | 47.0 MiB |
| 2 | auto | 4,398.2 ms | 6,906.7 ms | 14.6 MiB/s | 1.85x | 92.5% | 50.3 MiB |
| 4 | auto | 2,392.6 ms | 6,245.2 ms | 26.7 MiB/s | 3.40x | 85.0% | 57.2 MiB |
| 8 | auto | 1,816.3 ms | 6,117.6 ms | 35.2 MiB/s | 4.48x | 56.0% | 63.4 MiB |
| 16 | auto | 1,428.5 ms | 6,867.7 ms | 44.8 MiB/s | 5.69x | 35.6% | 78.4 MiB |
| 32 | auto | 1,862.8 ms | 5,939.1 ms | 34.4 MiB/s | 4.37x | 13.6% | 126.7 MiB |
파일 시스템 리더 확장
| 스캔 워커 | 리더 스레드 | 중앙값 벽시계 | p95 벽시계 | 처리량 | 리더 1개 대비 | 중앙값 최고 RSS |
|---|---|---|---|---|---|---|
| 32 | 1 | 1,898.7 ms | 1,922.1 ms | 33.7 MiB/s | 1.00x | 121.3 MiB |
| 32 | 2 | 1,881.7 ms | 1,887.5 ms | 34.0 MiB/s | 1.01x | 122.8 MiB |
| 32 | 4 | 1,874.2 ms | 1,891.2 ms | 34.1 MiB/s | 1.01x | 126.6 MiB |
| 32 | 8 | 1,873.2 ms | 1,885.7 ms | 34.2 MiB/s | 1.01x | 133.4 MiB |
| 32 | 16 | 1,856.8 ms | 1,868.5 ms | 34.5 MiB/s | 1.02x | 153.9 MiB |
| 32 | 32 | 1,877.3 ms | 1,880.4 ms | 34.1 MiB/s | 1.01x | 179.5 MiB |
코퍼스 크기 확장
| 코퍼스 | 파일 수 | 정확한 바이트 | 중앙값 벽시계 | p95 벽시계 | 처리량 | 중앙값 최고 RSS |
|---|---|---|---|---|---|---|
| small | 256 | 8 MiB | 869.9 ms | 886.1 ms | 9.2 MiB/s | 111.1 MiB |
| medium | 1,024 | 64 MiB | 1,859.9 ms | 1,874.8 ms | 34.4 MiB/s | 126.3 MiB |
| large | 2,048 | 256 MiB | 5,214.9 ms | 5,321.7 ms | 49.1 MiB/s | 137.1 MiB |
스토리지 확장
| 스토리지 클래스 | 파일 시스템 | 장치 ID | 중앙값 벽시계 | p95 벽시계 | 처리량 | 첫 스토리지 대비 | 중앙값 최고 RSS |
|---|---|---|---|---|---|---|---|
| workspace | ext4 | 66305 | 1,847.4 ms | 1,863.4 ms | 34.6 MiB/s | 1.00x | 127.0 MiB |
| local-temp | tmpfs | 116 | 1,870.8 ms | 1,887.3 ms | 34.2 MiB/s | 0.99x | 124.9 MiB |
동시 파티션 확장
| 프로세스 | 프로세스당 워커 | 총 워커 | 총 파일 수 | 총 바이트 | 중앙값 벽시계 | 총 처리량 | 속도 향상 | 중앙값 합산 최고 RSS |
|---|---|---|---|---|---|---|---|---|
| 1 | 32 | 32 | 256 | 8 MiB | 871.9 ms | 9.2 MiB/s | 1.00x | 111.5 MiB |
| 2 | 16 | 32 | 512 | 16 MiB | 404.6 ms | 39.5 MiB/s | 4.31x | 134.0 MiB |
| 4 | 8 | 32 | 1,024 | 32 MiB | 571.1 ms | 56.0 MiB/s | 6.11x | 227.2 MiB |
이 행들은 측정값일 뿐, 보편적인 튜닝 상수가 아닙니다. 대상 호스트 및 스토리지에서 생성기를 실행하세요. 처리량이 개선을 멈추는 지점(무릎)을 사용한 다음 CI 러너 또는 오케스트레이션 계층을 위해 CPU와 메모리를 예약하세요.
네 가지 벤치마크 그룹을 모두 make -C benchmarks readme-matrix로 재현하세요.
이 명령은 요청된 매트릭스를 측정하며 요청된 CPU, Hyperscan, CUDA, Metal, WGPU, 프리셋, 캐시, 데몬, 스레드, 리더, 스토리지, 코퍼스 크기 또는 파티션 행을 사용할 수 없으면 실패합니다.
make -C benchmarks readme-matrix-check를 사용하여 두 스냅샷, 보고서 및 README가 일치하는지 확인하세요.
스캔 구성 선택
기본 정책과 보정된 자동 라우팅으로 시작하세요. 워크플로가 요구할 때만 한 축을 변경하세요:
| 워크플로 | 탐지 정책 | 실행 및 재사용 | 추가 제어 |
|---|---|---|---|
| 첫 저장소 스캔 | Default | 보정된 auto; --daemon=auto | 억제를 추가하기 전에 모든 발견 사항을 검토하세요. |
| 반복 로컬 트리 또는 CI 스캔 | Default | 보정된 auto; --incremental | 동일한 신뢰 트리 스캔 사이에만 증분 캐시를 유지하세요. |
| 짧은 피드백 루프 | --fast | 보정된 auto; 선택적 --incremental | 감소된 디코드, 엔트로피 및 ML 적용 범위를 수용하세요. 병합 전에 기본 정책을 실행하세요. |
| 최고 재현율 복구 | --deep | 프로세스 내 | Deep은 fast 및 precision과 상호 배타적이며 데몬 자격이 없습니다. |
| 저노이즈 대규모 인벤토리 | --precision | 저장소 컬렉션, 기록 및 클라우드 소스의 경우 프로세스 내 | 이 프리셋은 신뢰 하한을 높이고 엔트로피 발견을 비활성화합니다. 낮은 신뢰도의 자격 증명을 놓칠 수 있습니다. |
| Unix의 TB 규모 디렉터리, 기록, 아카이브, 원격 또는 클라우드 인벤토리 | Default | keyhog daemon start --mass, 그 다음 --daemon=mass | 배치는 8 MiB 및 1,024 청크로 제한됩니다. 터미널 적용 범위 보고서와 GPU 실행 영수증을 보존하세요. |
| 실시간 자격 증명 검증 | Default | 프로세스 내 | --verify를 명시적으로 추가하세요. 검증은 자격 증명 파생 요청을 공급자에게 보냅니다. |
| Linux 무스왑 스캔 | Default + --lockdown | 프로세스 내; 증분 캐시 비활성화 | Lockdown은 검증, 일반 텍스트 시크릿, fast 모드 및 완전성 감소 스위치를 거부합니다. |
--fast, --deep 및 --precision은 상호 배타적인 탐지 프리셋입니다.
--lockdown은 네 번째 프리셋이 아닌 실패 시 폐쇄 실행 모드입니다. 명시적
--backend 값은 진단 및 벤치마크 재정의입니다. 자동 라우팅에서 사용하는 영구 최속 정확 증거를 대체하지 않습니다.
전체 계약은 Configuration,
autoroute calibration,
daemon and warm scans
및 hardening을 참조하세요.
KeyHog 작동 방식
KeyHog은 934개 탐지기를 공유 트리거 및 추출 계획으로 컴파일하고, 매칭 전에 중첩 인코딩을 디코드하며, 탐지기별 점수, 증거 및 억제를 적용합니다. Pure-Rust CPU(cpu-fallback)는 항상 사용 가능합니다. Hyperscan 경로(simd-regex)는 해당 기능이 있을 때 Hyperscan을 사용합니다. 휴대용 빌드는 CPU 경로를 사용합니다. CUDA(gpu-cuda-region-presence), Metal(gpu-metal-region-presence) 및 WGPU(gpu-wgpu-region-presence)는 폴백 체인이 아닌 증거 기반 autoroute 선택기의 피어입니다. 보정은 적격 피어 각각을 측정하고 정확한 바이너리, 탐지기 및 구성 상태, 호스트, 가속기 및 워크로드 클래스에 대해 참조 경로와 완전한 발견 사항이 일치하는 최속 경로를 유지합니다. 누락, 오래됨, 유효하지 않거나 불완전한 결정은 실행 전에 자동 스캔을 중지하고 재보정 방법을 보고합니다. 다른 백엔드를 조용히 대체하지 않습니다.
저장소 맵, 종속성 방향, 바이트-투-발견 파이프라인 및 프로파일링 진입점은 Architecture를 참조하세요. 실행 계약은 Backends and routing, 패리티, 워크로드 ID, 캐시 수명 주기 및 복구 절차는 Autoroute calibration을 참조하세요.
전체 문서: santhreal.github.io/keyhog - 설치, 첫 스캔, 출력 형식, 탐지 내부, 억제, 검증, pre-commit + CI 통합, CLI 참조, autoroute, 종료 코드, 환경 변수 및 기여. 소스는 docs/ 아래에 있습니다.
KeyHog 설치
현재 crates.io 릴리스를 설치하세요:```sh cargo install keyhog --locked
저장소 체크아웃을 빌드해야 하는 경우, 아직 릴리스되지 않은 변경 사항이 필요할 때:```sh
cargo install --path crates/cli --locked
설치된 빌드를 확인합니다:```sh keyhog --version --full keyhog doctor
[설치 가이드](https://santhreal.github.io/keyhog/install.html)를 참조하여
Rust 툴체인 요구 사항, 기능 프로필, 플랫폼별 런타임 종속성을 확인하세요.
## 탐지 대상
934개의 내장 탐지기와 탐지기 자체 소유의 오프라인 검증 및 동반(companion) 검사:
- **클라우드 제공업체:** AWS(액세스 키 + 시크릿 + STS 검증),
Azure(구독 키, 스토리지 계정 키, SAS), GCP(서비스 계정,
API 키), Cloudflare, Heroku, Vercel, Supabase.
- **결제 처리업체:** Stripe, Braintree, Razorpay, Paddle, Plaid,
Square, PayPal. 탐지기 자체 검사와 선택적 또는 필수 동반 검사를 포함합니다.
Razorpay 키 시크릿은 인근의 키 ID를 요구합니다.
- **소스 포지:** GitHub PAT(CRC32 체크섬 포함), GitLab 토큰,
Bitbucket 앱 비밀번호, npm 토큰(체크섬 포함), Gitea / Forgejo
/ Codeberg.
- **인증 / SSO:** Okta, Auth0, Clerk, JumpCloud, Kinde.
- **커뮤니케이션:** Slack, Discord, Twilio, SendGrid, Postmark, Mailgun,
Resend, Loops.
- **AI / ML:** OpenAI(sk-/sk-proj-), Anthropic, Google AI Studio,
Cohere, Mistral, HuggingFace, Replicate. HuggingFace 조직
자격 증명에는 현재 `hf_` 형식과 레거시 `api_org_`
토큰이 모두 포함됩니다.
- **비밀번호 관리자:** 1Password 계정 시크릿 키(`A3-` 뒤에
5~6개의 세그먼트로 구분된 대문자 영숫자 구성 요소).
- **데이터베이스:** Postgres 연결 문자열, MongoDB Atlas, Supabase
서비스 역할, PlanetScale, Neon, Turso, MySQL, Redis URL.
- **일반 + 엔트로피 탐지:** `API_KEY=<고엔트로피 블롭>`은
명명된 탐지기가 없는 자격 증명을 포착하며, 컨텍스트별 엔트로피
임계값 + ML 점수로 게이트됩니다.
- **암호화 자료:** RSA / EC / SSH 개인 키, PGP 개인
블록, JWT 서명 시크릿.
각 탐지기는 [TOML 파일](https://github.com/santhreal/keyhog/blob/main/detectors)(데이터, 코드 아님)로 제공됩니다:
서비스 메타데이터, 정규식 패턴, 키워드, 오프라인 검증기, 엔트로피 및 ML
정책, 동반 필드, 검증 핸들러. 새 탐지기를 추가하는 것은 단일 검토 가능한
TOML 변경입니다.
[기여자 가이드](https://github.com/santhreal/keyhog/blob/main/CONTRIBUTING.md)에서 전체 과정을 안내합니다.
`keyhog explain <id>`는 모든 탐지기의 전체 사양을 덤프합니다: 패턴, 키워드,
검증 엔드포인트, 서비스 키 기반 교체 및 단계별
수정 가이드까지 포함하므로 발견 항목은 결코 블랙박스가 아닙니다:
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/7654/0fc64959950abfa39c0ba81a1f5fbde3fe17a57169d2edca38cb0f248c834470.gif" alt="keyhog explain github-classic-pat: 탐지기 사양 덤프(패턴 ghp_[A-Za-z0-9]{36}, 키워드, 검증 URL) 후 github 교체 가이드 및 단계별 수정" width="860" />
</p>
탐지기 작성 및 검사는
[탐지기 참조](https://github.com/santhreal/keyhog/blob/main/docs/src/detectors.md)에서 확인하거나, 설치된 코퍼스에서
`keyhog detectors --search <term> --verbose`로 쿼리할 수 있습니다.
## 더 높은 재현율, 더 적은 오탐지의 이유
- **디코딩 통과 스캔.** Kubernetes `Secret` 매니페스트, Jupyter
노트북, JWT 페이로드, base64로 감싼 환경 변수, Helm 값, docker-config
`auth:` 블롭. 구조화된 전처리기는 균형 잡힌 Helm 액션을
렌더링 시점의 불활성 값으로 취급하고 파일 끝에서 누락된 Jupyter 구분자를 닫으므로
리터럴 바이트와 완전한 코드 셀이 계속 포함됩니다. 구조화된 값을
제자리에서 디코딩하고 모든 다운스트림 탐지기에 평문을 공급합니다. 탐지기는
각각 디코딩을 다시 구현할 필요가 없습니다. 디코딩 활성 스캔은 또한
모든 복구 자료가 포함된 경우 부작용 없는 JavaScript 바이트 배열 XOR 및
AES-256-CBC 표현식을 복구하며, 엄격한 CryptoJS/OpenSSL 솔티드
패스프레이즈 래퍼를 포함합니다. KeyHog는 소스를 실행하지 않습니다.
- **멀티라인 재조립.** JavaScript의 `"sk-proj-" + \` 연속,
YAML 멀티라인 문자열, Makefile 백슬래시 연속, Helm /
Jinja 템플릿 출력을 모두 정규식 매칭 전에 재조립합니다.
- **동반 검증.** 필수 동반 검사는 고노이즈 탐지기를 게이트합니다. Twilio
API 키가 API 시크릿 없이 발견되면 건너뜁니다. 선택적 동반 검사는
증거 점수 또는 검증을 강화합니다. AWS 액세스 키 탐지는
시크릿을 요구하지 않지만, 라이브 검증에는 시크릿이 필요합니다.
- **교차 탐지기 해석.** 탐지기 TOML은 다른 탐지기의 경계 내 발견 항목을
요구, 거부 또는 흡수할 수 있습니다. 해석은 입력 순서와 관계없이
결정적이며, 잘못된 대상, 모순 또는 의존성 순환은 코퍼스
컴파일을 실패시킵니다.
- **증거 판정.** 모든 발견 항목은 정확한 `review`, `likely`, 또는
`confirmed` 등급과 표준 이유 코드를 갖습니다. 내재적 체크섬 또는 문법
증명, 필수 동반 검사, 라이브 검증은 confirmed 증거를 생성합니다;
자격 증명 역할의 강력한 공급업체별 형태는 likely 증거를 생성합니다;
약한 앵커, 일반 할당, 엔트로피 전용 후보, 테스트, 문서, 규칙 또는
식별자 컨텍스트는 review 증거로 남습니다. 선택적 `evidence_score`는
측정 시 판정을 보완합니다. 기본 임계값 `0.40`은 스캐너의 내부 신뢰도
하한을 제어하며 `--min-confidence`로 구성 가능합니다.
- **베이지안 탐지기별 보정.** `keyhog calibrate --fp generic-api-key`는
Beta(α,β) 사후 분포를 기록합니다. 스캔은 `--calibration-cache`
또는 `[system].calibration_cache`가 해당 파일을 가리킬 때만 이를 사용하므로
신뢰도 튜닝은 임의의 호스트 캐시 상태에 의존하는 대신 명시적이고
재현 가능합니다.
## 성능
[`benchmarks/`](https://github.com/santhreal/keyhog/blob/main/benchmarks)의 재현 가능한 하네스를 사용하여 KeyHog,
Betterleaks, Kingfisher, Nosey Parker, TruffleHog, Titus를 단일 점수
계약 하에서 비교하세요. 하네스는 모든 스캔 트리에서 정답 매니페스트를
제외합니다. 생성된 테이블은 현재 스키마 실행이 존재할 때까지 비어 있습니다.
측정 후 `make -C benchmarks report`를 실행하세요. 생성된 테이블을
수동으로 편집하지 마세요.
### 탐지 리더보드
<!-- BENCH:leaderboard:start -->
#### 합성 SecretBench 형태 미러 코퍼스
코퍼스: **mirror** - 15000개 픽스처, 3000개 라벨링된 양성, 2,431,242바이트. 모든 스캐너가 동일하게 점수화됨(SecretBench 중첩 규칙); 정답 키 매니페스트는 스캔 트리에서 제외됨.
| 순위 | 스캐너 | F1 | 정밀도 | 재현율 | 발견 수 | 소요 시간 | 최대 RSS |
|---|---|---|---|---|---|---|---|
| 1 | **KeyHog** | **0.9328** | 0.9651 | 0.9027 | 2816 | 1.05초 | 416 MB |
| 2 | TruffleHog | 0.5294 | 1.0000 | 0.3600 | 1080 | 1.59초 | 300 MB |
| 3 | Kingfisher | 0.4683 | 0.3877 | 0.5913 | 5255 | 4.81초 | 402 MB |
| 4 | Titus | 0.4207 | 0.3381 | 0.5567 | 5151 | 2.86초 | 115 MB |
| 5 | Nosey Parker | 0.4186 | 0.3511 | 0.5183 | 4529 | 0.82초 | 285 MB |
| 6 | Betterleaks | 0.3498 | 0.2241 | 0.7970 | 11113 | 0.74초 | 198 MB |
#### 경쟁사 홈필드 / 홈터프 규칙 코퍼스
코퍼스: **homefield** - 경쟁사 정답 규칙 스위트(Betterleaks 및 Kingfisher 규칙; 1,057개 라벨링된 양성, 1,342개 음성, 772,974바이트)에서 수집된 2399개 픽스처. 경쟁사 정답에 대한 교차 도구 평가.
| 순위 | 스캐너 | F1 | 정밀도 | 재현율 | 발견 수 | 소요 시간 | 최대 RSS |
|---|---|---|---|---|---|---|---|
| 1 | **KeyHog** | **0.9214** | 0.9582 | 0.8874 | 979 | 0.72초 | 384 MB |
| 2 | Betterleaks | 0.9056 | 0.9130 | 0.8984 | 1040 | 0.58초 | 192 MB |
| 3 | Kingfisher | 0.8842 | 0.9250 | 0.8468 | 968 | 2.14초 | 390 MB |
| 4 | TruffleHog | 0.4812 | 0.9850 | 0.3226 | 345 | 1.22초 | 280 MB |
| 5 | Titus | 0.4635 | 0.3810 | 0.5913 | 1640 | 2.15초 | 110 MB |
| 6 | Nosey Parker | 0.4520 | 0.3950 | 0.5280 | 1412 | 0.68초 | 265 MB |
### 결과 출처
| 스캐너 | 스캐너 버전 / 실행 파일 다이제스트 | 코퍼스 ID | 호스트 ID | 실행 날짜 |
|---|---|---|---|---|
| KeyHog | 버전: KeyHog v0.5.70<br>커밋: d1eb2e09eb2c289181d93d719ce3f62411aeaf2c<br>탐지기 세트: 926 (926-4168e2c6c93a16ca)<br>빌드 대상: x86_64-linux<br>ML 모델 버전: moe-v1-246a05b92bec9aa3<br>ML 모델 카드: 2026-07-15 기록; 특징 55; 합성 F1 0.971 / P 0.945 / R 0.999; 실제 F1 0.832 / P 0.753 / R 0.931 / [email protected] 0.938; 제로 재현율 탐지기 2/32; 6-스캐너 차등 분석 불가<br>실행 파일 SHA-256: `2899ee53789bff9c531f72645f6c8380a7c873230dfb2b6857079467bc8d2dcd` | mirror; 15,000개 픽스처; 3,000개 라벨링된 양성; 2,431,242바이트 | 호스트 이름 SHA-256/12: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:39Z |
| TruffleHog | 버전: trufflehog 3.96.0<br>실행 파일 SHA-256: `6eb1f98fb890bf9361d8833c061e122dcb4f14fb7b71c65e603b7c096153c724` | mirror; 15,000개 픽스처; 3,000개 라벨링된 양성; 2,431,242바이트 | 호스트 이름 SHA-256/12: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:58Z |
| Kingfisher | 버전: kingfisher 1.94.0<br>실행 파일 SHA-256: `a49f8e9838d7f1da1e9f328a4dbc45a16996bce5078cde3ff1b8ad422d8ab07a` | mirror; 15,000개 픽스처; 3,000개 라벨링된 양성; 2,431,242바이트 | 호스트 이름 SHA-256/12: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:50Z |
| Titus | 버전: Titus v1.1.20 (NoseyParker의 Go 포트)<br>실행 파일 SHA-256: `0b9c126a6c280ba28c6ed8795f88bf9bd793164c15959a34921f47a7ed276bcf` | mirror; 15,000개 픽스처; 3,000개 라벨링된 양성; 2,431,242바이트 | 호스트 이름 SHA-256/12: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:30:03Z |
| Nosey Parker | 버전: noseyparker 0.24.0 빌드 구성: 빌드 타임스탬프: 2025-05-08T21:11:15.600909923Z 커밋 타임스탬프: 2025-05-08T17:04:47.000000000-04:00 커밋 브랜치: HEAD 커밋 SHA: 61fa4ca67e4ded1b47b3b9ecce618ae91f1ff2fe Cargo 기능: color_backtrace,default,disable_trace,github,log,mimalloc,parquet,release 디버그: true 최적화: 3 대상 트리플: x86_64-unknown-linux-gnu 빌드 시스템: OS: Ubuntu OS 버전: Linux (Ubuntu 22.04) CPU 공급업체: AuthenticAMD CPU 브랜드: AMD EPYC 7763 64-Core Processor CPU 코어: 2 rustc 버전: 1.86.0 rustc 채널: stable rustc 호스트 트리플: x86_64-unknown-linux-gnu rustc 커밋 날짜: 2025-03-31 rustc 커밋 SHA: 05f9846f893b09a1be1fc8560e33fc3c815cfecb rustc LLVM 버전: 19.1<br>실행 파일 SHA-256: `42d6e88bf77904866a9dda49d7cf333501e76b62e9054b112e67f81dc88e2b71` | mirror; 15,000개 픽스처; 3,000개 라벨링된 양성; 2,431,242바이트 | 호스트 이름 SHA-256/12: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:53Z |
| Betterleaks | 버전: betterleaks version dev<br>실행 파일 SHA-256: `466f7d34e1ebcf12ecd5939494f509c17125e54416226976fced2f046da56ba4` | mirror; 15,000개 픽스처; 3,000개 라벨링된 양성; 2,431,242바이트 | 호스트 이름 SHA-256/12: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:43Z |
<!-- BENCH:leaderboard:end -->
### 속도 및 메모리
<!-- BENCH:perf:start -->
#### 합성 SecretBench 형태 미러 코퍼스
| 스캐너 | 구성 | 코퍼스 | 소요 시간 | 처리량 | 최대 RSS |
|---|---|---|---|---|---|
| Betterleaks | `default-nocache-nodaemon-no-validate` | mirror | 0.74초 | 3.1 MB/s | 198 MB |
| Nosey Parker | `default-nocache-nodaemon-no-git-history` | mirror | 0.82초 | 2.8 MB/s | 285 MB |
| KeyHog | `simd-nocache-nodaemon-full` | mirror | 1.05초 | 2.2 MB/s | 416 MB |
| TruffleHog | `default-nocache-nodaemon-no-verify` | mirror | 1.59초 | 1.5 MB/s | 300 MB |
| Titus | `default-nocache-nodaemon-no-validate` | mirror | 2.86초 | 0.8 MB/s | 115 MB |
| Kingfisher | `default-nocache-nodaemon-low-no-validate` | mirror | 4.81초 | 0.5 MB/s | 402 MB |
#### 경쟁사 홈필드 / 홈터프 규칙 코퍼스
| 스캐너 | 구성 | 코퍼스 | 소요 시간 | 처리량 | 최대 RSS |
|---|---|---|---|---|---|
| Betterleaks | `default-nocache-nodaemon-no-validate` | homefield | 0.58초 | 1.3 MB/s | 192 MB |
| Nosey Parker | `default-nocache-nodaemon-no-git-history` | homefield | 0.68초 | 1.1 MB/s | 265 MB |
| KeyHog | `simd-nocache-nodaemon-full` | homefield | 0.72초 | 1.1 MB/s | 384 MB |
| TruffleHog | `default-nocache-nodaemon-no-verify` | homefield | 1.22초 | 0.6 MB/s | 280 MB |
| Titus | `default-nocache-nodaemon-no-validate` | homefield | 2.15초 | 0.4 MB/s | 110 MB |
| Kingfisher | `default-nocache-nodaemon-low-no-validate` | homefield | 2.14초 | 0.4 MB/s | 390 MB |
<!-- BENCH:perf:end -->
### 카테고리별 재현율 비교
<!-- BENCH:gaps:start -->
_진단용 재현율 슬라이스만 해당. 전체 정밀도와 F1이 비교 계약으로 유지됩니다; 오탐지는 점수화된 카테고리에서 계산됩니다._
| 카테고리 | KeyHog P/R/F1 | KeyHog TP/FN | 최고 경쟁사 P/R/F1 | 재현율 격차 |
|---|---|---|---|---|
| `generic-high-entropy-string` | 1.000 / 0.434 / 0.606 | 73/95 | Betterleaks 1.000 / 0.798 / 0.887 | +0.363 |
<!-- BENCH:gaps:end -->
### 제한된 정적 복구 텔레메트리
<!-- BENCH:recovery:start -->
선택된 실행: 스캐너 **KeyHog** `KeyHog v0.5.70<br>커밋: d1eb2e09eb2c289181d93d719ce3f62411aeaf2c<br>탐지기 세트: 926 (926-4168e2c6c93a16ca)<br>빌드 대상: x86_64-linux<br>ML 모델 버전: moe-v1-246a05b92bec9aa3<br>ML 모델 카드: 2026-07-15 기록; 특징 55; 합성 F1 0.971 / P 0.945 / R 0.999; 실제 F1 0.832 / P 0.753 / R 0.931 / [email protected] 0.938; 제로 재현율 탐지기 2/32; 6-스캐너 차등 분석 불가`; 코퍼스 **mirror** (15,000개 픽스처, 2,431,242바이트); 생성 `2026-08-11T01:29:39Z`; 아티팩트 `mirror-keyhog-simd-nocache-nodaemon-full.json`.
텔레메트리 스키마: `static-recovery-v1`.
| 처리 결과 | 정확한 수 |
|---|---:|
| 지원됨 | 0 |
| 지원되지 않음 | 0 |
| 오류 | 0 |
| 거부 사유 | 정확한 수 |
|---|---:|
| _없음_ | 0 |
<!-- BENCH:recovery:end -->
### 바이그램 블룸 증거
<!-- BENCH:bloom:start -->
증거 스키마: `bloom-evidence-v1`.
| 필드 | 정확한 결과 |
|---|---|
| 코퍼스 | `samsung-creddata-fx-record-spans-v1` |
| 코퍼스 개정 | `f1de3f85dbdf42bf7b3467c0d273a4dfe44d56ee` |
| 코퍼스 SHA-256 | `4f2de506f334521121bb5b4aef8a37bf0b8153a4f9115e7ba9392d0eed1757b9` |
| 픽스처 SHA-256 | `a0ff018dc0a64b2cc78b25999043d1a441afa0087070f4cd8d73ae82408a59b4` |
| 실행 파일 SHA-256 | `2899ee53789bff9c531f72645f6c8380a7c873230dfb2b6857079467bc8d2dcd` |
| 작업 공간 탐지기 코퍼스 SHA-256 | `d87e8b3d086e9ffa4c8a94f35a717ec710d5224e52e5b4fc7e71db30677609c9` |
| 스캐너 탐지기 다이제스트 | `8d789251e092959f` |
| 탐지기 코퍼스 SHA-256 | `3729bd72df768187420f37e08ab64cd2b5a8bac558002d8b0844f465e9a75711` |
| 블룸 거부 | **110/51794 (0.21%)**; 51684 허용 |
| 외부 가용성 | 51794 측정; 선언된 51794 중 0개 명시적으로 사용 불가; 사유: |
| 활성화 vs 우회 발견 | **동일**; 977/977 발견 |
| 발견 ID SHA-256 | `1517bad01ab5228e85b7f4fd44e72226aa3f195bc18a67d58b7a6364b6bf6e0e` / `1517bad01ab5228e85b7f4fd44e72226aa3f195bc18a67d58b7a6364b6bf6e0e` |
| 블룸 밀도/상태 | 1793/65536 슬롯; `healthy`; 39322에서 포화 |
발견 ID는 탐지기, 파일, 줄, 바이트 범위, 자격 증명 SHA-256을 바인딩합니다; 평문 자격 증명은 절대 기록되지 않습니다.
<!-- BENCH:bloom:end -->
재현: `make -C benchmarks canonical KEYHOG_BIN=/absolute/path/to/keyhog`는
정확한 KeyHog, Betterleaks, Kingfisher, Nosey Parker, TruffleHog, Titus
미러 실행 세트를 실행 파일 바인딩된 CredData 블룸 차등 분석을 포함하여
재실행하며, `make -C benchmarks report`는 위 테이블과
`benchmarks/reports/`를 재생성합니다. 코퍼스(mirror, 경쟁사 홈터프,
Samsung/CredData) 및 백엔드/캐시/데몬/OS/GPU 매트릭스는
[`benchmarks/README.md`](https://github.com/santhreal/keyhog/blob/main/benchmarks/README.md)를 참조하세요.
## GPU 지원 대규모 데몬 워커
선택적 Unix 대규모 데몬은 컴파일된 스캐너 하나와 보정된
백엔드 상태를 웜 상태로 유지합니다. 로컬 파일 시스템 스캔은 표준 루트 및
소스 정책 메타데이터만 전송합니다; 데몬은 자체 프로세스에서 파일을 읽고
배치 처리합니다. 클라이언트 측 자격 증명이 필요한 Git, 바이너리, 원격 및
클라우드 소스는 보호된 경계 청크 프레임을 사용합니다.```sh
# Terminal 1
keyhog calibrate-autoroute --policy default
keyhog daemon start --mass
# Terminal 2, after the daemon prints its ready line
keyhog scan --daemon=mass /srv/inventory/team-a \
--format json-envelope --output team-a.json
keyhog daemon stop
--daemon=mass는 필수 경로입니다. 프로세스 내에서 재시도하지 않습니다. 각 배치는 총 입력 크기와 무관하게 8 MiB와 1,024개 청크로 제한됩니다. 모든 인벤토리 파티션에 대해 적용 범위 엔벨로프, 종료 상태, 터미널 실행 영수증을 유지하세요.
데몬 수명 주기, 라우팅 및 영수증 및 인벤토리 파티셔닝을 참조하세요.
시스템 전반 자격 증명 분류```sh
sudo keyhog scan-system --space 50G sudo keyhog scan-system --include-network --output system-findings.json
`scan-system`은 경로가 아닌 총 스캔 바이트 수를 기준으로 범위가 제한되는 로컬 호스트 감사 도구로, 저장소 또는 클라우드 인벤토리 분할을 대체하지 않습니다. `--space`가 상한선이며, `--include-network`를 전달하지 않는 한 네트워크 마운트 파일시스템은 건너뜁니다. 실행 전에 마운트, 네트워크 파일시스템, 공간 상한선, 권한 동작을 검토하세요. [시스템 전체 분류](https://santhreal.github.io/keyhog/guides/system-wide-triage.html)를 참조하세요.
## 민감한 로컬 스캔 잠그기
Linux `--lockdown`은 실패 시 폐쇄되는(fail-closed) 프로세스 보호 모드입니다:```sh
keyhog scan . --daemon=off --lockdown
현재 및 향후 메모리를 잠그고, 코어 덤프와 증분 캐시를 비활성화하며, 프로세스 내에 유지되고, 검증, 평문 출력, 빠른 모드, 완전성을 낮추는 스위치를 거부합니다. 지원되지 않는 플랫폼이나 잠긴 메모리 용량이 부족한 경우 실패합니다. 하드닝 및 데이터 처리를 참조하세요.
KeyHog을 Rust 라이브러리로 사용하기```rust
use keyhog_core::{Chunk, ChunkMetadata, RawMatch}; use keyhog_scanner::CompiledScanner;
let detectors = keyhog_core::load_embedded_detectors_or_fail()?; let scanner = CompiledScanner::compile(detectors)?; let findings = scanner.scan(&Chunk { data: "TOKEN=sk_live_EXAMPLE…".into(), metadata: ChunkMetadata::default(), })?; let report_safe: Vec<_> = findings.iter().map(RawMatch::to_redacted).collect();
기본 라이브러리 메서드는 결정적(deterministic) 휴대용 CPU 참조 구현입니다. 명시적
백엔드 메서드는 프로세스를 종료하거나 다른 엔진으로 조용히 대체하는 대신 타입화된 오류를 반환합니다.
원시 청크와 매치에는 평문이 포함될 수 있습니다. JSON, 로그, 디스크 또는 네트워크 경계를 넘기기 전에
`RawMatch::to_redacted`로 변환하거나 최종 `VerifiedFinding` 값을 사용하세요.
[아키텍처 가이드](https://github.com/santhreal/keyhog/blob/main/docs/src/architecture.md)는 크레이트 소유권, 백엔드 계약, 복구 영수증,
소스 헬퍼, 안전한 보고 경계를 정의합니다. 크레이트 수준의 Rust 문서가 전체 API를 담당합니다.
## 명시적 우선순위로 정책 구성
저장소 정책은 `.keyhog.toml`에 있습니다:```toml
verify = false
[scan]
severity = "high"
incremental = true
[system]
gpu = "auto"
해석 순서는 내장 기본값, 사용자 구성, 저장소 구성, 문서화된 환경 변수, 그리고 명시적 CLI 재정의 순입니다. 알 수 없는 키와 잘못된 조합은 스캔 전에 실패합니다. 프록시 자격 증명을 노출하지 않고 해석된 정책을 확인하려면 keyhog config --effective를 실행하세요. expires 이후의 항목은 스캔 전에 허용 목록 로드에 실패합니다.
모든 키에 대한 자세한 내용은 구성 및 우선순위를, 자격 증명 및 런타임 입력에 대한 내용은 환경 변수를 참조하세요.
아키텍처
KeyHog는 오케스트레이션을 엣지에 유지하고 도메인 동작을 라이브러리에 둡니다:```text sources -> scanner -> suppression/evidence -> reporting -> optional verifier CLI and Action own process, transport, and exit semantics.
Detector 정의는 `detectors/` 아래의 데이터로 유지됩니다. `keyhog-core`는
detector 및 finding 유형을 소유하고, `keyhog-scanner`는 매칭 및 실행
백엔드를 소유하며, `keyhog-sources`는 입력 수집을 소유하고, `keyhog-verifier`는 실시간
검사를 소유하며, `keyhog-cli`는 운영자 워크플로를 소유합니다.
저장소 맵, 의존성 방향, bytes-to-finding 파이프라인, 라우팅 소유권 및
프로파일링 진입점은 [아키텍처 가이드](https://github.com/santhreal/keyhog/blob/main/docs/src/architecture.md)에서 시작하세요.
## 설치 검사 및 확장```sh
keyhog detectors --search aws --verbose
keyhog explain aws-access-key
keyhog backend --autoroute --json
keyhog completion zsh
CLI 참조에는 모든 명령, 플래그, 생성된 기본값, 종료 상태가 나열되어 있습니다. 정확한 설치 버전에 대해서는 keyhog --help 및 keyhog <command> --help를 사용하세요.
기여
- 새 탐지기?
detectors/에 TOML 파일을 넣고 PR을 열어주세요. 기여자 가이드(CONTRIBUTING.md)에는 스키마와 실제 예제가 있습니다. - 버그 / 누락된 비밀 / 오탐? 수정된 자격 증명 형태와 탐지기 ID를 포함해 이슈를 등록해 주세요. 각 보고서는
crates/scanner/tests/contracts/아래의 영구 테스트 픽스처가 됩니다. - 릴리스 동작? 성공적인
mainCI 실행마다 패치 버전이 증가하고, 변경 로그가 생성되며, 6개 크레이트가 모두 crates.io에 게시됩니다. 정확한 메모가 필요하면changes/아래에 선택적 프래그먼트를 추가하세요. 릴리스 가이드는 자동 트랜잭션과 실패한 업로드 복구를 다룹니다. - KeyHog 자체의 보안 문제? 공개 이슈를 열지 말고 GitHub 비공개 취약점 보고를 사용하세요. 해당 양식을 사용할 수 없으면
[email protected]로 이메일을 보내 주세요. PGP는 필요하지 않습니다.
크레딧
KeyHog는 기존의 비밀 스캐닝 작업을 기반으로 합니다. 다음 프로젝트에서 아이디어를 차용했습니다:
- TruffleHog: 탐지기 범위 및 검증 의미론
- Betterleaks: 토큰 효율성 및 오탐 억제
- Titus: 스캐닝 사용성 및 심각도 보정
이 프로젝트들과 기여자들에게 감사드립니다.
라이선스
라이선스: MIT OR Apache-2.0.
약관: MIT 및 Apache-2.0. 이 이중 라이선스는 코드와 탐지기 TOML 파일을 모두 포함합니다. 상업적 사용, 임베딩, 포크, 호스팅 서비스는 두 라이선스 중 하나에 따라 허용됩니다.
스타 기록
[GitHub 공개 스타 수의 UTC 관측](https://github.com/santhreal/keyhog/blob/main/metrics/stars.json)에서 생성됨. 저장소는 첫 번째 지점과 이후 각 개수 변화를 저장합니다. 같은 날 재실행은 해당 날짜의 지점을 대체하며, 변경되지 않은 개수는 커밋을 만들지 않습니다.