insight/cicd-supply-chain

GWS로 우리 회사 AX 하는 법 무료 배포

CICD 공급망 공격, 우리 회사 파이프라인은 안전한가요?

인사이트

2026.05.20

오픈소스 라이브러리 한 줄을 가져다 썼을 뿐인데, 우리 회사 클라우드 자격 증명이 외부로 새어 나가는 일이 가능할까요?

지난 2026년 3월, Python 패키지 저장소 PyPI에서 실제로 그런 일이 일어났습니다. litellm이라는 라이브러리에 악성 코드가 포함된 버전이 배포됐고, 이 패키지를 설치한 환경의 환경 변수와 API 토큰까지 빨려나갈 수 있는 구조였죠.

흥미로운 건 공격이 시작된 곳이 litellm 자체가 아니었다는 점인데요. 공격자는 패키지를 직접 손대지 않았어요. 대신 그 패키지를 배포하던 CI/CD 파이프라인을 먼저 침해해서, 정식 경로로 악성 버전을 올렸습니다.

이번 글에서는 litellm 사건이 어떤 구조로 일어났는지 짚어보고, 우리 회사 CI/CD를 같은 패턴으로부터 지키기 위해 인프라 관점에서 무엇을 점검해야 하는지 정리해 드릴게요!


PyPI litellm 사건, 무슨 일이 있었나요?

2026년 3월 24일, PyPI에서 배포되던 litellm 패키지에 악성 코드가 포함된 버전이 발견됐습니다.

litellm은 OpenAI·Anthropic·Gemini 같은 여러 LLM API를 하나의 인터페이스로 호출할 수 있게 해주는 Python 라이브러리예요. 요즘 AI 기능을 백엔드에 붙이는 회사라면 한 번쯤 만져보는 패키지인 만큼, 영향 범위가 크다는 점에서 큰 주목을 받았습니다.

이 사건에서 주목할 점은 패키지 코드 자체에 취약점이 있던 게 아니라, litellm을 PyPI에 올리던 배포 파이프라인이 먼저 침해됐다는 점입니다.

좀 더 정확히 풀어보면 이런 순서로 일어났습니다.

  1. 컨테이너 이미지 취약점 스캔 도구인 Trivy GitHub Action이 먼저 침해
  2. 이 Action을 사용하던 CI/CD 환경에서 실행되는 코드가 변조
  3. 파이프라인에 저장돼 있던 자격 증명 노출
  4. 공격자가 PyPI 배포 권한 확보
  5. 정식 채널로 악성 litellm 버전 업로드
즉, 공격자는 litellm 코드를 직접 건드릴 필요가 없었어요. 빌드·배포 자동화의 가장 앞단인 외부 Action 한 개를 흔드는 것만으로, 신뢰받는 패키지의 채널까지 그대로 타고 들어왔습니다.
 
[참고] Trivy 도구가 어떤 경로로 침해됐는지가 궁금하시다면?

공격은 어떤 경로로 이뤄졌나요?

 
이번 공격이 가능했던 이유는 CI/CD 환경에 클라우드·패키지·컨테이너 권한을 가진 토큰들이 평소부터 환경 변수로 함께 묶여 있기 때문입니다. 배포를 자동화하려면 파이프라인이 패키지 저장소·클라우드·컨테이너 레지스트리에 자유롭게 드나들 수 있어야 합니다. 그러다 보니 GitHub Actions 같은 CI/CD 환경에는 보통 다음과 같은 토큰들이 환경 변수로 묶여 있어요.
  • GITHUB_TOKEN: GitHub 저장소 접근 및 워크플로 자동화에 사용
  • PYPI_API_TOKEN: PyPI에 Python 패키지를 업로드·업데이트할 때 사용
  • AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY: AWS 리소스 접근·관리에 사용하는 클라우드 인증 정보
  • DOCKER_TOKEN: 컨테이너 이미지 업로드·다운로드용 레지스트리 인증 토큰

이 중 하나만 노출돼도 공격자는 노출된 토큰으로 우리 회사 패키지를 임의로 재배포할 수도 있고, 컨테이너 이미지를 갈아끼우거나, 클라우드 리소스에 접근해 데이터를 빼낼 수도 있습니다.

이번 litellm 사건도 정확히 이 순서를 밟았습니다. 침해된 Trivy Action이 빌드 환경에서 실행되는 동안 파이프라인에 부여돼 있던 PyPI 배포 권한이 공격자에게 넘어갔고, 그 권한으로 정식 PyPI 채널에 악성 버전이 올라간 거예요.

litellm 패키지를 배포하던 GitHub Actions 파이프라인이 Trivy Action 침해로 CI/CD 자격증명을 노출하고 PyPI에 악성 버전을 업로드해 사용자 환경까지 영향이 퍼지는 공급망 공격 흐름 다이어그램

