npm install이 실행되기 전에 typosquatting 공격을 감지하는 방법

발행: (2026년 1월 13일 오전 08:09 GMT+9)
4 min read
원문: Dev.to

Source: Dev.to

소개

지난 주에 Sapo라는 사전 설치 보안 스캐너를 공개했습니다. 오늘은 가장 흔한 공격 중 하나인 타이포스쿼팅을 어떻게 탐지하는지 보여드리겠습니다.

타이포스쿼팅이란?

공격자는 인기 있는 패키지 이름과 비슷한 이름으로 패키지를 등록합니다. 예시:

  • lodahslodash 대신
  • axoisaxios 대신
  • reacctreact 대신
  • expresssexpress 대신

이러한 가짜 패키지는 실제 패키지를 의존하도록 만들어(그래서 모두 정상적으로 동작하는 것처럼 보임) 악성 코드를 포함해 자격 증명을 탈취합니다.

탐지 로직

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는 실제 사람이 저지르는 패턴을 찾습니다:

  • 문자 전치: axoisaxios
  • 문자 누락: expresexpress
  • 문자 중복: expresssexpress
  • 인접 키보드 키: reacyreact

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 확장 프로그램

다음에 탐지하고 싶은 것이 있다면 댓글로 알려 주세요!

링크

Back to Blog

관련 글

더 보기 »

의존성 롤러코스터: NPM 테마 파크 탐색

모든 것을 시작하게 만든 “아하!” 순간 새로운 기능을 구현하고 있었는데, 마치 코드 마법사 🧙‍♂️가 된 기분이었다. PR을 제출했더니, 내 TL이 댓글을 달았다.