AI VIDEO BRIEFING

파이썬 공급망 공격 방어법 — uv로 패키지 보안 지키는 3가지 설정

TanStack 웜과 슬롭스쿼팅 등 공급망 공격이 PyPI로 번지는 지금, pip 대신 uv로 바꾸고 버전 고정·신규 패키지 격리·잠금 동기화 3가지 설정으로 파이썬 프로젝트를 지키는 실전 가이드.

'pip install'은 곧 임의 코드 실행이다: 공급망 공격에서 파이썬 프로젝트를 지키는 3가지 설정 영상 대표 이미지

핵심 메시지

  • 패키지를 import하는 것은 내 컴퓨터에서 임의의 스크립트를 실행하는 것과 같으며, 신뢰할 수 없는 출처라면 사실상 러시안룰렛이다.
  • npm의 Axios·TanStack 웜이 자가 전파해 PyPI의 Mistral AI 패키지까지 번졌고, 3월에는 lightLLM도 당했다. 공격이 파이썬 생태계로 확산 중이다.
  • '슬롭스쿼팅'은 공격자가 진짜와 비슷한 이름의 가짜 패키지를 올리고, AI 에이전트가 그 이름을 환각으로 코드에 끌어들이게 만드는 새로운 수법이다.
  • 방어책은 pip 대신 uv로 전환하고 pyproject.toml에 add-bounds=exact(정확한 버전 고정)와 exclude-newer(예: 7일 신규 격리)를 설정하는 것이다.
  • CI/CD와 로컬에서 'uv sync --locked'로 잠금 파일과의 불일치를 에러로 잡고, 에이전트에게는 함부로 의존성을 추가하지 말라고 지시하라.

쉽게 이해하기

영상은 최근 급증한 소프트웨어 공급망 공격을 다룬다. npm이나 pip(PyPI)에서 외부 패키지를 받을 때, 유지보수자가 피싱당하거나 CI 토큰이 탈취되거나 이름이 살짝 다른 악성 패키지가 올라오는 식으로 악성코드가 섞여 들어온다. 일단 설치되면 SSH 키·환경변수·API 키 등 손에 닿는 모든 정보를 긁어 공격자 서버로 보낸다. 발표자는 패키지 import가 사실상 임의 코드 실행과 같다는 점을 강조한다.

실제 사례로 npm의 Axios와 TanStack 공격이 언급된다. 발표자는 TanStack이 뚫린 날 아침 그 패키지를 쓰는 사내 대시보드 작업을 하다 약 20분 차이로 공격을 비껴갔다고 말한다. TanStack 사건은 파일시스템을 뒤져 CI/CD 토큰을 찾아 다른 패키지로 스스로 퍼지는 '웜'이었고, 이 때문에 PyPI의 Mistral AI 패키지까지 감염됐다. 올해 3월에는 lightLLM도 당했다.

더 무서운 다음 단계는 '슬롭스쿼팅(slop squatting)'이다. 공격자가 원본과 이름이 비슷한 패키지를 일부러 올려두면, AI 코딩 에이전트가 존재하지 않는 패키지명을 환각해 프로젝트에 끌어들이고 그대로 감염된다. 게다가 공격자는 Claude Code나 Gemini 같은 에이전트 자체를 노려, 에이전트로 하여금 자격증명을 긁고 크롤링하게 만들 수도 있다. 수년간 'pip install 20개 먼저'로 시작하던 습관적 신뢰가 위험의 근원이라는 지적이다.

방어 1단계는 pip 직접 사용을 멈추고 업계 표준이 되어가는 uv로 전환하는 것이다. uv는 requirements.txt 대신 pyproject.toml을 쓴다. tool.uv 설정에 'add-bounds = exact'를 넣으면 기본의 '이상 버전 허용' 대신 정확한 버전으로 고정(==)된다. 가장 중요한 두 번째 설정은 'exclude-newer'로, 예컨대 7일로 두면 그보다 최근에 올라온 패키지는 받지 않는다. 패키지가 감염되면 보통 24시간 안에 발견·수정·삭제되므로, 며칠의 쿨다운이 직접적 취약점 대부분을 피하게 해준다. 발표자는 100일로 설정하면 훨씬 오래된 버전이 설치되는 것을 보여주며 직접 실험해 볼 것을 권한다.

세 번째는 CI/CD와 로컬에서 'uv sync --locked'를 쓰는 것이다. uv는 작업할 때마다 잠금 파일(ground truth 스냅샷)을 만드는데, --locked 옵션을 주면 pyproject와 잠금 파일이 어긋날 때 그냥 설치하지 않고 에러를 낸다. 누군가(또는 공격자·에이전트)가 임의 버전을 끼워넣으면 동기화 불일치로 막힌다. 마지막 보너스 팁으로, agents.md나 CLAUDE.md에 '묻지 않고 새 의존성을 추가하지 말라'는 규칙을 넣어, 모든 의존성이 제 값을 하도록 만들고 작은 기능은 라이브러리 대신 직접 구현해 코드를 소유하라고 제안한다.

주요 인사이트

  • 패키지 import = 임의 코드 실행. 출처를 온전히 믿을 수 없다면 내 시스템으로 러시안룰렛을 하는 셈이다.
  • 공급망 공격은 npm을 넘어 PyPI로 번지고 있고, 웜은 CI 토큰을 훔쳐 다른 패키지로 자가 전파한다.
  • 슬롭스쿼팅 — AI 에이전트가 가짜 유사 패키지명을 환각해 끌어오는 신종 위협에 대비해야 한다.
  • uv의 add-bounds=exact로 버전을 고정하고, exclude-newer로 며칠간 신규 패키지를 격리하면 직접적 취약점 대부분을 피할 수 있다.
  • 'uv sync --locked'로 잠금 불일치를 에러로 잡고, agents.md/CLAUDE.md에 '의존성은 물어보고 추가'라는 규칙을 명시하라.

자주 묻는 질문

왜 패키지 설치가 위험한가요?

외부 패키지를 import하는 것은 내 컴퓨터에서 그 코드를 그대로 실행하는 것과 같습니다. 출처가 감염되면 SSH 키·환경변수·API 키 등이 통째로 탈취돼 공격자에게 전송될 수 있습니다.

슬롭스쿼팅(slop squatting)이 무엇인가요?

공격자가 원본과 이름이 살짝 다른 가짜 패키지를 일부러 올려두고, AI 코딩 에이전트가 존재하지 않는 패키지명을 환각해 그 가짜를 프로젝트에 설치하게 유도하는 수법입니다.

uv에서 어떤 설정으로 보호하나요?

pyproject.toml의 tool.uv에 add-bounds=exact(정확한 버전 고정)와 exclude-newer(예: 7일, 최근 패키지 격리)를 넣고, CI/CD·로컬에서 'uv sync --locked'로 잠금 파일 불일치를 에러로 막습니다.

AI 에이전트에는 어떤 대비가 필요한가요?

agents.md나 CLAUDE.md에 '묻지 않고 새 의존성을 추가하지 말라'는 규칙을 명시하고, 작은 기능은 라이브러리를 통째로 가져오기보다 직접 구현해 코드를 소유하는 편이 안전합니다.

원문과 출처

이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.

YouTube 원본 영상 보기 ↗

관련 AI 소식

#공급망공격#파이썬보안#uv#패키지관리#AI에이전트