악성 버전 안에는 환경 변수와 인증 정보를 수집해 외부로 전송하는 코드가 포함돼 있었습니다. 패키지는 설치되는 시점에 코드가 실행될 수 있기 때문에, 이걸 설치한 다른 회사·다른 CI/CD 환경의  자격 증명까지 위험에 노출됐던 거죠.

왜 이런 공급망 공격이 가능했을까요?

요즘 공급망 공격은 개발과 배포 과정 전체를 하나의 연결된 신뢰 체인(Trust Chain)으로 보고, 그중 가장 약한 연결을 노려 침투하는 구조로 행해집니다.

현대 소프트웨어 개발 환경을 떠올려볼게요. 우리 회사 개발팀은 외부 오픈소스 라이브러리를 패키지 매니저로 가져다 쓰고, CI/CD 파이프라인이 빌드·테스트·배포를 자동으로 하고, 각 단계 사이에 외부 SaaS와 클라우드 API가 연동돼 있을 거예요. 이 구조가 업무 생산성을 높여주긴 하지만 외부 의존이 늘어난다는 의미이기도 합니다.

특히 GitHub Actions처럼 서드파티 Action을 적극적으로 가져다 쓰는 환경은 이 위험을 더 키웁니다. Action은 본질적으로 외부에서 만든 코드를 우리 회사 빌드 환경 안에서 실행하는 구조니까요. 평소엔 편리하지만, 그 Action 하나가 변조되는 순간 우리 회사 파이프라인의 자격 증명·소스코드·빌드 결과물이 동시에 위험해질 수 있습니다.

GitHub Actions 배포 파이프라인의 CI/CD Secrets(GITHUB_TOKEN, PYPI_API_TOKEN 등)가 러너 환경 변수로 주입되는 구조와, 공격자가 ENV 접근으로 Secret을 탈취하는 경로를 시각화한 다이어그램

이번 litellm 사건이 단적인 예시예요. 공격자는 litellm 코드를 직접 손대지 않았고, 그 패키지를 배포하던 파이프라인의 의존 도구(Trivy Action) 하나만 공격했습니다. 그게 자격 증명을 노출시키고, 자격 증명이 패키지 배포 권한을 열고, 그 권한이 다시 수많은 후속 환경으로 공격 영향을 퍼뜨렸습니다.

그래서 공급망 공격 방어는 애플리케이션 보안만으로는 부족합니다. 개발 파이프라인 자체를 하나의 보안 영역으로 보고, 그 안의 자격 증명·외부 코드·권한 부여 범위를 다시 들여다봐야 해요.

우리 회사 CI/CD를 지키는 3가지 방법

우리 회사 CI/CD를 보다 안전하게 운영하려면 무엇부터 손대야 할까요? 당장 적용할 수 있고 효과가 큰 3가지를 정리했습니다.


1) 외부 Action은 커밋 해시로 고정하세요!


GitHub Actions에서 외부 Action을 가져다 쓸 때 @main이나 @latest 같은 변동 태그를 그대로 쓰는 경우가 많습니다. 편하긴 한데, 해당 Action 코드가 외부에서 바뀌는 순간 우리 회사 파이프라인이 실행하는 코드도 같이 바뀐다는 의미예요. 이번 Trivy Action 침해처럼, 어느 날 평소처럼 빌드를 돌렸을 뿐인데 변조된 코드가 그대로 실행될 수 있는 구조죠.
 
권장하지 않는 방식
- uses: aquasecurity/trivy-action@main
 
대신 특정 커밋 해시나 정확한 버전을 지정해 두면, 외부에서 코드가 바뀌어도 우리 회사 빌드는 그 시점의 검증된 코드만 실행합니다.
 
권장 방식(커밋 해시 고정)
- uses: aquasecurity/trivy-action@<commit-hash>
 
자주 쓰는 Action부터 점진적으로 해시 고정으로 전환하고, 업데이트가 필요할 땐 한 번씩 사람이 변경 사항을 확인한 뒤 해시를 갱신하는 방식이 안전합니다.
 

 

2) 자격 증명은 최소 권한만 부여하세요!


CI/CD 환경의 토큰은 결국 어딘가에서 새어 나갈 수 있다는 전제로 권한을 설계하는 게 좋습니다. "혹시" 모를 노출 시점에 공격자가 할 수 있는 일의 범위를 자격 증명 자체에서 좁혀두자는 거예요.
 


예를 들어 AWS 리소스 접근용 Access Key라면, 모든 작업을 허용하는 광범위한 권한 대신 다음처럼 좁혀서 부여할 수 있습니다.


  • 배포 대상 특정 S3 버킷에만 접근
  • 배포 대상 특정 ECR 리포지토리에만 push
  • 운영 중인 특정 서비스의 배포 작업만 허용
 
