한 줄 요약

지난 5월 인기 오픈소스 라이브러리 탠스택(TanStack)의 npm 패키지에 악성코드가 심어진 공급망 공격이 발생했고, 이 여파로 보안업체 크라우드섹(CrowdSec)의 비공개 깃허브 저장소 약 170개가 유출됐습니다. 공격자는 악성 패키지를 설치한 퇴직 개발자의 PC에서 깃허브 OAuth 토큰(인증 열쇠)을 탈취한 뒤, 해당 개발자의 접근권한이 아직 살아 있던 틈을 타 9분 만에 소스코드를 대량 복제했습니다. 크라우드섹이 유출 사실을 인지한 것은 소스코드가 온라인 포럼에 올라온 뒤인 약 4개월 후였습니다. 고객 데이터베이스나 인프라 직접 침해, 코드 변조는 없었으나 내부 알고리즘과 일부 개인정보가 노출됐습니다. 이번 사고는 퇴직자 계정의 깃허브·클라우드 인증정보를 즉시 회수하지 않으면 공급망 공격의 피해가 다른 기업으로 연쇄 확산될 수 있음을 보여주는 사례입니다.

사건

2025년 5월 탠스택 npm 공급망 공격으로 배포된 악성 패키지가 퇴직 개발자 PC의 깃허브 OAuth 토큰을 탈취했고, 공격자는 이 토큰으로 크라우드섹의 비공개 깃허브 저장소 약 170개를 9분 만에 복제·유출했다.

영향

크라우드섹 웹 콘솔 소스코드, 데이터 분석 모델, 악성 IP 차단 알고리즘(컨센서스 알고리즘) 코드, 사용자 이메일 83개, 잠재 투자자 51명의 개인정보가 노출됐다. 고객 DB·인프라 직접 침해나 코드 변조는 없었다.

원인

퇴직 개발자가 설치한 악성 탠스택 패키지가 깃허브 토큰을 탈취했고, 해당 개발자의 크라우드섹 깃허브 조직 접근권한이 퇴사 이후에도 수일간 유지됐다.

대응

크라우드섹은 사고 발생 사흘 뒤 퇴직 개발자의 깃허브 접근권한을 제거했고, 이후 엔드포인트 보안 솔루션 적용, 퇴직자 접근권한 관리 강화, 깃허브 활동 로깅 강화 조치를 발표했다.

실무 포인트

직원 퇴직·직무 변경 시 이메일·VPN 외에 깃허브 PAT·OAuth 토큰, SSH 키, 클라우드 액세스 키, CI/CD 토큰, 활성 세션까지 즉시 회수해야 한다. 공급망 악성 패키지 설치 이력이 있는 환경은 접근 가능한 모든 인증정보를 교체해야 한다.

본문

지난 5월 발생한 탠스택 npm 공급망 공격의 피해가 보안업체 크라우드섹(CrowdSec)의 비공개 소스코드 유출로까지 이어진 사실이 뒤늦게 확인됐다. 악성 오픈소스 패키지 하나가 개발자 PC의 인증정보를 탈취하고, 남아 있던 깃허브 접근권한을 통해 기업 내부 소스코드까지 유출시킨 연쇄 공급망 공격 사례다.

크라우드섹은 9월 18일 공개한 최종 사고 분석에서 공격자가 지난 5월 22일 약 9분 동안 퇴직 개발자의 깃허브 OAuth 토큰을 이용해 약 170개의 비공개 깃허브 저장소를 복제한 것으로 조사됐다고 밝혔다.

회사가 실제 유출 사실을 파악한 것은 약 4개월 뒤인 9월 16일, 소스코드가 온라인 포럼에 공개된 이후였다.

탠스택 악성 패키지 설치가 시작점

사건의 출발점은 5월 11일 발생한 탠스택 npm 공급망 침해다.

탠스택 공식 조사에 따르면 공격자는 깃허브 액션(GitHub Actions) 설정과 캐시를 악용해 정상 배포 체계를 장악한 뒤 @tanstack 계열 42개 패키지에 각각 2개씩 총 84개의 악성 버전을 npm에 배포했다.

악성 패키지를 npm·pnpm·yarn 등을 통해 설치하면 난독화된 자바스크립트 코드가 실행됐다. 이 악성코드는 깃허브 토큰과 SSH 개인키뿐 아니라 AWS, GCP, 쿠버네티스(Kubernetes), 볼트(Vault), npm 등 개발환경에서 접근 가능한 다양한 인증정보를 수집하도록 설계됐다.

