Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/paultendo/confusable-vision
OSINT (Open Source Intelligence)ReconnaissanceWeb SecurityThreat IntelligenceSupply Chain SecurityPapers & ResearchLearning & EducationCurated Resources
GitHubpaultendo/confusable-vision

confusable-vision

Unicode TR39에서 누락된 793개의 혼동 쌍, 세계 최초의 교차 스크립트 데이터셋, 230개 폰트와 22,000개 이상의 문자에 걸친 폰트 인식 SSIM 점수

저장소 보기
1156개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

confusable-vision

벡터 아웃라인 레이캐스팅을 사용한 경험적 글리프 유사도 점수 산정. 245개 시스템 폰트에서 유니코드 혼동 가능 문자 쌍을 렌더링하고, 폰트 아웃라인에서 직접 구조적 유사성을 측정(래스터화 없음)하며, 폰트별 연속 거리 점수가 포함된 점수 JSON 아티팩트를 생성합니다.

22,581개 문자와 12개 문자 체계에 걸쳐 5,260만 개의 단일 문자 비교 및 1억 9,000만 개의 다중 문자 비교에서 얻은 주요 결과:

  • 249,976개의 고유 단일 문자 혼동 가능 쌍 (245개 폰트, 12개 스크립트, 66개 교차 스크립트 쌍). 764,395개의 총 폰트 수준 발견.
  • 2,524,275개의 고유 다중 문자(바이그램) 혼동 가능 쌍 (95개 폰트에서 rn/m 포함, 33개 폰트가 거리 0.40 미만; 16개 폰트에서 oy/키릴 uk 포함).
  • 폰트별 연속 거리 점수 (이진 목록이 아님). 각 쌍에는 폰트별 측정된 레이 거리가 있어, 다운스트림 보안 도구에 폰트 인식 신뢰도를 제공합니다.
  • SDF보다 305% 더 많은 발견, 29% 더 빠름. 강화된 5계층 레이 시그니처는 SDF 발견의 엄격한 상위 집합입니다. SDF 전용 쌍은 수동 검토에서 재현되지 않았습니다.

출력은 namespace-guard에 직접 입력되어 패키지 이름, 도메인 이름 및 식별자에서 런타임 혼동 가능 탐지를 수행합니다.

작동 방식

RaySpace는 36개 각도에서 폰트 아웃라인을 통해 평행 레이를 투사하고, 글리프당 5개 계층의 정보(교차 횟수, 교차 위치, 교차 각도, 핑 거리(각 교차점에서 획 너비), 핑 최대(교차 사이 카운터 너비))를 캡처합니다. 이는 문자당, 폰트당 컴팩트 시그니처를 생성합니다. 두 시그니처는 5개 계층 모두에 걸쳐 가중 L1 거리로 비교됩니다.

3단계 필터 캐스케이드로 완전 탐색을 실현 가능하게 만듦:

  1. 전진 폭 필터(15% 허용 오차): 문자 폭이 다른 쌍을 제거. 후보의 63% 제거.
  2. 레이 비교(임계값 2.0, 대규모 스크립트 쌍은 1.0으로 강화): 추가 33% 제거.
  3. 후보의 3.3%만이 발견으로 생존.

시그니처 뱅크(245개 폰트에서 294,646개 이상 항목; --include-uppercase 사용 시 더 많음)는 한 번 사전 계산됩니다. 그런 다음 발견은 뱅크에 대한 단일 스레드 산술로 실행되어, 작업자 스레드나 GPU 없이 31분 만에 52.6백만 쌍 비교를 완료합니다.

빠른 시작

root@kitploit:~
npm install

# 1. 레이 시그니처 뱅크 구축 (사전 조건, ~24분)
npx tsx scripts/build-signature-bank.ts

# 1b. 대문자 라틴 A-Z 포함 (선택 사항)
#     기본적으로 뱅크는 IDNA PVALID 코드포인트(소문자, 숫자, 기호)만 포함합니다.
#     --include-uppercase를 사용하여 대문자 A-Z를 추가하십시오. 이는 폰트 식별 및
#     대문자 글리프 모양이 중요한 상표 시각 비교에 유용합니다. 빌더는 재개 가능하므로
#     추가 코드포인트만 계산합니다.
npx tsx scripts/build-signature-bank.ts --include-uppercase

