npm install이 실행되기 전에 typosquatting 공격을 감지하는 방법
Source: Dev.to
소개
지난 주에 Sapo라는 사전 설치 보안 스캐너를 공개했습니다. 오늘은 가장 흔한 공격 중 하나인 타이포스쿼팅을 어떻게 탐지하는지 보여드리겠습니다.
타이포스쿼팅이란?
공격자는 인기 있는 패키지 이름과 비슷한 이름으로 패키지를 등록합니다. 예시:
lodahs→lodash대신axois→axios대신reacct→react대신expresss→express대신
이러한 가짜 패키지는 실제 패키지를 의존하도록 만들어(그래서 모두 정상적으로 동작하는 것처럼 보임) 악성 코드를 포함해 자격 증명을 탈취합니다.
탐지 로직
1. 유사도 검사
Sapo는 레벤슈타인 거리(Levenshtein distance)를 사용해 요청된 패키지 이름이 알려진 인기 패키지와 얼마나 “가까운지” 계산합니다:
fn levenshtein_distance(a: &str, b: &str) -> usize {
// Returns the number of single‑character edits needed
// to transform string a into string b
}
거리가 1~2 문자이면 해당 이름을 의심스러운 것으로 간주합니다.
2. 흔한 오타 패턴
Sapo는 실제 사람이 저지르는 패턴을 찾습니다:
- 문자 전치:
axois→axios - 문자 누락:
expres→express - 문자 중복:
expresss→express - 인접 키보드 키:
reacy→react
3. 인기 비교
핵심 인사이트는 다운로드 비율 불일치입니다:
- 대상 패키지: 47 다운로드
- 유사한 인기 패키지: 4천만+ 다운로드
- 최근 생성일
이러한 격차는 악성 패키지를 강력히 시사합니다.
실행 예시
$ npm install lodahs
[>] Scanning: lodahs@1.0.0
[!] BLOCKED: Typosquatting detected
Similar to: lodash
- lodash: 337,000,000 downloads
- lodahs: 47 downloads
- Levenshtein distance: 1
Installation cancelled.
실제 lodash는 3억 3천 7백만 다운로드를 기록하고 있지만, 가짜 lodahs는 겨우 47건에 불과합니다—명백한 위험 신호입니다.
Sapo 작동 방식
Sapo는 npm이 다운로드를 시작하기 전에 명령을 가로챕니다:
You type: npm install lodahs
↓
Sapo intercepts
↓
API check: is "lodahs" safe?
↓
Response: TYPOSQUATTING DETECTED
↓
Installation blocked
↓
npm never runs
당신의 머신은 깨끗하게 유지됩니다.
설치 방법
curl -fsSL https://sapo.salta.world/install.sh | bash
터미널을 재시작한 뒤, 다음을 시도해 보세요:
npm install lodahs
설치가 진행되기 전에 경고가 표시됩니다.
향후 작업
- 머신러닝 기반 이상 탐지
- 샌드박스 분석
- VS Code 확장 프로그램
다음에 탐지하고 싶은 것이 있다면 댓글로 알려 주세요!
링크
- GitHub: https://github.com/Salta1414/sapo-cli
- Website: https://sapo.salta.world