탠스택은 당시 악성 버전을 설치한 개발자 PC나 CI(지속적 통합) 환경은 잠재적으로 침해된 것으로 간주하고 접근 가능한 인증정보를 모두 교체할 것을 권고했다.

퇴직 개발자 계정이 크라우드섹 침해 통로로

크라우드섹 조사 결과 당시 회사를 막 떠난 개발자의 시스템이 탠스택 공급망 공격에 영향을 받은 것으로 분석됐다.

문제는 해당 개발자가 퇴사한 이후에도 마무리 작업을 위해 크라우드섹의 깃허브 조직 접근권한이 일정 기간 유지되고 있었다는 점이다.

공격자는 탈취한 깃허브 OAuth 토큰을 이용해 5월 22일 오전 5시 52분부터 6시 1분까지 약 9분 동안 크라우드섹의 비공개 저장소 약 170개를 집중적으로 복제했다.

크라우드섹은 해당 개발자의 깃허브 접근권한을 사고 발생 사흘 뒤인 5월 25일 제거했다.

유출된 Git 설정에서도 gho_ 형식의 깃허브 OAuth 토큰을 이용해 저장소를 복제한 흔적이 확인됐다. 이후 깃허브의 지원을 통해 토큰 사용 내역을 추적하면서 퇴직 개발자 계정이 실제 유출 경로였다는 사실이 확인됐다.

웹 콘솔·데이터 분석 코드·IP 차단 알고리즘까지 유출

유출된 자료에는 크라우드섹 웹 콘솔 관련 소스코드를 비롯해 데이터과학 분석 스크립트와 모델, 각종 자동화 코드 등이 포함됐다.

특히 여러 보안 센서에서 수집된 정보를 토대로 악성 IP를 차단 목록에 올릴지 결정하는 '컨센서스 알고리즘(Consensus Algorithm)' 관련 코드도 포함됐다.

크라우드섹은 알고리즘 구조 자체는 이미 상당 부분 공개된 내용이며, 유출된 임계값 역시 변경할 수 있기 때문에 현재 구조상 공격자가 이를 이용해 임의 IP를 차단 목록에 올리기는 어렵다고 설명했다.

개인정보 일부도 노출됐다. 크라우드섹에 따르면 프로젝트 이용 현황 등을 분석하기 위해 사용하던 사용자 이메일 주소 83개와 2020년 당시 잠재 투자자 51명의 이름·이메일 주소 및 일부 투자 관련 정보가 유출 자료에 포함됐다.

"고객 DB·인프라 침해나 소스코드 변조는 없어"

크라우드섹은 이번 사고가 소스코드 유출에 국한됐으며 고객 데이터베이스와 회사 인프라가 직접 침해된 증거는 확인되지 않았다고 밝혔다.

공격자가 저장소를 복제한 것 외에 코드를 수정하거나 커밋한 흔적도 없었으며 CI 환경이나 빌드 파이프라인 역시 변조되지 않았다는 설명이다.

소스코드에 포함돼 있던 AWS SNS용 인증정보 하나는 당시까지 유효했지만 단일 알림 토픽에 메시지를 전송하는 제한된 권한만 갖고 있었다.

크라우드섹은 8월 실제 해당 자격증명의 권한을 확인하려는 접근이 있었지만 추가 시스템 침해로 이어지지는 않았다고 밝혔다.

공급망 보안과 퇴직자 계정 관리 함께 봐야

이번 사고는 오픈소스 공급망 침해가 최초 감염 시스템에서 끝나지 않고 장기간 유효한 인증정보를 통해 다른 기업 시스템으로 확산될 수 있다는 점을 보여준다.

특히 직원 퇴직이나 직무 변경 시 이메일과 VPN 계정만 차단하는 방식으로는 충분하지 않다. 깃허브 PAT(개인 액세스 토큰)와 OAuth 토큰, SSH 키, 클라우드 액세스 키, CLI 인증정보, CI/CD 토큰과 활성 세션 등을 함께 확인해 즉시 회수해야 한다.

크라우드섹 역시 사고 이후 개발자 시스템에 엔드포인트 보안 솔루션을 적용하고 퇴직자 접근권한 관리와 깃허브 활동 로깅을 강화하겠다고 밝혔다.

출처
데일리시큐 · dailysecu.com
원문 보기

분야별 뉴스

관심 분야의 보안 이슈를 모아 보세요.

TORUN SECURITY

투런이 제공하는 보안 솔루션

공격 표면 관리부터 엔드포인트·내부정보 보호까지, 기업 환경에 맞는 보안 솔루션을 투런이 함께 설계합니다.