Dependabot 범프가 웜을 배포했습니다. 22개 패키지.
봇이 풀 리퀘스트를 엽니다.
봇이 풀 리퀘스트를 엽니다. 사람이 24분 후에 병합합니다. 그로부터 95분 후, 웜이 CI에서 찾은 토큰으로 그의 이름으로 22개의 npm 패키지의 악성 버전 110개를 배포했습니다.
이 동영상에서 다루는 내용
- 봇, 사람, 웜
- 어떻게 일어났고, npm이 왜 허용했으며, 누가 비난받는가
- 타임라인: 오염된 캐시
- 21:48 — Dependabot 범프
- 작동 방식
번역된 스크립트
원래 영어 내레이션에서 번역되었습니다. 사용 가능한 오디오 및 캡션은 YouTube에서 제어합니다.
봇, 사람, 웜
0:00 봇이 풀 리퀘스트를 엽니다. 사람이 24분 후에 병합합니다. 95분 후, 웜이 배포했습니다. 그의 패키지 110개 버전을 그의 이름으로. TanStack의 사후 분석에는 상류 타임스탬프가 있고, 하류 유지 관리자의 사후 분석에는 나머지가 있으며, Hacker News는 1,100점을 주고 '미니 샤이훌루드'라는 이름을 붙였습니다. 어떻게 일어났고, npm이 왜 허용했으며, 누가 비난받는가.
어떻게 일어났고, npm이 왜 허용했으며, 누가 비난받는가
0:21 이것은 The Daily Diff, 사후 분석입니다. 5월 11일 아침. 이름이 변경된 포크가 TanStack Router에 대한 풀 리퀘스트를 엽니다. 한 시간 이내에 닫히지만, 벤치마크 워크플로우는 이미 코드를 실행하고
타임라인: 오염된 캐시
0:33 릴리스 워크플로우가 사용할 키로 오염된 캐시를 저장했습니다. 19시 20분. 합법적인 병합이 릴리스를 실행합니다. 캐시가 돌아오고, 바이너리가 러너의 메모리를 읽고, 게시 토큰을 가져와서 42개 패키지에 걸쳐 84개 버전을 유효한 출처와 함께 배포합니다. 테스트가 실패합니다. 그래도 배포됩니다. 19시 46분, StepSecurity 연구원이 문제를 제기합니다. UTC 9시까지 모든 것이 폐기되고 권고가 나옵니다.
0:55 폐기되었다고 사라진 것은 아닙니다. npm은 종속성이 있는 것은 무엇이든 게시 취소하기를 거부하므로, 몇 시간 동안 설치 가능한 상태로 남아 있습니다. 21시 48분. 9성급 항공 데이터 프로젝트에서, Dependabot이 정기 풀 리퀘스트를 엽니다. 개발 종속성 그룹 범프, 13개 업데이트. 두 개는 오염된 TanStack 버전입니다. 22시 12분: 병합됨. 게시 워크플로우가 범위 내의 토큰으로 npm C-I를 실행합니다.
21:48 — Dependabot 범프
1:15 준비 스크립트가 이를 읽고, 22시 17분에 웜이 그의 이름으로 게시합니다. 토큰이 도달하는 모든 패키지의 5개 버전, 오래된 사이드 프로젝트조차도: 모든 것에 대한 하나의 고전적인 토큰. 95분 만에 110개 버전. 그는 자정 이후 이메일로 알게 됩니다. 작동 방식. 하나: npm install은 기본적으로 낯선 사람의 라이프사이클 스크립트를 실행하며, git 종속성의 준비 스크립트도 포함됩니다.
1:39 둘: 웜은 한 가지를 원합니다. 두 번째 요소 없이 게시하는 토큰. 그런 다음 레지스트리에 해당 유지 관리자가 소유한 다른 것이 무엇인지 묻고, 그 안에 자신을 포함하여 모든 것을 다시 게시합니다. 셋: 체인에 사람이 아무도 없습니다.
작동 방식
1:51 봇이 제안하고, 파이프라인이 설치하며, 웜이 보답합니다. 그 웜의 데드 드롭 브랜치는 dependabot/github-actions/fremen으로 명명됩니다. git blame. npm의 설치 모델, 55%: 설치 시 스크립트 실행, 폐기된 것은 설치 가능한 상태로 유지되고, 2단계 인증 우회 토큰이 존재합니다. TanStack의 CI, 25%: 캐시에 대한 쓰기 권한으로 포크 코드를 실행하는 감사되지 않은 풀 리퀘스트 대상 워크플로우. 캐시에 대한 쓰기 권한. 범프 습관, 15%: 24분 만에 병합된 13개 업데이트, 방에 있는 토큰.
2:17 Dependabot, 5%: 웜이 그 유니폼을 입을 만큼 신뢰받습니다.
git blame
2:20 영향 범위: 42개의 TanStack 패키지. 하류 22개, 9개 별을 가진 프로젝트에서부터. 웜이 Mistral에 도달하면 생태계 전체에서 160개 이상. 모든 상류 버전은 유효한 서명을 가지고 있었습니다. 공식 파이프라인에 의해 빌드되었습니다. 사실입니다. 판결, 사후 분석: SHIP IT. 두 유지 관리자 모두 하루 이내에 타임스탬프가 찍힌 사후 분석을 게시합니다. 3일 이내에, 하류 파이프라인은 ignore-scripts로 설치하고, 빌드를 게시와 분리하고, 장기 토큰을 제거합니다.
영향 범위
2:47 npm의 기본값은 변경되지 않았습니다. 월요일: 설치 시 ignore-scripts, 그리고 그것을 실행하는 작업에서 게시 토큰을 제거합니다. 아직 이야기할 수 없는 사건을 댓글로, 또는 thedailydiff.dev로 보내주세요. in the comments, or at thedailydiff.dev. 그리고 오늘의 diff는 여기까지입니다.
판결
3:00 저는 Axrisi의 Niko입니다. 책임감 있게 병합하세요.
출처
- TanStack postmortem (Tanner Linsley, May 11, refined May 15)tanstack.com
- TanStack "Hardening TanStack After the npm Compromise" (May 12)tanstack.com
- TanStack/router#7383 — the StepSecurity detection issuegithub.com
- Downstream incident post, @squawk/* (May 12)github.com
- Downstream hardening post (May 14)github.com
- The Dependabot PR #246 (opened 21:48 UTC, merged 22:12)github.com
- @tan_stack advisory post, 21:19 UTCx.com
- StepSecurity — worm internals, bypass_2fa search, Dependabot-style branch nameswww.stepsecurity.io
- Socketsocket.dev
- Aikido — "over 160 packages, including Mistral"www.aikido.dev
- Hacker News (1,097 points)news.ycombinator.com



