보안 가이드

LiteLLM 1.107.0에 자격 증명 탈취 악성코드 포함(2026년 10월): 영향받은 PyPI 릴리스와 Docker 이미지, 사용자가 해야 할 일

2026년 10월 21일 PyPI와 Docker의 LiteLLM 1.107.0에 자격 증명 탈취 악성코드가 포함되었습니다. BerriAI 발표 기준: 영향받은 버전과 태그, 시간대, 이번 침해와 무관한 버전, 교체해야 할 키.

게시 2026-10-22 업데이트 2026-10-24 최종 확인 2026-10-24 19분 읽기
이 페이지에서

대상: LiteLLM을 사용하는 개발자와 운영자. LiteLLM은 여러 LLM(대규모 언어 모델) API를 하나의 인터페이스로 호출하는 오픈소스 도구이며, Python 라이브러리로 쓰거나 Docker에서 실행하는 프록시(LLM 게이트웨이)로 씁니다.

이 글은 LiteLLM을 개발한 BerriAI의 공식 공지와 회사가 GitHub에 올린 상태 업데이트를 바탕으로 합니다. 공격 기법, 악성코드의 내용, 구체적인 침해 지표(IoC) 값은 다루지 않습니다. 파일 이름과 이미지 다이제스트는 회사의 공지 페이지에서 확인하세요.

진행 중: 조직이 추가 정보를 공개하는 대로 이 글을 갱신합니다

2026년 10월 24일 11:00 UTC(일본 시간 20:00) 기준

아직 알려지지 않음

  • 재발 방지를 위한 변경 사항(회사는 다음 주에 공유하겠다고 밝힘)
  • 영향받은 사용자 또는 환경의 수
  • 탈취된 데이터가 악용되었는지 여부

10월 23일(UTC) 회사는 공격 경로 조사를 마쳤다며 근본 원인 분석을 공개했습니다. 조사 중에 올린 상태 업데이트의 일부 가정은 "부정확하거나 불완전"했으며, 이 분석이 기준 문서라고 밝혔습니다. 첫 사고 게시물은 원래 형태로 남겨 두었습니다.

사용자가 해야 할 일(영향받은 버전과 시간대, 정리, 교체할 키)은 첫 게시물 이후 달라지지 않았습니다. 10월 24일(UTC) 회사는 1.103.8, 1.104.6, 1.105.4, 1.106.3을 공개했고, PyPI의 최신 버전은 이제 1.106.3입니다. 이 릴리스부터 Docker 이미지와 Helm 차트에 서명하는 cosign 키가 바뀌었습니다(아래 3단계).

오늘 LiteLLM 사용자가 해야 할 일

1단계는 모든 사용자에게 해당합니다. 이후 단계는 영향받은 버전이나 이미지를 설치했거나 실행한 환경에 대한 회사의 안내를 따릅니다.

1

영향 여부 확인: 설치 시점과 사용한 태그

회사가 밝힌 영향받은 아티팩트는 다음과 같습니다. 모든 시각은 2026년 10월 21일입니다.

채널영향받은 대상시간대(UTC)
PyPIlitellm==1.107.0(휠 7개 전부)11:39~13:23
Docker Hubv1.107.0, latest, main-latest, main-stable11:46~14:20
GHCR(GitHub의 컨테이너 레지스트리)같은 태그 4개(litellm, litellm-database, litellm-non_root)11:46부터 늦어도 13:51에 내려갈 때까지

회사는 해당 시간대에 버전을 고정하지 않고 pip로 LiteLLM을 설치했거나, 해당 시간대에 이 태그 중 하나로 컨테이너를 시작했다면 영향을 받은 것이라고 밝혔습니다. CI가 빌드할 때마다 pip install litellm을 실행하거나 Dockerfile이 latest 태그를 FROM으로 빌드한다면, 아무도 조작하지 않아도 영향받은 버전이 설치되었을 수 있습니다.

  • 영향받았을 가능성이 있는 환경에서는 버전을 확인하려고 Python이나 pip를 실행하지 마세요. 먼저 격리한 뒤, 별도의 깨끗한 기기에서 배포 기록이나 이미지 다이제스트를 확인하세요. 노출 가능성을 배제할 수 없으면 영향받은 것으로 취급하고 아래의 재구축과 자격 증명 교체로 진행하세요(이 사이트의 참고). 회사의 버전 확인 명령도 Python을 시작하므로 정리 전에는 실행하지 마세요
  • 회사는 찾아야 할 파일 이름과 이미지 다이제스트를 공개했습니다. 발견되면 노출이 확인되지만, 발견되지 않았다고 해서 환경이 깨끗하다는 증거는 아닙니다
  • 1.106.2 이하 또는 1.107.0rc1, rc2를 명시적으로 고정해 두었다면 영향을 받지 않습니다(회사는 이전 버전이 이번 침해와 무관하다고 밝혔습니다)
  • 비공개 엔터프라이즈 레지스트리에서 받은 고객은 영향을 받지 않았습니다(회사)
