Slopsquatting: AI 환각을 공급망 공격으로

발행: (2026년 3월 5일 오후 03:48 GMT+9)
12 분 소요
원문: Dev.to

Source: Dev.to

AI가 생성한 코드 샘플 중 5개 중 1개는 존재하지 않는 패키지를 추천합니다.
공격자들은 그 가짜 이름들을 npmPyPI에 악성코드를 포함시켜 등록하고 있습니다. 이 현상을 slopsquatting이라고 부르며, 이미 진행 중입니다.

슬롭스쿼팅이란?

  • 타이포스쿼팅은 인간의 철자 오류에 베팅합니다.
  • 슬롭스쿼팅은 AI 환각에 베팅합니다.

이 용어는 파이썬 소프트웨어 재단의 보안 개발자‑인‑레지던스인 Seth Larson이 특정 공격을 설명하기 위해 만들었습니다:

LLM이 지속적으로 만들어내는 패키지 이름을 등록한 뒤, 개발자들이 AI의 권고에 따라 이를 설치하도록 기다립니다.

Evidence

연구범위주요 결과
USENIX Security 202516개 언어 모델에 걸친 576 000개의 코드 샘플• 약 20 %의 샘플이 최소 하나의 존재하지 않는 패키지를 권장합니다.
• 환각은 세 가지 범주로 나뉩니다:
 - 51 % 순수 허구(실제 근거 없음).
 - 38 % 실제 패키지를 혼합한 경우(예: express-mongoose).
 - 13 % 정식 이름의 오타 변형.
Consistency반복 질의(10×)• **43 %**의 환각된 이름이 매번 나타났습니다.
• **58 %**는 두 번 이상 나타났습니다.

Implication: 공격자는 LLM이 어떤 이름을 만들어낼지 추측할 필요가 없습니다. 동일한 질문을 몇 번 반복해 환상적인 이름들을 수집하고, 이를 등록하면 됩니다.

기존 방어가 실패하는 이유

  • 전통적인 타이포스쿼팅은 crossenv와 같은 이름을 등록하여 누군가 cross‑env를 오타낼 것을 기대합니다.
  • 레지스트리 방어는 인기 있는 이름과 너무 유사한 새로운 이름을 표시합니다.
  • 환상적인 이름은 이를 완전히 우회합니다 – 실제 패키지가 없기 때문에 어떤 필터도 예상하지 못하는 새로운 문자열입니다.

Source:

실제 사례

패키지생태계결과
huggingface-cliPyPI빈 자리표시자(악성 코드 없음)로 등록됨. 3개월 만에 개발자(또는 AI 도구)들이 pip install huggingface-cli를 실행하면서 30 000+ 건의 자연 다운로드를 기록함.
unused-importsnpm악성으로 확인됨; 여전히 ≈ 233 다운로드/주(2026년 초) 발생. 정식 패키지는 eslint-plugin-unused-imports.
react-codeshiftnpmjscodeshiftreact-codemod가 결합된 형태. LLM이 생성한 에이전트‑스킬 파일에 GitHub에 커밋된 채로 나타났으며, 인간이 직접 삽입한 것이 아님. 자동 코드 생성 과정을 통해 전파됨.

페이로드는 일반적으로 설치 후 스크립트 형태이며, API 키, 클라우드 토큰, SSH 키 등을 탈취한다. 최신 변종은 npm의 URL 기반 의존성 기능을 이용해 설치 시 악성 코드를 가져오게 하여 package.json은 깨끗해 보이게 만든다.

생태계 간 연관성: 환상적인 파이썬 패키지 이름 중 **8.7 %**가 실제 자바스크립트 패키지로 존재한다는 조사 결과가 있다. 공격자는 동일한 가짜 이름을 npm과 PyPI 양쪽에 동시에 등록함으로써 하나의 조작된 이름만으로 두 생태계의 트래픽을 모두 가로챌 수 있다.

방어책 – 오늘 효과적인 방법

1. 의존성 고정

# npm / yarn / pnpm
npm ci          # uses package-lock.json, fails if lockfile is out‑of‑date

# poetry (Python)
poetry lock

Lockfile은 정확한 버전과 체크섬을 고정하므로, 같은 이름을 가진 악성 패키지가 나중에 나오더라도 기존 설치에 영향을 주지 않습니다.

2. 설치 전에 검증하기

  • npm: npm info <package> – 발행자, 생성 날짜, 주간 다운로드 수를 보여줍니다.
  • PyPI: https://pypi.org/project/<package>/ 를 탐색 – 최근 생성 날짜가 없거나, README가 없고, 버전이 하나뿐이며, GitHub 링크가 없으면 경고 신호가 됩니다.
  • 라이브러리 공식 문서와 이름을 교차 확인합니다.

3. 스캐닝 래퍼 사용

Aikido SafeChain (오픈소스)는 설치 명령을 가로채고 패키지를 위협 인텔리전스 피드와 대조합니다.