# 1c. 임의 코드포인트 범위 포함 (선택 사항)
npx tsx scripts/build-signature-bank.ts --extra-range=0041-005A

# 2. 단일 문자 발견 (22,581 문자, 12개 스크립트, ~36분)
npx tsx scripts/discover-singlechar-sdf.ts --scorer=ray

# 3. 다중 문자 (바이그램) 발견 (676 바이그램, ~63분)
npx tsx scripts/discover-multichar-sdf.ts --scorer=ray

# 4. 알려진 TR39 다중 문자 혼동 가능 점수 산정 (~5분)
npx tsx scripts/score-multichar-sdf.ts --scorer=ray
레거시 SSIM 파이프라인

원래 SSIM 기반 파이프라인은 230개 폰트에 걸쳐 2,650만 비교를 수행했습니다. 여전히 작동하지만, 모든 발견 및 점수 산정 작업에서 RaySpace로 대체되었습니다.

root@kitploit:~
# TR39 혼동 가능 쌍 점수 산정
npx tsx scripts/build-index.ts          # 렌더 인덱스 (~160초, 11,370 PNG)
npx tsx scripts/score-all-pairs.ts      # 모든 쌍 점수 산정 (~65초, 235K 비교)

# 새로운 혼동 가능 발견
npx tsx scripts/build-candidates.ts          # 후보 세트 (~23K 문자)
npx tsx scripts/build-index.ts --candidates  # 후보 렌더링 (~40분, 89K PNG)
npx tsx scripts/score-candidates.ts          # 라틴 대상에 대한 점수 산정 (~15분, 2.9M 비교)

# 두 파이프라인에서 높은 점수 발견 추출
npx tsx scripts/extract-discoveries.ts

발견된 내용

주요 혼동 가능 쌍 (단일 문자, 평균 거리 < 0.10)

"제로" = 아웃라인이 비트 단위로 동일한 레이 시그니처(거리 0.000)를 생성하는 폰트. 라틴 w와 키릴 ԝ는 두 글리프를 모두 포함하는 19개 폰트 모두에서 동일합니다.

교차 스크립트 돌파구 (단일 문자)

조지아 문자 Coda(U+10FF)는 라틴 o, 키릴 o, 그리스 오미크론과 함께 모두 거리 0.08 미만의 4방향 혼동 가능 고리를 형성합니다.

다중 문자 주요 결과

oy/키릴 uk 발견은 뛰어난 새로운 발견입니다. 라틴 바이그램 "oy"는 Helvetica에서 거리 0.000, Arial Unicode MS에서 0.0005로 키릴 이중자 문자 uk(ѹ)와 시각적으로 동일합니다.

임계값 보정

평균 임계값단일 문자 고유 쌍

세 가지 권장 운영 계층:

  • 엄격 (< 0.50): 138개의 단일 문자 쌍, 오탐률 거의 0. 오탐에 실제 비용이 발생하는 자동 차단(IDN 등록, 패키지 이름 검증)에 적합.
  • 표준 (< 1.00): 4,174개의 단일 문자 쌍, 적용 범위와 정밀도의 좋은 균형. 보안 도구에서 플래그 지정 및 수동 검토에 적합.
  • 탐색 (< 2.00): 전체 발견 세트. 상한에서는 잡음이 포함되지만, 연구, 폰트 감사 및 훈련 세트 구축에 유용.

폰트 쿼리

특정 폰트에 대해 존재하는 혼동 가능 쌍을 쿼리합니다. 새로운 서체를 출시하는 폰트 디자이너, 시스템 폰트 변경을 평가하는 브라우저 공급업체, 또는 IDN 도메인과 같은 보안에 민감한 컨텍스트에서 디스플레이 폰트를 선택하는 사람에게 유용합니다.