2

설치되었다면: 그 환경에서 pip install부터 시작하지 마세요

회사 공지에 인용된 제보자의 분석에 따르면 악성코드는 Python이 시작될 때마다 자동으로 로드되는 파일로 설치됩니다. litellm을 import하지 않는 프로세스나 pip 자체를 포함해 모든 Python 프로세스에서 다시 실행됩니다.

회사가 제시한 정리 순서는 다음과 같습니다(파일 이름과 위치는 공지 페이지에 있습니다).

  • Python을 시작하지 않고, 쉘에서 영향받은 모든 site-packages 디렉터리의 악성 파일(회사가 명시한 파일과 캐시 파일)을 삭제합니다
  • 백그라운드에 남아 있는 Python 프로세스를 중지합니다
  • 그런 다음에만 litellm==1.106.2로 고정해 다시 설치합니다. 회사는 이미지와 가상 환경을 처음부터 다시 만드는 편이 더 낫다고 밝혔습니다

컨테이너로 실행했다면, 영향받은 이미지로 만든 컨테이너를 중지하고 깨끗한 버전으로 고정한 이미지로 다시 만드는 것이 대개 가장 빠릅니다(이 사이트의 참고).

3

버전을 고정하고 새 서명 키로 검증하세요

회사는 첫 게시물에서 1.106.2 또는 이번 사고 이전에 공개된 명시적 버전으로 고정하라고 요청했습니다. 이후 10월 24일(UTC)에 1.103.8, 1.104.6, 1.105.4, 1.106.3을 공개했습니다. PyPI의 최신 버전은 1.106.3이며, 1.107.0은 계속 삭제된 상태입니다. 릴리스 노트에 따르면 이 버전들은 SDK, 프록시, Docker 이미지가 신뢰하는 모든 인증서 번들에서 eMudhra 루트 인증 기관을 제거합니다. eMudhra 문제는 eMudhra 중간 CA 키와 관련해 Python 사용자가 해야 할 일에서 다룹니다.

Docker에서는 latest나 main-stable처럼 내용이 바뀌는 태그가 아니라 버전 태그, 더 좋게는 다이제스트(이미지 내용으로 계산한 값)로 이미지를 참조하세요. 그러면 태그가 가리키는 대상이 바뀌어도 영향을 받지 않습니다.

릴리스 노트에 따르면 10월 24일 릴리스부터 Docker 이미지와 Helm 차트는 새 cosign 키로 서명되며(cosign은 컨테이너 이미지에 서명하고 검증하는 도구), 이전 키로 검증하면 실패합니다. 서명을 확인하는 cosign verify 스크립트, CI 점검, Kubernetes 정책(Kyverno 등)에 이전 cosign.pub을 고정해 두었다면 릴리스 노트에 명시된 커밋의 새 키로 교체하세요. 릴리스 노트에는 새 키의 SHA-256도 나와 있으므로, 교체하기 전에 내려받은 키와 비교하세요(이 사이트의 참고).

4

키 교체: 그 환경이 접근할 수 있던 모든 것

회사는 1.107.0이 외부 인터넷에 접속할 수 있는 호스트에 한 번이라도 설치되었다면 탈취된 데이터가 성공적으로 외부로 전송되었다고 가정하라고 밝혔습니다. 특히 다음을 언급합니다.

  • 서버나 컨테이너에 연결된 클라우드 역할(AWS 인스턴스나 작업 IAM 역할 등)
  • LiteLLM 프록시 데이터베이스에 저장된 모든 LLM 제공업체 키
  • 프록시 마스터 키와 발급한 모든 가상 키
  • 데이터베이스 연결 문자열(DATABASE_URL)의 비밀번호
  • 호스트에서 실행 중이던 모든 프로세스의 환경에 있던 모든 시크릿

제보자의 분석에서는 악성코드가 SSH 키, Git 및 패키지 게시 자격 증명, Kubernetes 토큰, 브라우저에 저장된 비밀번호, AI 코딩 도우미의 설정도 수집하도록 만들어졌습니다. 개발자 노트북에서 1.107.0을 실행했다면 그 노트북의 자격 증명도 교체해야 합니다.

각 서비스의 대시보드에서 새 키를 발급하고 이전 키를 폐기하세요(이 사이트의 참고: 장애를 피하려면 새 키를 먼저 설정한 뒤 이전 키를 폐기하세요). API 키 취급은 .env 파일과 API 키가 위험한 이유에서 다룹니다.

5

악용 여부 확인: 클라우드 감사 로그와 LLM 사용량

