긴급 점검 가이드: BerriAI LiteLLM SQL Injection 취약점 (CVE-2026-42208)
CVE ID: CVE-2026-42208 (GHSA-r75f-5x8p-qvmc)
CVSS 점수: 9.3 (Critical)
영향 버전: LiteLLM Proxy v1.81.16 ~ v1.83.6
수정 버전: v1.83.7 이상 (권장: v1.83.10-stable)
공개 일시: 2026년 4월 24일
첫 번째 악성 트래픽 관찰: 공개 후 36시간
요약
LiteLLM은 OpenAI, Anthropic, AWS Bedrock 등 100개 이상의 LLM 제공자를 통합 관리하는 오픈소스 AI 게이트웨이입니다. 이 취약점은 인증 이전(pre-authentication) 단계에서 발생하는 SQL Injection으로, 인증 없이도 데이터베이스에 직접 접근하여 가상 API 키, 제공자 자격증명, 환경설정 등 민감한 정보를 탈취할 수 있습니다.
취약점 공개 후 36시간 만에 실제 악용 시도가 관찰되었으며, 공격자는 이미 LiteLLM의 스키마 구조를 파악하고 있어 고도로 조직화된 공격으로 판단됩니다.
영향 범위
직접적인 데이터 노출 위험
취약한 LiteLLM 인스턴스에 접근 가능한 공격자는 다음 테이블의 모든 데이터를 추출할 수 있습니다:
LiteLLM_VerificationToken- 모든 가상 API 키 (SHA-256 해시된 형태)
- 마스터 키 (Master Key)
- 팀/조직 바인딩 정보
- 예산 캡 및 사용량 정보
-
사용자별 권한 설정
-
litellm_credentials - OpenAI 조직 API 키 (수만 달러 월간 사용량 한도 포함)
- Anthropic 콘솔 키 (워크스페이스 관리자 권한)
- AWS Bedrock IAM 자격증명
-
기타 LLM 제공자 API 자격증명
-
litellm_config - PostgreSQL 데이터베이스 연결 문자열 (DSN)
- 마스터 키 (일반 텍스트)
- 웹훅 URL 및 콜백 설정
- 캐시 백엔드 설정
- 환경 변수 전체
2차 피해 시나리오
시나리오 1: 클라우드 계정 완전 장악
- litellm_credentials에서 탈취한 OpenAI/Anthropic/AWS 자격증명 사용
- 월간 사용량 한도가 있는 계정의 경우 몇 시간 만에 전체 한도 소진 가능
- 고가의 모델 호출을 통해 금전적 피해 발생
시나리오 2: 내부 시스템 횡적 이동 (Lateral Movement)
- 데이터베이스 DSN 탈취로 LiteLLM PostgreSQL 데이터베이스 직접 접근
- 마스터 키로 새로운 가상 키 생성 및 권한 상승
- 조직 내 다른 시스템으로의 접근 경로 확보
시나리오 3: 비즈니스 로직 탈취
- /key/generate 엔드포인트를 통해 무제한 가상 키 발급
- 내부 사용자의 권한을 도용하여 민감한 모델 호출
- 사용량 예산 제한 우회
공격/장애 시나리오
실제 관찰된 공격 패턴
Sysdig 연구팀이 관찰한 실제 악용 시도는 다음과 같은 2단계로 진행되었습니다:
1단계: 스키마 열거 (Schema Enumeration)
POST /chat/completions
Authorization: Bearer sk-litellm' UNION SELECT api_key,NULL,NULL,NULL,NULL FROM litellm_verificationtoken--
User-Agent: Python/3.12 aiohttp/3.9.1
공격자는 먼저 3개의 가치 있는 테이블을 타겟팅했습니다:
- litellm_verificationtoken → 실패 → "LiteLLM_VerificationToken" (PascalCase 재시도)
- litellm_credentials
- litellm_config WHERE param_name='environment_variables'
주목할 점:
- 공격자는 이미 LiteLLM의 Prisma 스키마를 사전에 학습
- 소문자 테이블명이 실패하자 즉시 PascalCase로 재시도
- 일반적인 스캐너가 아닌 고도화된 도구 사용
2단계: 컬럼 수 발견 (Column Count Discovery)
UNION SELECT api_key FROM "LiteLLM_VerificationToken"--
UNION SELECT api_key,NULL FROM "LiteLLM_VerificationToken"--
UNION SELECT api_key,NULL,NULL FROM "LiteLLM_VerificationToken"--
UNION SELECT api_key,NULL,NULL,NULL,NULL FROM "LiteLLM_VerificationToken"--
UNION SELECT api_key,NULL,NULL,NULL,NULL,NULL FROM "LiteLLM_VerificationToken"--
NULL 플레이스홀더 수를 조정하여 기본 쿼리의 컬럼 수를 탐지했습니다.
3단계: 최종 페이로드
Authorization: Bearer sk-litellm' OR 1=1--
모든 시도가 실패하면 "어떤 행이라도 반환"하는 tautology(항참) 페이로드로 fallback.
탐지가 어려운 이유
- HTTP 응답이 정상적으로 보임
- 모든 공격 시도가 HTTP 401 "Authentication Error"로 응답
-
응답 본문은 항상 동일한 JSON 형태:
{"error":{"message":"Authentication Error,...","type":"auth_error","code":"401"}} -
서버 로그가 노이즈로 위장됨
- 오류 로그:
Received=' ORL --, expected to start with 'sk-' - 이 로그는 잘못 설정된 클라이언트의 일반적인 오류와 구분 불가
-
특정 탐지 규칙 없이는 식별 불가
-
타이밍 차이만이 유일한 신호
pg_sleep(6)을 사용한 블라인드 SQLi- 정상 401 응답: <100ms
- 취약한 시스템: 약 6초
- 네트워크 지터나 WAF 타르핏과 구분 필요
즉시 대응 체크리스트
1단계: 영향 범위 파악 (즉시)
- [ ] LiteLLM 인스턴스 인벤토리 작성
- 내부 네트워크와 인터넷 노출 LiteLLM 배포 모두 확인
- 버전 확인:
litellm --version또는 Docker 이미지 태그 확인 -
배포 방식: Docker Compose, Kubernetes, Bare Metal
-
[ ] 취약 버전 사용 여부 확인
# Docker Compose 배포의 경우 docker ps | grep litellm docker images | grep litellm # 버전 비교 # v1.81.16 ~ v1.83.6: 취약함 # v1.83.7 이상: 수정됨 -
[ ] 네트워크 노출 상태 확인
- 포트 4000 (기본 LiteLLM 포트)이 인터넷에서 접근 가능한지 확인
- 방화벽 규칙, 보안 그룹, 로드 밸런서 설정 검토
2단계: 긴급 패치 (최대 24시간 이내)
-
[ ] LiteLLM 업그레이드
# 권장 버전: v1.83.10-stable pip install litellm[proxy]==1.83.10 # 또는 Docker 이미지 업데이트 docker pull ghcr.io/berriai/litellm:latest -
[ ] 업그레이드 후 서비스 재시작
# Systemd 서비스 systemctl restart litellm # Docker Compose docker-compose down && docker-compose up -d # Kubernetes kubectl rollout restart deployment/litellm -
[ ] 패치 완료 검증
# 버전 재확인 litellm --version # 로그 확인 (업그레이드 성공 메시지 확인) journalctl -u litellm -f
3단계: 자격증명 순환 (최대 48시간 이내)
취약한 버전이 인터넷에 노출된 적이 있다면, 데이터베이스는 이미 탈취된 것으로 간주해야 합니다.
- [ ] 모든 가상 API 키 순환
- LiteLLM 관리 UI에서 모든 가상 키 삭제 후 재발급
- 내부 애플리케이션의 키 업데이트
-
키 순환 완료까지 다운타임 허용 필요
-
[ ] 마스터 키 순환
- 환경 변수 또는 설정 파일에서 마스터 키 변경
-
새 마스터 키로 관리 작업 수행 가능성 확인
-
[ ] 상위 제공자 자격증명 순환
- OpenAI API 키 재발급
- Anthropic API 키 재발급
- AWS Bedrock IAM 자격증명 순환 (Access Key/Secret Key)
-
기타 LLM 제공자 자격증명 전체 재발급
-
[ ] 데이터베이스 자격증명 순환
- PostgreSQL 사용자 비밀번호 변경
- 연결 문자열(DSN) 업데이트
- 애플리케이션 재배포
4단계: 침해 조사 (최대 72시간 이내)
-
[ ] PostgreSQL 쿼리 로그 검토
-- LiteLLM이 제공하는 헬퍼 쿼리 사용 -- https://gist.github.com/ishaan-berri/6f31e56e878338eb4c01990bd08378ab -
[ ] 웹 서버 액세스 로그 분석
# 의심스러운 패턴 검색 grep "sk-litellm'" /var/log/nginx/access.log grep "UNION SELECT" /var/log/nginx/access.log grep "pg_sleep" /var/log/nginx/access.log -
[ ] 상위 제공자 청구 내역 감사
- 공개 후 7일 이내의 이상 요청 패턴 확인
- 익명의 IP에서 발생한
/chat/completions호출 검토 -
비정상적인 사용량 급증 여부 확인
-
[ ] 응답 시간 이상 징후 확인
- APM(Application Performance Monitoring) 도구에서
/chat/completions엔드포인트의 p99 레이턴시 검토 - 정상 시 <100ms, 공격 시 약 6초의 패턴 확인
5단계: 보안 강화 (장기 대응)
- [ ] 네트워크 격리 구현
- LiteLLM 프록시를 내부 네트워크로 이동
- VPN 또는 Zero Trust 네트워크를 통해서만 접근 허용
-
인터넷 직접 노출 금지
-
[ ] 리버스 프록시 추가
- Nginx/Apache/Envoy를 프론트엔드에 배치
-
다음 규칙 추가:
# Nginx 예시 location / { if ($http_authorization ~* "('|\-\-|UNION|SELECT|FROM|OR\s+1=1)") { return 403; } proxy_pass http://litellm:4000; } -
[ ] WAF(Web Application Firewall) 배치
- SQLi 탐지 규칙 활성화
- Authorization 헤더의 이상 패턴 차단
-
비정상적인 요청 패턴에 대한 속도 제한(Rate Limiting)
-
[ ] 모니터링 및 알림 설정
# Prometheus/Grafana 알림 예시 - alert: LiteLLMSlowAuthResponse expr: histogram_quantile(0.99, rate(http_request_duration_seconds_bucket{endpoint="/v1/chat/completions",status="401"}[5m])) > 1 for: 2m labels: severity: warning annotations: summary: "LiteLLM 인증 응답이 비정상적으로 느림 (SQLi 의심)" -
[ ] 로그 수집 및 분석 체계 구축
- SIEM(Security Information and Event Management)과 연동
- 다음 이벤트에 대한 알림 규칙 생성:
- Authorization 헤더에 SQL 키워드 포함
- 단일 IP에서 다수의 401 응답 발생
/v1/chat/completions의 응답 시간 > 1초
사전 예방 조치
AI 게이트웨이 보안 원칙
- 자격증명 집중 최소화
- 가능하다면 각 애플리케이션이 직접 제공자 API를 호출하도록 설계
-
중앙화된 게이트웨이는 최소 권한 원칙(Least Privilege)으로 운영
-
네트워크 격리 필수
- AI 게이트웨이는 기본적으로 내부 네트워크에서만 운영
-
외부 노출은 인증된 리버스 프록시 또는 API 게이트웨이를 통해서만
-
정기적 보안 점검
- 분기별로 모든 AI 인프라 구성 요소의 취약점 스캔
-
의존성 패키지 자동 업데이트(Software Bill of Materials 관리)
-
비용 알림 설정
- 각 LLM 제공자에서 일일/주간 예산 알림 설정
- 이상 비용 발생 시 즉시 알림 수신
개발자를 위한 코딩 가이드
안전하지 않은 예 (취약점 원인):
# 문자열 보간(Interpolation) 사용
sql_query = f"""
SELECT * FROM table WHERE token = '{user_input}'
"""
안전한 예:
# 파라미터화된 쿼리 사용
sql_query = "SELECT * FROM table WHERE token = $1"
result = await db.execute(sql_query, user_input)
# 또는 ORM의 쿼리 빌더 사용
result = await prisma.verificationtoken.find_unique(
where={"token": user_input}
)
탐지 규칙 (WAF/SIEM용)
탐지 규칙 1: SQL Injection 패턴
detection_rules:
- name: "LiteLLM SQL Injection in Authorization Header"
condition:
- header.authorization matches "(\'|\"|\-\-|\/\*|\*\/|UNION|SELECT|FROM|WHERE|OR\s+1=1|AND\s+1=1|pg_sleep|benchmark|waitfor)"
- path matches "(\/v1\/chat\/completions|\/v1\/completions|\/v1\/messages|\/v1\/embeddings)"
action: block
severity: critical
탐지 규칙 2: 타이밍 기반 SQLi
detection_rules:
- name: "LiteLLM Timing-based SQLi"
condition:
- path matches "(\/v1\/chat\/completions|\/v1\/completions)"
- status == 401
- response_time > 1000 # 1초 이상 응답 시간
action: alert
severity: high
탐지 귄칙 3: 반복적인 인증 실패
detection_rules:
- name: "LiteLLM Repeated Auth Failures"
condition:
- source_ip count > 10 in 1m
- path matches "(\/v1\/chat\/completions|\/v1\/completions)"
- status == 401
action: block
severity: medium
참고 자료
공식 문서
- LiteLLM Security Advisory (GHSA-r75f-5x8p-qvmc)
- LiteLLM v1.83.10-stable Release
- LiteLLM Official Blog: CVE-2026-42208
기술 분석
- Bishop Fox: CVE-2026-42208 Deep Dive
- Sysdig: Exploitation Timeline Analysis
- The Hacker News: Initial Coverage
탐지 및 대응 도구
중요 공지
이 가이드는 CVE-2026-42208에 대한 긴급 대응을 목적으로 작성되었습니다. AI 게이트웨이는 기업의 클라우드 자격증명을 집중 관리하는 핵심 인프라이므로, 취약점 발견 시 즉시 패치하고 모든 자격증명을 순환해야 합니다.
의심스러운 활동이 발견되면 즉시 보안 팀에 보고하고, 필요시 법적 조치를 고려하십시오.
본 콘텐츠는 AI 기술로 작성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하셨다면 댓글을 통해 의견을 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.
댓글 (0)
댓글을 작성하려면 로그인이 필요합니다.
로그인아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!