[단독공격] 분석 — CVE-2026-63077
JetBrains TeamCity’s unauthenticated agent‑polling deserialization flaw (CVE-2026-63077) enables remote code execution and requires immediate patch or network isolation.
📋 요약
- 심각도 critical · CVSS 9.8 · EPSS 0.00649 · 악용난이도 easy · KEV
🔍 공격 기법
- 공격 표면: TeamCity 서버가 제공하는
/agentPolling(또는 유사 경로)의 HTTP POST 인터페이스. 인증이 요구되지 않으며, 폴링 요청 본문에 직렬화된 객체를 포함한다. - 트리거 조건:
1️⃣ 공격자는 대상 서버의 TeamCity 버전이2026.1.3미만 혹은2025.11.7이하임을 확인한다(버전 정보는/httpAuth/app/rest/server등 공개 API로 열람 가능).
2️⃣ 인증 없이 폴링 엔드포인트에 POST 요청을 전송하고, 본문에 악의적인 직렬화 데이터(java.io.ObjectOutputStream기반) 를 삽입한다. - 단계별 흐름
- 정찰: HTTP GET 으로
/app/rest/server/version조회 → 버전 확인. 네트워크 스캔으로 TeamCity 인스턴스 존재 파악. - 초기 접근: 위 엔드포인트에
Content-Type: application/octet-stream로 직렬화 페이로드 전송. CVSS 벡터 AV:N/AC:L/PR:N/UI:N 와 일치하는 “네트워크 직접, 저난이도, 인증 불필요” 조건을 만족한다. - 실행·권한 획득: TeamCity 서비스 계정(보통
teamcity또는 시스템 사용자) 권한으로 페이로드가 역직렬화되어 임의 Java 코드가 실행된다. 이는 파일 쓰기, 프로세스 생성, 기타 OS 명령 실행을 가능하게 함. - 지속: 공격자는 서버 내에 악성 빌드 스텝이나 플러그인을 추가해 재부팅 후에도 코드를 유지하거나, 시스템 계정으로 백도어(예: SSH 키) 삽입한다.
- 영향: 전체 CI/CD 파이프라인 제어 → 소스코드 변조, 비밀키 탈취, 내부망 lateral movement 등.
- 정찰: HTTP GET 으로
- 원리: TeamCity는 폴링 요청을 수신할 때 직렬화된 객체를 검증 없이
ObjectInputStream으로 역직렬화한다. CWE‑502(Deserialization) 취약점으로, 공격자가 조작한 바이트스트림을 제공하면 임의 클래스 로딩 및 메서드 실행이 가능하다. - 주의: 실제 익스플로잇 코드는 공개되지 않았으며, 여기서는 개념적 페이로드 구조(예:
java.lang.Runtime.exec)만 언급한다.
악용 가능성: 해당 취약점은 CVSS 벡터 AV:N/AC:L/PR:N/UI:N 로 나타나듯, 네트워크를 통해 직접 접근 가능한 엔드포인트에 대해 인증·권한·사용자 개입 없이 공격이 가능하므로 난이도가 매우 낮습니다. EPSS 0.00649 는 전체 취약점 중 실제 악용 확률이 상대적으로 낮다는 점을 보여주지만, KEV 리스트에 등재된 점은 이미 실전에서 악용 사례가 확인되었음을 의미합니다. 공격자는 TeamCity 서버의 agent polling protocol(예: /httpAuth/app/rest/agents/poll 혹은 해당 포트 9090) 에 무작위 HTTP 요청을 전송함으로써 악성 페이로드를 삽입할 수 있습니다. 이 엔
💥 영향 분석
- 성공 시 공격자는 TeamCity 서버를 완전 장악한다.
- CI 파이프라인 전반에 걸쳐 악성 빌드·배포가 가능해지며, 기업 내부 비밀키, 인증 토큰, 소스코드 등이 유출된다.
- 서비스 중단(Denial) 및 네트워크 내 다른 시스템으로의 추가 침투가 현실화된다.
🔗 관련 취약점·체이닝
- Deserialization (CWE‑502) 은 흔히 정보 노출 → 권한 상승 → RCE 흐름을 만든다.
- 추정: 동일 서버에 존재할 수 있는 다른 인증 우회(예: CVE‑2024‑XXXX)와 결합하면, 초기 접근 없이도 관리 콘솔에 직접 로그인하거나 플러그인 설치가 가능해진다.
- 팀시티 내부 플러그인 로딩 메커니즘(CWE‑749)과 연계될 경우, 악성 플러그인을 영구적으로 배포하여 지속성을 강화할 수 있다.
🔎 탐지
- 네트워크: 비정상적인 POST 요청이
/agentPolling(또는/app/agent/polling) 경로에 도달하는지 IDS/IPS 로그에서 확인. - 애플리케이션 로그:
ObjectInputStream역직렬화 오류 또는 “Deserialization failed” 와 같은 스택 트레이스가 기록되는 경우. - 시그니처 예시:
- 요청 본문에
rO0ABX...로 시작하는 Base64 직렬화 스트림이 포함된 경우 (Java serialization 헤더). - HTTP User‑Agent 가 비어 있거나 기본값(
Apache-HttpClient/4.5) 인 경우.
- 요청 본문에
🛡️ 완화 방안
1️⃣ 즉시 차단: 방화벽 또는 WAF에서 /agentPolling(및 유사 경로) 에 대한 무인 인증 요청을 차단한다.
2️⃣ 패치 적용: JetBrains 공식 패치를 적용해 TeamCity를 2026.1.3 이상 혹은 2025.11.8 이상으로 업그레이드한다.
3️⃣ 네트워크 분리: CI 서버를 외부 네트워크와 격리하고, 에이전트와의 통신을 허용된 IP 범위로 제한한다.
4️⃣ 로그 강화: 역직렬화 시도와 관련된 애플리케이션 로그 레벨을 DEBUG 로 올려 상세히 기록하도록 설정한다.
본 보고서는 다중 소스 교차검증(일관성 확인) + EPSS 0.00649 기반 실측 악용 예측 + KEV 등재·CVSS 9.8·exploit easy 조건을 적용한 즉시 대응 우선순위 결정에 근거합니다.
⚖️ 위험도 / 우선순위
- 조치: immediate (지금 즉시(24h 내))
- 근거: CVSS=9.8 · KEV · EPSS=0.00649 · exploit=easy · in_scope=None