root@kitploit:~
npx tsx scripts/query-font.ts --list-fonts                    # 발견 데이터의 218개 폰트
npx tsx scripts/query-font.ts "Arial"                         # Arial의 모든 쌍 (SSIM >= 0.7)
npx tsx scripts/query-font.ts "Arial" --threshold 0.8         # 높은 신뢰도만
npx tsx scripts/query-font.ts "Arial" --compare "Georgia"     # SSIM 델타로 두 폰트 비교
npx tsx scripts/query-font.ts "Arial" --json                  # 다운스트림 처리를 위한 JSON

폰트 이름 매칭은 대소문자를 구분하지 않는 부분 문자열이므로 "arial"은 Arial, Arial Black 및 Arial Unicode MS와 일치합니다. 비교 모드는 가장 큰 SSIM 차이순으로 정렬하여, 폰트를 전환할 때 어떤 쌍이 더 좋아지거나 나빠지는지 정확히 표시합니다.

점수 산정 파이프라인의 발견 파일 필요(gitignore 처리됨, 로컬에서 재생성).

출력

커밋됨 (CC-BY-4.0)

생성됨 (gitignore 처리됨, 파이프라인 실행하여 재생성)

파일설명
data/output/render-index/렌더 PNG + 인덱스 (SSIM 파이프라인)
data/output/singlechar-sdf-scores.jsonl

진행 상황

  • TR39 검증 (1,418쌍, 230개 폰트, SSIM 파이프라인)
  • 새로운 혼동 가능 발견 (23,317개 후보에서 793개의 높은 점수 쌍, SSIM)
  • 교차 스크립트 혼동 가능 스캔 (12개 ICANN 스크립트, 2,360만 쌍, 563개 발견, SSIM)
  • 폰트별 쿼리 및 폰트 비교
  • RaySpace 5계층 벡터 아웃라인 스코어러 (발견을 위해 SDF 및 SSIM 대체)
  • 단일 문자 RaySpace 발견 (249,976개의 고유 쌍, 245개 폰트, 12개 스크립트)
  • 다중 문자 RaySpace 발견 (2,524,275개의 고유 바이그램 쌍, 245개 폰트)
  • RaySpace를 사용한 교차 스크립트 발견 (SDF보다 305% 더 많은 쌍, 엄격한 상위 집합)
  • 쌍별 분포 기록(평균, p50, p90, 폰트 수, 제로 거리 수, 제로 비율, 권장 계층(엄격/표준/탐색))이 포함된 confusable-weights-v2.json 생성. RaySpace 거리가 SSIM을 대체. 표준 임계값에서 4,174쌍.
  • 이진 시그니처 뱅크 형식 (273초 로드 시간을 초 단위로 단축)
  • 전체 파이프라인 재실행 없이 경로별로 임의 폰트 점수 산정

관련 항목

  • namespace-guard (v0.16.0+)는 confusable-weights.json을 소비하여 confusableDistance({ weights })를 통해 측정된 시각적 위험 점수를 제공합니다.
  • REPORT.md: SSIM 파이프라인의 전체 기술 보고서 (12개 섹션, 폰트별 분석, 부록)

블로그 게시물

paultendo.github.io에서 이 프로젝트의 발견 사항과 방법론을 다루는 글:

RaySpace 방법론 및 발견:

  • RaySpace: 벡터 아웃라인 레이캐스팅을 통한 글리프 유사도 측정
  • CT 스캐너에서 혼동 가능 문자까지: RaySpace 이전 기술
  • 다중 문자 혼동 가능: rn이 m이 될 때
  • 250,000개의 혼동 가능 쌍. 도메인 이름에 중요한 102개.

