전 세계 개발자 커뮤니티가 한순간에 긴장한 이유는 단순한 패키지 업데이트가 아니었습니다. 2026 년 5 월 11 일, TanStack 의 42 개 npm 패키지가 단 6 분이라는 짧은 시간 동안 84 개의 악성 버전으로 덮여버린 사건이 발생했습니다. 이 사태가 주목받는 핵심은 공격자가 npm 등록에 사용되는 토큰을 훔친 것이 아니라, CI 파이프라인 실행 중 런타임 메모리에 남아 있던 OIDC 토큰을 추출해냈다는 점입니다. 이는 기존의 보안 상식, 즉 ‘로컬 토큰 관리’와 ‘Trusted Publishing’의 경계를 허무는 새로운 형태의 공급망 공격을 보여줍니다.
공격의 메커니즘은 매우 정교하게 설계되어 있었습니다. 공격자는 pull_request_target 패턴을 이용해 포크된 리포지토리와 베이스 리포지토리 간의 신뢰 관계를 악용했습니다. 여기에 GitHub Actions 의 캐시 오염 기법을 결합해, 본래는 안전해야 할 메인 브랜치의 빌드 환경에 악성 코드를 주입했습니다. 이 과정에서 npm 토큰 자체가 탈취된 것이 아니라, 빌드 서버가 실행되는 동안 메모리에 일시적으로 존재하던 인증 정보를 읽어내어 악성 버전을 배포했습니다. 결과적으로 npm 토큰은 무사했지만, CI 환경 내부에서 실행되는 스크립트가 2.3MB 크기의 난독화된 파일을 실행하며 AWS, GCP, 쿠버네티스 등 외부 클라우드 자격 증명을 수집해가는 구조였습니다.
이 사건은 개발자들이 CI 파이프라인을 단순한 자동화 도구가 아닌, 복잡한 신뢰의 사슬로 인식해야 함을 일깨웠습니다. 특히 YAML 파일로 구성된 설정이 실제 디렉토리 구조와 파일 시스템에 어떻게 영향을 미치는지 이해하지 못한 채 사용하는 경우, 포크된 PR 이 메인 브랜치의 캐시를 오염시키는 ‘유령’ 같은 공격에 노출될 수 있음을 보여줍니다. 커뮤니티에서는 이러한 복잡성을 줄이기 위해 과거의 바스크립트 방식처럼 직관적인 파이프라인 관리로 회귀해야 한다는 의견이 힘을 얻고 있으며, Trusted Publishing 만으로는 CI 내부의 공격자를 완전히 막을 수 없다는 경각심이 확산되고 있습니다.
현재 TanStack 측은 모든 악성 버전을 폐기하고 npm 레지스트리에서 타르볼을 제거하는 작업을 진행 중입니다. 하지만 이 사태의 여파는 단순히 패키지 수정을 넘어섭니다. 5 월 11 일 해당 버전을 설치한 환경에 있는 개발자들은 AWS, GCP, GitHub, SSH 등 접근 가능한 모든 자격 증명을 회전시켜야 한다는 권고를 받고 있습니다. 앞으로는 CI 파이프라인의 신뢰 경계를 어떻게 설정할지, 그리고 메모리 기반의 토큰 추출 공격에 대비한 보안 전략을 어떻게 수립할지가 개발 생태계의 새로운 화두가 될 것입니다.