Slopsquatting: AI 환각을 공급망 공격으로
Source: Dev.to
AI가 생성한 코드 샘플 중 5개 중 1개는 존재하지 않는 패키지를 추천합니다.
공격자들은 그 가짜 이름들을 npm과 PyPI에 악성코드를 포함시켜 등록하고 있습니다. 이 현상을 slopsquatting이라고 부르며, 이미 진행 중입니다.
슬롭스쿼팅이란?
- 타이포스쿼팅은 인간의 철자 오류에 베팅합니다.
- 슬롭스쿼팅은 AI 환각에 베팅합니다.
이 용어는 파이썬 소프트웨어 재단의 보안 개발자‑인‑레지던스인 Seth Larson이 특정 공격을 설명하기 위해 만들었습니다:
LLM이 지속적으로 만들어내는 패키지 이름을 등록한 뒤, 개발자들이 AI의 권고에 따라 이를 설치하도록 기다립니다.
Evidence
| 연구 | 범위 | 주요 결과 |
|---|---|---|
| USENIX Security 2025 | 16개 언어 모델에 걸친 576 000개의 코드 샘플 | • 약 20 %의 샘플이 최소 하나의 존재하지 않는 패키지를 권장합니다. • 환각은 세 가지 범주로 나뉩니다: - 51 % 순수 허구(실제 근거 없음). - 38 % 실제 패키지를 혼합한 경우(예: express-mongoose).- 13 % 정식 이름의 오타 변형. |
| Consistency | 반복 질의(10×) | • **43 %**의 환각된 이름이 매번 나타났습니다. • **58 %**는 두 번 이상 나타났습니다. |
Implication: 공격자는 LLM이 어떤 이름을 만들어낼지 추측할 필요가 없습니다. 동일한 질문을 몇 번 반복해 환상적인 이름들을 수집하고, 이를 등록하면 됩니다.
기존 방어가 실패하는 이유
- 전통적인 타이포스쿼팅은
crossenv와 같은 이름을 등록하여 누군가cross‑env를 오타낼 것을 기대합니다. - 레지스트리 방어는 인기 있는 이름과 너무 유사한 새로운 이름을 표시합니다.
- 환상적인 이름은 이를 완전히 우회합니다 – 실제 패키지가 없기 때문에 어떤 필터도 예상하지 못하는 새로운 문자열입니다.
Source: …
실제 사례
| 패키지 | 생태계 | 결과 |
|---|---|---|
huggingface-cli | PyPI | 빈 자리표시자(악성 코드 없음)로 등록됨. 3개월 만에 개발자(또는 AI 도구)들이 pip install huggingface-cli를 실행하면서 30 000+ 건의 자연 다운로드를 기록함. |
unused-imports | npm | 악성으로 확인됨; 여전히 ≈ 233 다운로드/주(2026년 초) 발생. 정식 패키지는 eslint-plugin-unused-imports. |
react-codeshift | npm | jscodeshift와 react-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
- Lock 의존성.
- 설치하기 전에 AI가 제안한 패키지를 Verify 하세요.
- SafeChain와 같은 scanning wrapper 를 배포하세요.
- Sandbox autonomous agents.
- 신뢰할 수 없는 사후 설치 스크립트를 Disable 하세요.
- SCA와 SBOM을 사용해 CI gates 를 적용하세요.
이러한 제어들을 계층화함으로써, 악의적이고 AI가 만든 패키지를 무심코 끌어오는 위험을 크게 줄일 수 있습니다.
확장되는 공격 표면
인간 검토 없이 공격 표면이 확대됩니다.
제안을 읽고 문서를 확인하는 개발자는 어느 정도 보호를 받지만, 자동 루프에서npm install을 실행하는 AI 에이전트는 그렇지 않습니다.
현재 레지스트리 방어책
- 레지스트리에는 슬롭스쿼팅에 대한 자동 방어가 아직 없습니다.
- npm의 기존 보호 기능은 인기 패키지와 유사한 이름을 잡아내지만, 환상적인 이름은 실제 이름과 전혀 닮지 않은 경우가 많습니다.
- 이는 유사성 필터가 예상하지 못하는 새로운 문자열입니다.
피드백 루프 (React‑Codeshift 예시)
- LLM이 패키지 이름을 환상합니다.
- AI 에이전트가 존재하지 않는 패키지를 import하는 코드를 작성합니다.
- 해당 코드는 GitHub에 커밋됩니다.
- 다른 LLM이 그 코드를 학습하거나 검색합니다.
- 환상이 더 널리 퍼집니다.
각 단계마다:
- 다운로드 수가 증가하여 패키지가 더 정당해 보입니다.
- 다음 LLM이 그 패키지를 추천할 가능성이 높아집니다.
누가 위험을 감당하나요?
레지스트리가 따라잡든 못 따라잡든, AI 패키지 제안을 그대로 받아들이는 개발자에게 위험이 전가됩니다.
완화 권고사항
-
설치하기 전에 확인 any AI‑suggested package:
npm info <package> # or curl https://pypi.org/pypi/<package>/json존재 여부, 연령, 그리고 배포자를 확인하세요.
-
자동화된 워크플로에 대해서:
- SafeChain을 드롭‑인 래퍼로 설치합니다.
- AI 에이전트가 샌드박스 환경 밖에서 패키지 설치를 수행하도록 절대 허용하지 마세요.
-
20 % 환각 비율을 기억하세요: 다섯 번 중 한 번은 함정일 수 있습니다.