curl -fsSL https://github.com/AikidoSec/safe-chain/releases/latest/download/install-safe-chain.sh | sh
# 터미널을 재시작한 뒤 npm/pip/yarn을 정상적으로 사용하면 SafeChain이 자동으로 가로챕니다
npm install some-package

무료이며 API 토큰이 필요 없고, 설치당 몇 초만 추가됩니다.

4. 자율 에이전트를 샌드박스에서 실행

  • AI 코딩 에이전트가 임시 컨테이너 또는 VM 안에서 패키지를 설치하도록 합니다.
  • 일회성 Docker 컨테이너 안의 악성 post‑install 스크립트는 호스트 자격 증명을 유출할 수 없습니다.
  • 최소한 에이전트 권한을 제한해 npm install을 명시적 승인 없이 실행하지 못하도록 합니다.

5. 신뢰할 수 없는 패키지의 post‑install 스크립트 비활성화

npm install --ignore-scripts   # 모든 라이프사이클 스크립트를 건너뜁니다
# 이후 필요에 따라 신뢰할 수 있는 패키지에 대해서만 스크립트를 수동으로 활성화합니다

가장 흔한 slopsquatting 페이로드 벡터를 차단하지만, 약간의 수동 설정이 필요합니다.

6. CI 게이트 추가

  • Software Composition Analysis (SCA) – 파이프라인에 OWASP Dependency‑Check 혹은 Dep‑Scan 같은 도구를 통합합니다.
  • 모든 빌드에 대해 Software Bills of Materials (SBOM) 를 생성하고 서명합니다; 각 의존성이 감사 가능해집니다.
  • 패키지가 조직에서 승인한 레지스트리에 없다면 빌드가 실패하도록 합니다.

규모가 중요함

AI 코딩 도구가 페어‑프로그래밍 어시스턴트에서 autonomous agents(인간 감독 없이 의존성을 설치하는) 로 진화함에 따라 공격 표면이 크게 확대됩니다. 다음 요소들의 조합이:

  • Consistent hallucinations (높은 재현성),
  • Novel, unfiltered names,
  • Automatic post‑install execution

slopsquatting 공격에 비옥한 환경을 만듭니다.

TL;DR

  1. Lock 의존성.
  2. 설치하기 전에 AI가 제안한 패키지를 Verify 하세요.
  3. SafeChain와 같은 scanning wrapper 를 배포하세요.
  4. Sandbox autonomous agents.
  5. 신뢰할 수 없는 사후 설치 스크립트를 Disable 하세요.
  6. SCA와 SBOM을 사용해 CI gates 를 적용하세요.

이러한 제어들을 계층화함으로써, 악의적이고 AI가 만든 패키지를 무심코 끌어오는 위험을 크게 줄일 수 있습니다.

확장되는 공격 표면

인간 검토 없이 공격 표면이 확대됩니다.
제안을 읽고 문서를 확인하는 개발자는 어느 정도 보호를 받지만, 자동 루프에서 npm install을 실행하는 AI 에이전트는 그렇지 않습니다.

현재 레지스트리 방어책

  • 레지스트리에는 슬롭스쿼팅에 대한 자동 방어가 아직 없습니다.
  • npm의 기존 보호 기능은 인기 패키지와 유사한 이름을 잡아내지만, 환상적인 이름은 실제 이름과 전혀 닮지 않은 경우가 많습니다.
  • 이는 유사성 필터가 예상하지 못하는 새로운 문자열입니다.

피드백 루프 (React‑Codeshift 예시)

  1. LLM이 패키지 이름을 환상합니다.
  2. AI 에이전트가 존재하지 않는 패키지를 import하는 코드를 작성합니다.
  3. 해당 코드는 GitHub에 커밋됩니다.
  4. 다른 LLM이 그 코드를 학습하거나 검색합니다.
  5. 환상이 더 널리 퍼집니다.

각 단계마다:

  • 다운로드 수가 증가하여 패키지가 더 정당해 보입니다.
  • 다음 LLM이 그 패키지를 추천할 가능성이 높아집니다.

누가 위험을 감당하나요?

레지스트리가 따라잡든 못 따라잡든, AI 패키지 제안을 그대로 받아들이는 개발자에게 위험이 전가됩니다.

완화 권고사항

  • 설치하기 전에 확인 any AI‑suggested package:

    npm info <package>
    # or
    curl https://pypi.org/pypi/<package>/json

    존재 여부, 연령, 그리고 배포자를 확인하세요.

  • 자동화된 워크플로에 대해서:

    • SafeChain을 드롭‑인 래퍼로 설치합니다.
    • AI 에이전트가 샌드박스 환경 밖에서 패키지 설치를 수행하도록 절대 허용하지 마세요.
  • 20 % 환각 비율을 기억하세요: 다섯 번 중 한 번은 함정일 수 있습니다.

0 조회
Back to Blog

관련 글

더 보기 »