이렇게 권한 범위를 좁혀두면, 자격 증명이 노출되더라도 공격자가 실제로 끌어갈 수 있는 데이터나 손댈 수 있는 리소스가 한정됩니다. 같은 원칙을 GitHub·PyPI·Docker 토큰에도 적용해서, 토큰별로 "이 토큰은 정확히 어떤 작업을 위해 만들었는가"를 한 줄로 답할 수 있어야 해요.
 

 

3) 장기 Access Key 대신 OIDC 임시 인증을 도입하세요!

가능하다면 장기 Access Key를 쓰는 구조 자체에서 벗어나는 게 가장 근본적입니다. 토큰이 환경 변수로 오래 머무는 한, 노출되거나 탈취당할 가능성은 0이 아니거든요.
 


AWS는 GitHub Actions와 연동해서 OIDC(OpenID Connect) 기반 인증을 쓸 수 있습니다. CI/CD 파이프라인이 실행되는 그 순간에만 일시적인 토큰이 발급되고, 작업이 끝나면 사라지는 방식이에요. 평소엔 저장된 자격 증명이 아예 없으니, "토큰이 새어나간다"는 시나리오 자체를 줄일 수 있습니다.
 


Google Cloud나 다른 클라우드도 비슷한 임시 인증 연동을 지원하니, 우리 회사 환경에 맞는 OIDC 연동을 우선순위 높게 검토해 보세요.
 
 

 

우리 회사 파이프라인, 지금 안전한가요?

 
위 3가지 원칙을 우리 회사 환경에 비춰 빠르게 점검해 볼 수 있는 질문 5개를 정리했습니다. 이번 주에 한 번씩 답해 보세요!
  1. 외부 GitHub Action을 @main · @latest 같은 변동 태그로 사용 중인 워크플로가 있나요?
  2. CI/CD에 저장된 토큰들이 각각 어떤 권한 범위를 가지고 있는지 한 줄로 답할 수 있나요?
  3. AWS·GCP 등 클라우드 자격 증명을 장기 Access Key 형태로 환경 변수에 보관하고 있나요?
  4. 사용 중인 서드파티 Action 목록과 각 버전을 누가 마지막으로 점검했는지 추적할 수 있나요?
  5. 만약 CI/CD 토큰 중 하나가 외부로 노출됐다면, 어떤 리소스가 위험에 들어가는지 시나리오로 정리돼 있나요?


다섯 가지 중 명확히 "예"라고 답하기 어려운 항목이 있다면, 거기서부터 손대시면 됩니다. 한 번에 전부 바꾸기 어려운 영역인 만큼, 외부 Action 버전 고정 → 토큰 권한 점검 → OIDC 단계 도입 순서로 점진적으로 가져가는 것을 권장드려요.


 
[참고] CI/CD 환경을 코드로 관리하고 변경 이력을 함께 추적하고 싶다면?

 
공급망 공격은 더 이상 보안팀만의 문제가 아닙니다. 우리 회사가 어떤 외부 도구를 신뢰하고 있는지, 그 신뢰가 어디까지 권한으로 연결돼 있는지를 인프라·DevOps·보안이 함께 들여다봐야 막을 수 있는 영역입니다.
 


파이브클라우드는 컨테이너 빌드부터 클라우드 인프라 운영까지 라이프사이클 전반의 보안 구조를 함께 설계해 드리고 있어요. CI/CD 파이프라인 점검부터 OIDC 기반 인증 전환, 최소 권한 설계까지, 우리 회사 환경에 맞는 진단이 필요하시다면 언제든 파이브클라우드로 문의해 주세요.

우리 회사도 IT 고민
쉽고 빠르게 해결하고 싶다면?
파이브클라우드를 만나보세요!

무료 상담 신청

더 많은 콘텐츠를
확인해 보세요

닫기

개인정보 수집, 이용 동의서

패스트파이브(주)에서는 개인정보 보호를 위하여 개인정보 보호지침을 마련하고 이를 준수하고 있습니다.

1. 개인 정보의 수집 · 이용 목적
서비스 제공을 위한 본인 확인, 예약사항 전달 및 상담, 각종 혜택 안내
2. 수집하는 개인정보의 항목
회사명, 담당자 성함, 담당자 연락처, 업무 이메일
3. 개인정보의 보유 · 이용 기간
수집일로부터 5년
닫기

마케팅 활용 동의서

패스트파이브(주)에서는 개인정보 보호를 위하여 개인정보 보호지침을 마련하고 이를 준수하고 있습니다.

1. 개인 정보의 수집 · 이용 목적
파이브클라우드 상품, 혜택 안내 및 패스트파이브의 다양한 상품, 서비스 관련 광고성 정보 발송
2. 수집하는 개인정보의 항목
회사명, 담당자 성함, 담당자 연락처, 업무 이메일
3. 개인정보의 보유 · 이용 기간
수집일로부터 5년
닫기