회사는 설치 시점 전후에 인스턴스 역할로 이루어진 신원 확인 호출(GetCallerIdentity)이 있는지 AWS 감사 로그(CloudTrail)에서 확인하고, 이어서 그 역할의 자격 증명이 자체 인프라 외부에서 사용된 적이 있는지 확인하라고 요청합니다.

이 사이트의 참고로, LLM 제공업체의 대시보드에서도 10월 21일 11:39 UTC(일본 시간 저녁) 이후 예상 밖의 사용량이나 요금 증가가 있는지 확인하세요. 탈취된 LLM 키가 사용되면 사용량과 청구에 나타날 수 있습니다. 탈취된 키로 벌어지는 일은 탈취된 API 키가 계정 정지로 이어지는 과정에서 다룹니다.

해당 시간대에 1.107.0을 설치했거나 영향받은 태그를 시작함

침해된 것으로 간주

↓

1. Python을 시작하지 않고 정리

더 나은 방법: 이미지와 가상 환경을 다시 구축

호스트가 외부 인터넷에 접속할 수 있었음

데이터가 외부로 전송되었다고 가정

↓

2. 접근할 수 있던 모든 키 교체

클라우드 역할, 제공업체 키, 마스터 키, 데이터베이스

1.106.2 이하를 명시적으로 고정함

회사는 이전 버전이 이번 침해와 무관하다고 밝힘

↓

3. 고정을 유지하고 새 버전은 서명을 검증

Docker에서는 버전 태그나 다이제스트를 사용. 10월 24일 릴리스부터 새 cosign 키

BerriAI의 공지를 바탕으로 한 경우별 조치와 순서. 파일 이름과 다이제스트는 회사의 공지 페이지에 있습니다.

LiteLLM 프록시를 운영하는 경우

프록시 데이터베이스에는 연결한 모든 LLM 제공업체의 키가 들어 있습니다. 제보자의 분석에서는 DATABASE_URL이 설정되어 있으면 악성코드가 제공업체 키와 모델 설정이 담긴 테이블을 읽도록 만들어졌습니다. 프록시가 1.107.0으로 시작되었다면 등록된 모든 제공업체 키를 교체할 계획을 세우고, 시작하기 전에 목록을 만드세요. 배포한 가상 키도 다시 발급해야 하므로, 사용자에게 보낼 안내문을 미리 준비하면 혼란을 줄일 수 있습니다.

무슨 일이 있었나(BerriAI 발표 기준)

아래 내용은 BerriAI의 블로그 글 "Contained: Oct 21, 2026 LiteLLM release v1.107.0 Compromised"(2026년 10월 21일 게시, 같은 날 20:30 UTC 갱신), 10월 23일 근본 원인 분석 "The attack chain behind the v1.107.0 LiteLLM release", 그리고 보안 책임자가 GitHub 이슈에 올린 상태 업데이트를 바탕으로 합니다. 별도 표기가 없으면 모든 시각은 10월 21일 UTC입니다. 공격자가 사용한 주소나 이름 같은 침해 지표 값은 싣지 않습니다.

  1. 5월 27일

    내부 에이전트 플랫폼의 마스터 키가 들어 있는 설정 파일이 공개 저장소에 실수로 커밋됩니다. 커밋은 곧 덮어썼지만 마스터 키는 폐기되지 않았습니다(근본 원인 분석).
  2. 10월 10일

    공격자가 마스터 키로 플랫폼 API를 호출해 그곳에 설정된 조직 소유자의 GitHub CLI 토큰을 얻습니다. 약 45분 뒤 공격자는 그 토큰으로 회사 저장소에서 CI를 실행해 CI 시크릿을 빼내고 다른 메인테이너 두 명의 토큰을 확보합니다(근본 원인 분석).
  3. 10월 12일

    공격자는 소유자의 토큰으로 여러 비공개 저장소에서 CI를 실행해 두 번째로 시크릿을 빼냅니다. CI 테스트에 쓰인, 민감도가 낮은 시크릿과 자금이 거의 없는 LLM 제공업체 키였습니다. 회사는 이 시크릿들이 오염된 아티팩트에 이르는 경로에 관여하지 않았다고 밝혔으며, 관련 토큰을 교체하고 보안 로그를 감사했습니다(근본 원인 분석).
  4. 10:08

    브랜치 보호가 비공개 릴리스 워크플로의 변경을 거부합니다. 5초 뒤 권한 있는 개발자 계정에 연결된 자격 증명으로 보호를 무시하고 변경이 적용됩니다.
  5. 10:46

    변경된 워크플로가 공격자가 통제하는 유사 저장소에서 빌드한 스테이징 실행을 시작합니다.
  6. 11:11

    공격자가 다른 탈취 자격 증명으로 변경된 릴리스의 승인과 게시를 통과시킵니다.
  7. 11:39~11:40

    악성 1.107.0 휠 7개가 PyPI에 업로드됩니다.
  8. 11:46

    같은 릴리스의 Docker 이미지가 게시됩니다.
  9. 12:06

    외부 연구자가 GitHub 이슈로 문제를 보고합니다.
  10. 12:09~12:24

    공격자가 워크플로 변경의 흔적을 지웁니다(근본 원인 분석, 조직 감사 로그에는 기록이 남았습니다).
  11. 13:02

    회사가 사고 대응을 시작합니다(근본 원인 분석).
  12. 13:23까지

    PyPI가 1.107.0을 삭제했습니다.
  13. 14:20

    영향받은 Docker Hub 태그가 모두 삭제되었거나 깨끗한 이미지를 가리키도록 변경되었습니다.
  14. 20:30

    회사가 공격 경로를 파악했다고 판단한다며 공지를 갱신합니다.
  15. 23:37

    회사가 조직 전체의 모든 인증 토큰을 식별해 하나씩 폐기하거나 교체하고 있다고 보고합니다. 레지스트리는 새 릴리스에 대해 잠긴 상태이고 정기 릴리스는 중단된 상태입니다.
  16. 10월 22일 02:19(일본 시간 11:19)

    회사가 지난 업데이트 이후 중대한 진전이 없다고 보고합니다. 레지스트리는 계속 잠겨 있고 정기 릴리스는 중단된 상태입니다. 2시간마다 하던 업데이트를 중대한 진전이 있을 때 하는 방식으로 바꿉니다.
  17. 10월 23일 약 21:00~21:50(일본 시간 10월 24일 약 06:00~06:50)

    약 21:00에 회사가 근본 원인 분석을 공개하며 이전의 일부 가정이 부정확하거나 불완전했다고 밝힙니다. 21:50(일본 시간 06:50)에 첫 게시물을 갱신해 분석을 기준 기록으로 안내합니다.
  18. 10월 24일 약 07:56~09:15(일본 시간 약 16:56~18:15)

    회사가 1.103.8, 1.104.6, 1.105.4, 1.106.3을 PyPI에 공개합니다. 이 버전들은 신뢰하는 번들에서 eMudhra 루트 인증 기관을 제거하고, Docker 이미지와 Helm 차트는 새 cosign 서명 키로 바뀝니다(릴리스 노트).
