• JetBrains TeamCity 온프레미스 전 버전에서 계정 없이 서버 명령을 실행할 수 있는 취약점 CVE-2026-63077(CVSS 9.8)이 확인됐고, 수정 버전은 2025.11.7과 2026.1.3입니다.
  • CISA는 8월 5일 이 취약점을 KEV에 올렸고, 9월 하순 '랜섬웨어 캠페인 악용 확인(Known)'으로 표시했습니다.
  • 빌드 서버에는 저장소·클라우드·배포 계정의 비밀이 모여 있습니다. 패치와 함께 침해 흔적 확인, 시크릿 교체까지 끝내야 합니다.

무슨 일이 있었나

JetBrains는 7월 27일 TeamCity 온프레미스(On-Premises)의 치명적 취약점을 공개했습니다. 빌드 에이전트가 서버와 통신하는 폴링 프로토콜을 통해, HTTP(S)로 접근만 되면 인증 없이 서버 프로세스 권한으로 OS 명령을 실행할 수 있습니다. 원인은 신뢰할 수 없는 데이터의 역직렬화(CWE-502)입니다. TeamCity Cloud는 JetBrains가 이미 조치해 고객이 할 일이 없습니다.

날짜(2026년) 내용
7월 27일 JetBrains 보안 공지, 수정 버전과 보안 패치 플러그인 배포
8월 5일 CISA KEV 등재, 미 연방기관 조치 기한 8월 8일
8월 7일 JetBrains 후속 안내, 미패치 서버 대상 실제 공격 보고 확인
9월 23일(미국 현지) CISA, 랜섬웨어 악용 'Known' 표시(BleepingComputer 보도)

랜섬웨어 조직 이름은 KEV 항목과 보도 모두 공개하지 않았습니다. 보도에 따르면 Shadowserver 집계로 패치 직후 노출된 취약 서버는 약 700대였고 지금도 160여 대가 남아 있습니다. KEV에 오른 TeamCity 취약점은 2023년 10월 이후 4건이며 모두 랜섬웨어 악용 'Known'입니다. 개발 도구가 연달아 표적이 되는 흐름은 Kestra·LiteLLM·Artifactory KEV 등재 글에서도 다뤘습니다.

왜 우리 회사 문제인가

TeamCity는 코드를 받아 빌드하고 배포하는 도구라 서버 안에 저장소 토큰, 클라우드 키, 배포용 SSH 키가 모입니다. JetBrains도 공격이 성공하면 저장된 자격 증명이 노출되고 빌드 산출물과 배포 파이프라인의 무결성이 깨질 수 있다고 밝혔습니다.

랜섬웨어 조직에게 빌드 서버는 사내망과 운영 서버로 가는 지름길입니다. 문제는 개발팀이나 외주사가 협업 편의로 인터넷에 열어 둔 서버가 보안 담당자의 자산 목록에 없는 경우입니다. 이미 업데이트했더라도 7월 말부터 패치 전까지 외부에 열려 있었다면 침입 여부는 따로 확인해야 합니다. CISA도 미 연방기관에 패치와 함께 '포렌식 분류 요건' 이행을 요구했습니다.

지금 순서대로 할 일

  1. 보유 여부와 버전 확인: 개발팀과 외주사에 TeamCity 운영 여부를 묻고 관리 화면에서 버전을 봅니다. 2025.11 이하 계열은 2025.11.7 미만, 2026.1 계열은 2026.1.3 미만이면 영향 대상입니다.
  2. 외부 접근부터 차단하고 로그 보존: 방화벽이나 보안 그룹에서 TeamCity 포트(기본 8111, 변경 시 conf/server.xml의 Connector 포트)를 사내망·VPN·빌드 에이전트 IP로만 허용합니다. 리버스 프록시(80/443)로 공개했다면 프록시에서도 같은 제한을 겁니다. 업그레이드 전에 <TeamCity 홈>/logs 디렉터리를 복사해 둡니다. 로그 볼륨을 따로 두지 않은 Docker 컨테이너는 다시 만들면 로그가 사라집니다.
  3. 업그레이드, 안 되면 보안 패치 플러그인: 계열별 수정 버전(2025.11.7 또는 2026.1.3)으로 업그레이드합니다. 당장 업그레이드가 어렵다면 JetBrains 보안 패치 플러그인을 설치합니다. 2017.1 이상에서 쓸 수 있고 2018.2부터는 재시작이 필요 없습니다. 2017.1 미만은 업그레이드만 가능합니다. 플러그인은 이 CVE만 막으므로 업그레이드 일정은 따로 잡습니다.
  4. 침해 흔적 확인: 보존한 로그 전체에서 com.thoughtworks.xstream.converters.ConversionException을 찾습니다. 리눅스는 grep -rc "xstream.converters.ConversionException" logs/, 윈도우는 PowerShell Select-String이나 관리 화면 Administration > Diagnostics > Server Logs를 씁니다. JetBrains는 이 메시지만으로 침해가 확정되지는 않지만 공격 시도나 성공일 수 있어 조사가 필요하다고 안내합니다. 미인가(Unauthorized) 에이전트 중 'scan'으로 시작하는 낯선 항목도 확인하되, 화면의 날짜가 공격 시점과 같다고 볼 수 없으므로 로그 시각으로 판단합니다. 패치 후의 ForbiddenClassException은 차단된 시도입니다. 노출 기간 로그가 회전으로 지워졌다면 침해를 배제할 수 없다고 보고 5번으로 갑니다.
  5. 흔적이 있거나 판단이 어렵다면 교체와 재배포: 관리자 계정, 액세스 토큰, 설치 플러그인의 최근 변경을 점검합니다. 저장된 저장소 토큰, 클라우드 키, 배포 SSH 키, 코드 서명 인증서를 재발급하고, 노출 기간의 빌드 산출물은 신뢰하지 말고 시크릿 교체 뒤 깨끗한 환경에서 다시 빌드해 배포합니다. 백업 기준은 중소기업 랜섬웨어 대응 가이드를 함께 보세요.

자가점검

  • 사내와 외주사가 운영하는 TeamCity 서버 목록과 담당자를 알고 있다
  • 모든 서버가 계열별 수정 버전(2025.11.7 또는 2026.1.3) 이상이거나 보안 패치 플러그인이 적용돼 있다
  • TeamCity 로그인 화면이 인터넷에서 보이지 않는다
  • 7월 이후 서버 로그와 미인가 에이전트 목록을 확인했다
  • 빌드 서버에 저장된 토큰과 키를 교체할 절차와 책임자가 정해져 있다

흔적이 보였다면

로그에서 공격 흔적이 보이거나 노출 기간 판단이 어렵다면 혼자 결론 내리지 마세요. JetBrains도 흔적 해석이 어려우면 지원 티켓으로 문의하라고 안내합니다. 보안 전문 기업 SENTRIX의 침해사고 대응은 원인 분석(포렌식)과 피해 범위 산정, 재발 방지까지 진행합니다.

협업 편의로 외부에 열어 둔 개발·관리 서버가 더 있을 수 있다면, 대표 도메인에서 연결된 웹사이트·서버를 확인하고 담당·조치를 관리하는 외부 노출·위험 관리(ASM)도 참고하세요. 도메인 없이 IP로만 열린 서버는 알고 있는 목록을 함께 봐야 합니다.

오늘 안에 사내와 외주사의 TeamCity 버전부터 확인하세요.

참고 자료

TeamCity 로그에서 흔적이 보였다면

긴급 보안 대응이 필요하면 즉시 연락하세요.