TanStack 및 수많은 패키지가 받은 영향 - 심층 분석 및 조사
원제 · TanStack & MANY more packages affected - a deep dive & analysis
핵심 요약
GitHub Actions의 pull_request_target과 캐시 공유 취약점을 이용한 공급망 공격이 발생하여 TanStack 및 파이썬 패키지 전반으로 확산 중이므로, 로컬 환경 대신 가상 머신을 사용하고 패키지 설치 시 최소 릴리스 연령 설정을 적용해야 합니다.
하이라이트
2026년 5월 11일 TanStack Query, Router, Start를 포함한 모든 TanStack 패키지가 악성 코드에 감염된 채 배포되었습니다.
이 공격은 NPM을 넘어 파이썬(Python) 생태계까지 확산 중이며, 사용자 수가 4명뿐인 Mistral 패키지도 감염되었습니다.
악성 코드는 웜(Worm)처럼 작동하여 NPM, GitHub, AWS 자격 증명과 비밀 토큰을 탈취한 후 외부 URL로 전송합니다.
TanStack의 배포 시스템인 CI/CD 워크플로 자체가 공격을 받아 관리자의 기기가 감염되지 않았음에도 악성 패키지가 생성되었습니다.
Bun 패키지 매니저의 '최소 릴리스 연령(minimum release age)' 설정을 활용하면 최근 배포된 위험한 패키지 설치를 차단할 수 있습니다.
공격자는 GitHub Actions의 pull_request_target 이벤트를 악용하여 캐시를 오염시키고 정상적인 빌드 과정에 악성 코드를 주입했습니다.
타임라인
TanStack 및 파이썬 생태계 공급망 공격 현황
5월 11일 발생한 이 공격은 매우 짧은 시간 동안 진행되었으나 신속하게 격리되기 전 이미 수많은 패키지로 퍼졌습니다. 사용자 기반이 매우 작은 Mistral 패키지까지 영향을 받은 것은 이 악성 코드가 스스로를 복제하고 확산하는 능력을 갖췄음을 의미합니다. 현재 진행 중인 공격이므로 신뢰할 수 없는 패키지 설치를 즉시 중단해야 합니다.
- NPM에서 시작된 공급망 공격이 파이썬 생태계로 확산되고 있습니다.
- TanStack Query와 Router를 포함한 모든 TanStack 패키지가 20분 동안 악성 버전으로 노출되었습니다.
- 감염된 패키지는 웜처럼 동작하며 시스템 내의 데이터와 자격 증명을 탈취합니다.
감염 여부 확인 및 피해 지표
독일 시간 기준 어제 저녁에 패키지를 설치한 사용자들은 즉각적인 점검이 필요합니다. 공격자는 데이터를 외부로 유출하기 위해 특정 URL을 사용하며, 네트워크 로그 분석을 통해 데이터 유출 여부를 명확히 확인할 수 있습니다. 공개된 침해 지표(IOC)와 파일 해시 목록을 대조하여 기기 오염 상태를 확인하는 과정이 필수적입니다.
- UTC 기준 5월 11일 저녁 시간대에 TanStack 패키지를 설치했다면 감염된 것으로 간주합니다.
- 라우터의 JS 파일에 대한 특정 SHA 해시값 유무로 시스템 침해 여부를 판단합니다.
- 시스템의 아웃고잉 네트워크 트래픽 중 특정 악성 URL로 향하는 요청이 있는지 모니터링해야 합니다.
악성 코드의 작동 방식과 데이터 탈취 경로
이 맬웨어는 단순한 정보 탈취를 넘어 웜 기능을 수행합니다. 탈취한 토큰을 이용해 감염된 사용자가 관리하는 또 다른 오픈소스 프로젝트에 악성 버전을 배포함으로써 기하급수적으로 확산됩니다. 특히 CI/CD 파이프라인에서 실행될 경우 해당 워크플로가 생성하는 결과물 자체를 오염시켜 신뢰할 수 있는 배포 과정을 공격의 도구로 전락시킵니다.
- 악성 코드는 시스템을 스캔하여 NPM, GitHub, AWS 자격 증명이 저장된 위치를 찾아냅니다.
- 탈취한 GitHub 토큰을 사용해 공격자가 관리 권한을 가진 다른 패키지에 악성 코드를 심어 배포합니다.
- CI/CD 워크플로 내에서 실행되어 개발자의 로컬 기기가 아닌 빌드 서버의 비밀 정보를 훔칩니다.
시스템 보호를 위한 보안 권장 사항
평문 자격 증명을 하드 드라이브에 저장하는 습관은 공격에 매우 취약합니다. InPhysical이나 Doppler 같은 비밀 정보 관리 서비스를 클라우드 기반으로 사용하여 로컬 노출을 최소화해야 합니다. 또한 최신 패키지 매니저 기능을 활용해 배포된 지 얼마 지나지 않은 패키지의 설치를 강제로 차단하고, post install 스크립트 실행을 방지하는 보안 설정을 적용하는 것이 효과적입니다.
- 로컬 기기 대신 가상 머신이나 데브 컨테이너(dev container) 환경에서 코드를 실행합니다.
- AWS IAM 자격 증명 대신 SSO 방식을 사용하고 .env 파일에 평문 비밀 정보를 저장하지 않습니다.
- Bun이나 pnpm을 사용하여 패키지의 최소 릴리스 연령(minimum release age)을 설정합니다.
공격의 핵심 기술: PR Target 및 캐시 오염
이 공격은 유지 관리자의 개인 컴퓨터를 해킹한 것이 아니라 CI/CD 시스템의 논리적 허점을 찔렀습니다. pull_request_target은 기본 저장소의 컨텍스트에서 실행되므로 외부 PR이 캐시를 생성하거나 수정할 수 있게 합니다. 관리자가 새로운 코드를 푸시할 때 시스템은 효율성을 위해 오염된 캐시를 그대로 가져다 썼고, 결과적으로 정상적인 배포 과정에 악성 코드가 섞여 들어가게 되었습니다.
- 공격자는 GitHub Actions의 pull_request_target 트리거를 공격의 시작점으로 이용했습니다.
- 포크된 저장소의 악성 코드가 기본 저장소의 캐시 영역을 오염시키는 '캐시 포이즈닝' 기법이 사용되었습니다.
- 오염된 캐시는 이후 관리자가 수행하는 정상적인 빌드 워크플로에 주입되었습니다.
OIDC 토큰 추출과 배포 프로세스 악용
신뢰할 수 있는 배포 방식은 보안을 강화하기 위해 도입되었으나, 실행 환경 자체가 감염되면 무력화됩니다. 공격자는 수명이 짧은 토큰을 가로채 수동으로 악성 패키지를 배포했습니다. 다행히 공격자의 코드 실수로 GitHub Actions 워크플로가 실패했음에도 불구하고 패키지가 게시된 이상 징후가 포착되어 빠른 격리가 가능했습니다. AI 기술의 발달로 이러한 복잡한 취약점 분석과 공격 코드 작성이 더욱 쉬워지고 있어 주의가 필요합니다.
- NPM의 '신뢰할 수 있는 배포(trusted publishing)' 과정에서 생성되는 단기 OIDC 토큰이 메모리에서 탈취되었습니다.
- 악성 코드는 이 토큰을 사용하여 NPM API에 직접 접속하고 TanStack의 악성 버전을 게시했습니다.
- 공격 과정에서 발생한 워크플로 실패와 배포 기록 간의 불일치 덕분에 공격이 감지되었습니다.
설명
New week, new HUGE supply chain attack. Likely still ongoing, MANY packages are affected. I take a look at what's happening and do a deep dive analysis. TanStack Post Mortem: https://tanstack.com/blog/npm-supply-chain-compromise-postmortem Socket.dev Analysis (incl recommended actions): https://socket.dev/blog/tanstack-npm-packages-compromised-mini-shai-hulud-supply-chain-attack Mistral affected: https://x.com/AikidoSecurity/status/2053974705795989906 MORE packages affected: https://x.com/AikidoSecurity/status/2053990513280475405 Spread to Python: https://x.com/SocketSecurity/status/2054048025081737446 How to protect: https://www.youtube.com/watch?v=Fs6YDVJq5As GitHub Actions course: https://acad.link/gha All my courses: https://academind.com/courses Website: https://maximilian-schwarzmueller.com/ Socials: 👉 Twitch: https://www.twitch.tv/maxedapps 👉 X: https://x.com/maxedapps 👉 Udemy: https://www.udemy.com/user/maximilian-schwarzmuller/ 👉 LinkedIn: https://www.linkedin.com/in/maximilian-schwarzmueller/ Want to become a web developer or expand your web development knowledge? I have multiple bestselling online courses on React, Angular, NodeJS, Docker & much more! 👉 https://academind.com/courses