약 2시간
PyPI에 공개된 시간(11:39~13:23 UTC)
약 2.5시간
Docker Hub 태그가 악성 이미지를 가리킨 시간
1.106.2
회사가 사용자에게 고정하라고 요청한 버전
영향 없음
비공개 엔터프라이즈 레지스트리(회사)
공지 내용(BerriAI 발표 기준)
영향받은 대상
PyPI의 litellm==1.107.0(휠 7개 전부). Docker Hub와 GHCR의 v1.107.0, latest, main-latest, main-stable 태그(GHCR에서는 litellm, litellm-database, litellm-non_root 이미지)
발생한 일
릴리스 파이프라인이 침해되어 악성코드가 담긴 1.107.0이 게시되었습니다. GitHub의 공식 v1.107.0 태그에는 악성 파일이 없으며, 해당 아티팩트는 공격자가 통제하는 유사 저장소에서 빌드되었습니다
악성코드의 동작(공개된 범위)
자격 증명을 탈취하고 원격 코드 실행 도구를 불러오는 컴파일된 악성코드입니다. Python이 시작될 때마다 실행되며 백그라운드에 프로세스를 남깁니다
이번 침해와 무관한 버전
이전 버전은 모두 이번 침해와 무관합니다. 당분간 1.106.2 또는 다른 명시적 버전으로 고정하세요
원인(10월 23일 근본 원인 분석)
공개 저장소에 실수로 커밋되었고 폐기되지 않은 내부 에이전트 플랫폼의 마스터 키가 조직 소유자의 GitHub CLI OAuth 토큰을 얻는 데 쓰였습니다. 그 토큰은 서비스 계정에 연결되지 않았고 범위도 좁혀지지 않았습니다. 공격자는 이를 이용해 CI 시크릿을 빼내고 메인테이너 두 명의 토큰을 확보했습니다. 소유자의 토큰은 브랜치 보호를 해제하고 워크플로를 변경하는 데 쓰였고, 다른 탈취 토큰은 변경된 릴리스를 승인 절차에 통과시키는 데 쓰였습니다
릴리스 승인(근본 원인 분석)
원래 릴리스는 회사 사무실의 물리적 기기에 묶인 특별 계정이 승인해야 했습니다. 그 주 초에 더 잦은 버그 수정 릴리스를 지원하려고 엔지니어 두 명이면 누구든 릴리스를 시작하고 승인할 수 있도록 완화되었습니다
처음 설명에 대한 정정
첫 게시물은 토큰이 내부 LiteLLM 배포 환경의 로그에서 나왔다고 의심했습니다. 분석은 첫 토큰이 다른 서비스에서 나왔다고 밝힙니다
그 밖에 탈취된 자격 증명
다른 여러 내부 시스템의 토큰도 탈취되었고, 공격자의 활동은 주로 업스트림 추론 API 키(LLM 제공업체 키)에 집중되었습니다. 10월 12일에는 여러 비공개 저장소에서 민감도가 낮은 CI 테스트 시크릿과 자금이 거의 없는 제공업체 키가 유출되었고, 회사는 이들이 오염된 아티팩트에 이르는 경로에 관여하지 않았다고 밝혔습니다. 회사는 모든 내부 시스템과 외부 플랫폼의 모든 토큰을 폐기하고 있습니다
회사의 대응
PyPI, Docker Hub, GHCR에서 아티팩트를 삭제했습니다. 관련 토큰을 폐기하고, GitHub 조직을 영향받지 않은 구성원 한 명으로 줄이고, 공개 레지스트리에서 조직으로의 신뢰 연결을 제거했으며, 모든 토큰을 폐기하거나 교체하고 있습니다. 10월 24일(UTC)에 새 서명 키로 1.103.8, 1.104.6, 1.105.4, 1.106.3을 공개했습니다
규모와 악용 여부
공개되지 않음