SSIM 파이프라인 발견:

  • 230개 폰트에 걸쳐 1,418개의 유니코드 혼동 가능 쌍을 렌더링했습니다. 대부분이 눈에 혼동되지 않습니다.
  • 793개의 유니코드 문자가 라틴 문자처럼 보이지만 아직 confusables.txt에 없습니다
  • 28개의 CJK 및 한글 문자가 라틴 문자처럼 보입니다
  • 어떤 표준도 다루지 않는 248개의 교차 스크립트 혼동 가능 쌍
  • 148배 더 빠름: 교차 스크립트 규모를 위한 유니코드 스캔 파이프라인 재구축
  • 형상 유사성이 거짓말할 때: 혼동 가능 탐지의 크기 비율 아티팩트
  • 새로운 DDoS: 유니코드 혼동 가능은 LLM을 속일 수 없지만, API 요금을 5배로 늘릴 수 있습니다

배경

이 프로젝트의 동기가 된 더 넓은 문제 공간을 다루는 글:

  • 유니코드 식자 스푸핑을 위한 위협 모델
  • 유니코드 위험을 측정 가능하게 만들기
  • 당신의 LLM은 유니코드 코드포인트를 읽지, 글리프를 읽지 않습니다. 이것이 공격 표면입니다.
  • 혼동 가능 탐지가 실제로 누구를 보호합니까?
  • 유니코드는 하나의 혼동 가능 맵을 제공합니다. 두 개가 필요합니다.
  • confusables.txt와 NFKC가 31개 문자에 대해 불일치합니다

라이센스

  • 코드 (src/, scripts/): MIT
  • 생성된 데이터 (data/output/): CC-BY-4.0. 상업적 사용을 포함한 모든 목적에 자유롭게 사용, 공유, 적응 가능하며 저작자 표시 필요.
  • 저작자 표시: Paul Wood FRSA (@paultendo), confusable-vision
도구 다운로드
소스대상스크립트평균폰트제로
w U+0077ԝ U+051D라틴-키릴0.0001919
j U+006Aϳ U+03F3라틴-그리스0.0132118
i U+0069і U+0456라틴-키릴0.0186250
s U+0073ѕ U+0455라틴-키릴0.0186246
c U+0063с U+0441라틴-키릴0.0196145
o U+006Fо U+043E라틴-키릴0.0206144
j U+006Aј U+0458라틴-키릴0.0216048
x U+0078х U+0445라틴-키릴0.0235950
p U+0070р U+0440라틴-키릴0.0246146
e U+0065е U+0435라틴-키릴0.0326144
a U+0061а U+0430라틴-키릴0.0426145
소스대상스크립트평균폰트
ο U+03BFჿ U+10FF그리스-조지아0.0572
ヘ U+30D8へ U+3078가타카나-히라가나0.12211
丶 U+4E36ヽ U+30FD한자-가타카나0.1259
二 U+4E8Cニ U+30CB한자-가타카나0.24911
口 U+53E3ロ U+30ED한자-가타카나0.26811
바이그램대상평균폰트비고
ll॥ U+0965 (데바나가리 이중 단다)0.1768교차 스크립트
oyѹ U+0479 (키릴 uk)0.32216새로운 교차 스크립트 바이그램 혼동 가능
rnm U+006D0.5319533개 폰트가 0.40 미만
blы U+044B (키릴 yeru)0.79749교차 스크립트
다중 문자 고유 쌍
< 0.5013813
< 1.004,1741,631
< 1.5059,700(잡음)
< 2.00249,9762,524,275
파일설명
data/output/confusable-discoveries.json높은 SSIM (>= 0.7) 또는 픽셀 동일한 110개 TR39 쌍
data/output/candidate-discoveries.jsonTR39에 없는 793개의 새로운 쌍, 평균 SSIM >= 0.7
data/output/confusable-weights.jsonnamespace-guard 통합을 위한 1,397개의 가중치 간선
data/output/cross-script-discoveries.json563개의 교차 스크립트 혼동 가능 쌍
data/output/cross-script-summary.json스크립트 쌍별 교차 스크립트 요약
data/output/multichar-discoveries.json다중 문자 혼동 가능 발견
단일 문자 RaySpace 점수
data/output/multichar-rayspace-scores.jsonl다중 문자 RaySpace 점수
data/output/signature-bank/레이 시그니처 뱅크 (294,646개 항목, 7.9GB 압축)