타이포스쿼팅(Typosquatting)은 사용자의 오타나 유사 이름을 이용해 악성 패키지·도메인을 등록하는 공격이다. 패키지 관리자(npm, PyPI)와 도메인 등록 모두에서 발생한다.
패키지 타이포스쿼팅 기법
| 기법 | 원본 | 타이포스쿼팅 예시 |
|---|
| 문자 치환 | react | re4ct, react1 |
| 문자 추가 | lodash | lod4sh, lodaash |
| 순서 바꿈 | express | expres, expresss |
| 하이픈 추가 | readline | read-line |
| 유사 철자 | urllib3 | urlib3, urliib3 |
| 인기 패키지 모방 | colors | colour5 |
실제 사례
npm 타이포스쿼팅 사례:
- "crossenv" (→ cross-env 모방): 환경변수 도용
- "event-stream" 공급망 공격: 정상 패키지 인수 후 악성 코드 삽입
- "ua-parser-js": 인수 후 크립토마이너 삽입 (2021)
- "node-ipc": 우크라이나 IP에 파일 삭제 코드 삽입 (2022)
PyPI 사례:
- "python-dateutil" vs "python-dateutils" (악성)
- "Pytorch-nightly" 공급망 공격 (2022, Facebook)
탐지 방법
python
# 편집 거리(Edit Distance)로 유사 패키지 탐지
from Levenshtein import distance
known_packages = ['react', 'lodash', 'express', 'axios']
def detect_typosquatting(package_name: str, threshold: int = 2):
suspicious = []
for known in known_packages:
dist = distance(package_name.lower(), known.lower())
if 0 < dist <= threshold:
suspicious.append({
'input': package_name,
'similar_to': known,
'edit_distance': dist
})
return suspicious
# 예: detect_typosquatting("reacts") → [{similar_to: "react", dist: 1}]
방어 전략
조직 방어:
1. 화이트리스트 기반 패키지 레지스트리
(승인된 패키지만 설치 가능)
2. 패키지 서명 검증 (npm audit, pip-audit)
3. SBOM(소프트웨어 부품 목록) 관리
4. CI/CD에 패키지 검증 단계 추가
개인 방어:
1. 패키지 이름 복사-붙여넣기 (직접 타이핑 금지)
2. 설치 전 저장소 페이지 확인 (다운로드 수, 관리자)
3. postinstall 스크립트 실행 차단
(npm --ignore-scripts install)
4. Socket.dev, Snyk 등 공급망 보안 도구 사용
관련 문서