알려진 것과 알려지지 않은 것

2026년 10월 24일 기준 상태입니다. 후속 발표가 있으면 상태 열을 갱신합니다.

항목공지 내용상태
영향받은 버전(PyPI)litellm==1.107.0, 휠 7개 전부확인됨(회사)
영향받은 이미지와 태그Docker Hub와 GHCR의 v1.107.0, latest, main-latest, main-stable확인됨(회사)
시간대PyPI 11:3913:23 UTC, Docker Hub 11:4614:20 UTC, GHCR은 13:51 UTC까지 내려감확인됨(회사)
릴리스에 포함된 악성코드자격 증명을 탈취하고 원격 코드 실행 도구를 불러옴확인됨(회사)
영향받은 호스트의 자격 증명호스트가 외부로 접속할 수 있었다면 데이터가 외부로 전송되었다고 가정가능성 있음(회사)
이전 버전이번 침해와 무관영향 없음(회사)
비공개 엔터프라이즈 레지스트리영향 없음영향 없음(회사)
GitHub의 공식 소스 태그악성 파일 없음영향 없음(회사)
토큰이 탈취된 경위공개 저장소에 실수로 커밋되고 폐기되지 않은 마스터 키로 내부 에이전트 플랫폼에 저장된 소유자의 토큰을 탈취함(10월 23일 근본 원인 분석)확인됨(회사)
첫 게시물의 "로그에서 유출" 설명분석에서 정정: 첫 토큰은 다른 서비스에서 나옴정정됨(회사)
10월 12일의 두 번째 유출비공개 저장소의 CI 테스트 시크릿과 자금이 거의 없는 제공업체 키. 오염된 아티팩트에 이르는 경로에는 관여하지 않음확인됨(회사)
수정 릴리스와 서명 키10월 24일에 1.103.8, 1.104.6, 1.105.4, 1.106.3 공개. Docker 이미지와 Helm 차트는 새 cosign 키로 서명확인됨(회사)
재발 방지를 위한 변경다음 주에 공유 예정예정됨(회사)
영향받은 사용자 또는 환경의 수공지에 언급 없음언급 없음
탈취된 데이터의 악용공지에 언급 없음언급 없음

읽는 방법: 시간대가 짧았더라도 설치했거나 실행했는지로 판단하세요

이 릴리스는 PyPI에 약 2시간 동안 공개되었지만, CI의 버전 미고정 설치나 자동 재빌드는 그 사이에 받아 갈 수 있습니다. 이 사이트는 수치를 추측하지 않습니다. 영향 여부는 해당 시간대에 1.107.0을 설치했는지, 또는 영향받은 태그를 시작했는지로 판단하세요.

회사의 공지와 분석에는 문제를 발견한 연구자, 독립적으로 조사한 보안 업체, 첫 게시물에 언급된 개발자 도구의 이름이 나옵니다. 이 사이트의 방침에 따라 사고를 공개한 조직만 이름을 밝히고, 나머지는 역할로 표기합니다.

릴리스에 악성코드가 들어 있으면 벌어질 수 있는 일

아래는 일반적인 설명이며 이번 사례에서 이런 일이 있었다는 뜻이 아닙니다. 이번 악성코드에 대해 회사가 공개한 내용은 위의 "무슨 일이 있었나"에 있습니다.

Python 패키지는 설치한 사람의 권한으로 실행됩니다. 서버나 컨테이너에서는 그 호스트의 환경 변수, 파일, 연결된 클라우드 역할에 접근할 수 있습니다. LLM 게이트웨이는 여러 LLM 제공업체의 키를 한곳에 두기 위해 존재하므로, 침해되면 연결된 모든 제공업체의 키가 한꺼번에 위험해집니다.

오타를 노린 가짜 패키지나 오래된 버전의 취약점 악용과 다른 점은, 악성 코드가 공식 채널에서 공식 이름과 버전 번호로 배포되었다는 것입니다. 같은 종류의 사고로는 Trivy 공급망 침해, TanStack과 Nx Console 사고, WordPress 플러그인 Rank Math PRO의 악성코드가 있습니다.

LiteLLM 사용자가 점검할 점: 공개된 사실에서 얻는 교훈

이 절은 회사의 대응을 평가하지 않습니다. 공지와 근본 원인 분석에서, 다음 사고에 대비하려고 사용자가 실행할 수 있는 점을 골랐습니다.

1

내용이 바뀌는 참조를 쓰지 마세요: 버전을 고정하고 다이제스트를 사용하세요

영향받은 환경은 버전을 고정하지 않고 pip로 설치했거나 latest, main-latest, main-stable처럼 내용이 바뀌는 태그를 쓴 환경이었습니다. 1.106.2로 고정하고 Docker 이미지를 다이제스트로 참조한 환경은 해당 시간대에 다시 빌드되었더라도 영향을 받지 않았습니다.

우선 운영 환경과 CI에서 쓰는 의존성을 해시가 포함된 잠금 파일로 고정하세요(pip install --require-hashes, 또는 uv나 Poetry의 잠금 파일). 아주 최근에 공개된 버전을 피하는 설정(지정한 시점 이후에 공개된 것을 무시하는 uv의 exclude-newer 등)도 몇 시간 안에 회수되는 릴리스에 대비하는 데 도움이 됩니다. 접근 방식은 OSV-Scanner로 의존성 점검하기에서 다룹니다.

2

LLM 게이트웨이에 주는 키를 나누고, 교체할 일이 생긴다고 가정하세요

프록시 데이터베이스에는 연결한 모든 제공업체의 키가 들어 있습니다. 지금처럼 교체해야 할 때 어떤 키가 어떤 환경에 속하는지 모르면, 일부를 놓치거나 전부 중단하는 것 중에서 고르게 됩니다.

개발, 테스트, 운영에 서로 다른 제공업체 키를 쓰고 제공업체 쪽에서 지출 한도와 알림을 설정하면 교체 범위가 줄고 악용을 더 빨리 알아챌 수 있습니다. 키가 유출되었을 때 할 일은 AI가 작성한 코드에서 유출된 API 키에서 다룹니다.

3

노출된 키는 커밋을 덮어쓴 뒤에도 폐기하세요

근본 원인 분석에 따르면 출발점은 5월에 공개 저장소에 실수로 커밋된 마스터 키였습니다. 커밋은 곧 덮어썼고 노출된 키를 폐기해야 한다는 점도 파악되었지만, 마스터 키는 폐기되지 않았고 약 4개월 반 뒤에 사용되었습니다. 회사는 이번 사고가 노출되었을 수 있는 키를 교체하지 않는 위험을 잘 보여 주는 사례라고 밝혔습니다.

비밀 정보를 공개 저장소에 올렸다면 기록을 걱정하기 전에 키를 폐기하고 교체하세요. 교체한 뒤에는 교체한 키 목록을 확인해 빠진 것이 없는지 점검하세요(이 사이트의 참고). 이 문제는 유효한 채로 남는 유출된 자격 증명에서 다룹니다.

4

자동화 도구에 소유자의 개인 토큰을 주지 마세요

분석에 따르면 처음 탈취된 토큰은 에이전트 플랫폼이 풀 리퀘스트를 열 수 있도록 설정해 둔 것이었습니다. 서비스 계정에 연결되지 않았고 범위도 좁혀지지 않은, 조직 소유자의 개인 GitHub CLI 토큰이었습니다. 회사는 GitHub CLI 토큰이 2단계 인증을 거쳐 발급되며, 민감한 작업 전에 GitHub가 요구하는 재인증의 적용을 받지 않는다고 지적합니다.

에이전트와 봇에는 그 작업 범위로만 한정한 전용 토큰(GitHub App 또는 세분화된 토큰)을 주고, 소유자 권한은 일상 업무에 쓰는 계정과 분리하세요(이 사이트의 참고). CI 시크릿을 필요한 워크플로와 환경에서만 쓸 수 있게 하면 탈취된 토큰이 미치는 범위도 줄어듭니다(이 사이트의 참고). GitHub 계정 보호는 GitHub 2단계 인증 설정하기에서 다룹니다.

5

게이트웨이의 로그와 관리 인터페이스를 인터넷에 노출하지 마세요

이번 원인은 아닌 것으로 밝혀졌지만, 회사의 첫 게시물은 특정 상황에서 AI 코딩 도우미가 사용자의 GitHub CLI 토큰을 응답 본문에 넣을 수 있고, 응답 본문을 기록하는 곳에서는 이러한 토큰이 LiteLLM 로그에 나타날 수 있다고 언급했습니다.

직접 운영하는 게이트웨이라면 세 가지를 확인하세요. 관리 인터페이스와 API가 인터넷에서 직접 접근되지 않는지, 응답 본문을 남기는 로깅 설정을 검토했는지, 남긴다면 보존 기간이 짧은지입니다. GitHub 계정 보호는 GitHub 2단계 인증 설정하기에서 다룹니다.

출처(공개 자료)

이 글의 사실은 아래의 공개 정보에서 가져왔습니다. 악성코드의 내용, 접속 대상 주소, 구체적인 침해 지표 값은 싣지 않습니다.

  • BerriAI(LiteLLM), "Contained: Oct 21, 2026 LiteLLM release v1.107.0 Compromised"(2026년 10월 21일 게시, 같은 날 20:30 UTC 갱신) — docs.litellm.ai
  • BerriAI(LiteLLM), "The attack chain behind the v1.107.0 LiteLLM release"(근본 원인 분석, 2026년 10월 23일 게시) — docs.litellm.ai
  • BerriAI/litellm GitHub 이슈 #47826(외부 연구자의 보고와 회사의 상태 업데이트, 10월 23일 21:15 UTC 업데이트까지 확인) — github.com
  • litellm의 PyPI 프로젝트 페이지(10월 24일 11:00 UTC에 확인, 최신 버전은 1.106.3이며 1.107.0은 목록에 없음) — pypi.org
  • BerriAI/litellm GitHub 릴리스(2026년 10월 24일 공개된 v1.103.8, v1.104.6, v1.105.4, v1.106.3: 서명 키 변경과 eMudhra 루트 CA 제거) — github.com

업데이트 내역

2026-10-24(11:00 UTC): 회사가 10월 24일(UTC)에 1.103.8, 1.104.6, 1.105.4, 1.106.3을 공개한 사실을 반영해, PyPI의 최신 버전이 아직 1.106.2라는 기존 서술을 대체했습니다. 이 릴리스의 Docker 이미지와 Helm 차트가 새 키로 서명된다는 점(이전 키로는 검증되지 않음)과 eMudhra 루트 CA 제거를 3단계와 FAQ에 추가했습니다. 근본 원인 분석에 나온 10월 12일의 두 번째 유출(회사에 따르면 오염된 아티팩트에 이르는 경로와 무관)을 추가했습니다.

2026-10-24: 회사가 10월 23일에 공개한 근본 원인 분석을 반영했습니다. 토큰이 탈취된 경위를 첫 게시물의 판단(내부 LiteLLM 배포 환경의 로그)에서, 공개 저장소에 실수로 커밋되어 폐기되지 않은 마스터 키, 이어서 내부 에이전트 플랫폼에 저장된 소유자의 토큰, 이어서 CI 시크릿으로 이어지는 경로로 고쳐 썼습니다. 타임라인, FAQ, 표, 사용자용 절을 갱신했습니다. 10월 22일과 23일의 보도는 회사가 이후 정정한 처음의 판단(AI 도구나 게이트웨이의 로그를 통한 토큰 유출)을 설명했습니다. 사용자가 해야 할 일은 달라지지 않았습니다. 침해 지표 값(IP 주소, 이름, 커밋)은 포함하지 않았습니다.

2026-10-22(13:30 JST): 10월 22일 02:19 UTC의 GitHub 업데이트(중대한 진전 없음, 이후 업데이트는 중대한 진전이 있을 때만)를 추가했습니다. 공지는 여전히 20:30 UTC 버전입니다. GHCR에서 영향받은 이미지와 악용 여부 확인 문구를 명확히 했습니다.

2026-10-22: 10월 21일 20:30 UTC에 갱신된 BerriAI의 공지와 같은 날 23:37 UTC의 GitHub 업데이트를 바탕으로 한 첫 버전. 침입 경로나 수치가 공개되면 갱신합니다.

다음 글

최신 속보

FAQ

Q어떤 LiteLLM 버전과 이미지가 영향을 받나요?
A

BerriAI(LiteLLM)에 따르면 영향받은 아티팩트는 PyPI의 litellm==1.107.0(휠 7개 전부, 2026년 10월 21일 11:39~13:23 UTC에 공개됨)과 Docker Hub 및 GHCR의 v1.107.0, latest, main-latest, main-stable 태그입니다. Docker Hub에서는 11:46~14:20 UTC에 이 태그들이 침해된 이미지를 가리켰고, GHCR에서는 13:51 UTC까지 내려갔습니다. 회사는 이전 버전은 이번 침해와 무관하며, 회사의 비공개 엔터프라이즈 레지스트리를 쓰는 고객은 영향을 받지 않았다고 밝혔습니다.

Q영향을 받았는지 어떻게 확인하나요?
A

회사는 해당 시간대에 버전을 고정하지 않고 pip로 LiteLLM을 설치했거나, 해당 시간대에 영향받은 태그로 컨테이너를 시작했다면 영향을 받은 것이라고 밝혔습니다. litellm==1.107.0이 설치된 상태로 Python을 시작한 환경은 모두 침해된 것으로 간주하라고 요청합니다. 영향받았을 가능성이 있는 환경에서는 확인하려고 Python이나 pip를 실행하지 말고 먼저 격리하세요. 별도의 깨끗한 기기에서 배포 기록이나 이미지 다이제스트를 확인합니다. 노출 가능성을 배제할 수 없으면 영향받은 것으로 취급하세요(이 사이트의 참고). 회사는 찾아야 할 파일 이름을 공개했지만, 찾지 못했다고 해서 환경이 깨끗하다는 증거는 아니라고 밝혔습니다.

Q코드에서 litellm을 import하지 않아도 위험한가요?
A

예. 회사 공지에 인용된 제보자의 분석에 따르면 악성코드는 Python이 시작될 때마다 자동으로 로드되는 파일로 설치되므로, litellm을 쓰지 않는 Python 프로세스에서도, pip 자체를 실행할 때도 동작합니다. 그래서 회사는 정리 순서를 정해 두고, 영향받은 환경에서 pip install부터 시작하지 말라고 경고합니다.

Q어떤 자격 증명을 교체해야 하나요?
A

회사의 안내는 해당 호스트가 접근할 수 있던 모든 것입니다. 특히 인스턴스나 작업에 연결된 클라우드 역할(AWS IAM 역할 등), LiteLLM 프록시 데이터베이스에 저장된 모든 LLM 제공업체 키, 프록시 마스터 키와 모든 가상 키, DATABASE_URL의 비밀번호, 호스트의 어떤 프로세스든 그 환경에 있던 모든 시크릿입니다. 1.107.0이 외부 인터넷에 접속할 수 있는 호스트에 한 번이라도 설치되었다면 데이터가 성공적으로 외부로 전송되었다고 가정하라고 요청합니다.

Q원인은 무엇인가요?
A

회사가 10월 23일 공개한 근본 원인 분석에 따르면, 5월 27일 공개 저장소에 실수로 커밋된 설정 파일에 내부 에이전트 플랫폼(회사가 사용하는 오픈소스 도구)의 마스터 키가 들어 있었습니다. 커밋은 곧 덮어썼지만 마스터 키는 폐기되지 않았습니다. 10월 10일 공격자는 이 키로 플랫폼 API를 호출해 그곳에 설정된 GitHub 조직 소유자의 GitHub CLI OAuth 토큰을 얻었습니다. 이 토큰으로 CI에 저장된 시크릿을 빼내 다른 메인테이너 두 명의 토큰을 확보했고, 10월 21일 브랜치 보호를 해제하고 릴리스 워크플로를 변경한 뒤 프로덕션 승인을 통과했습니다. 회사의 첫 게시물은 토큰이 내부 LiteLLM 배포 환경의 로그에서 유출되었다고 의심했으나, 분석에서는 첫 토큰이 다른 서비스에서 나왔다고 정정했습니다.

Q10월 24일부터 LiteLLM Docker 이미지 서명 검증이 실패합니다. 왜 그런가요?
A

회사의 릴리스 노트에 따르면 10월 24일(UTC)에 공개된 1.103.8, 1.104.6, 1.105.4, 1.106.3부터 Docker 이미지와 Helm 차트는 새 cosign 키로 서명되며, 이전 키로 검증하면 실패합니다. 서명을 확인하는 cosign verify 스크립트, CI 점검, Kubernetes 정책에 이전 cosign.pub을 고정해 두었다면, 릴리스 노트에 명시된 커밋의 새 키로 교체하세요. 키 위치와 검증 명령은 각 버전의 릴리스 노트에 있습니다.

QLiteLLM은 3월에도 침해되었습니다. 같은 사고인가요?
A

아닙니다. 회사는 이번 공지에서 3월 사고 이후 릴리스 파이프라인을 강화했으며(릴리스를 비공개 저장소로 이전, 신뢰할 수 있는 게시 방식 사용, Docker 릴리스 태그를 변경 불가로 설정, 이미지 서명), 이번에는 공격자가 정당한 자격 증명을 사용해 이러한 통제 중 여러 개를 통과해야 했다고 밝혔습니다. 3월에 영향받은 버전은 1.107.0과 다릅니다.