+− THE DAILY DIFFdev & AI news
SHIP IT

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입니다. 책임감 있게 병합하세요.

출처

  1. TanStack postmortem (Tanner Linsley, May 11, refined May 15)tanstack.com
  2. TanStack "Hardening TanStack After the npm Compromise" (May 12)tanstack.com
  3. TanStack/router#7383 — the StepSecurity detection issuegithub.com
  4. Downstream incident post, @squawk/* (May 12)github.com
  5. Downstream hardening post (May 14)github.com
  6. The Dependabot PR #246 (opened 21:48 UTC, merged 22:12)github.com
  7. @tan_stack advisory post, 21:19 UTCx.com
  8. StepSecurity — worm internals, bypass_2fa search, Dependabot-style branch nameswww.stepsecurity.io
  9. Socketsocket.dev
  10. Aikido — "over 160 packages, including Mistral"www.aikido.dev
  11. Hacker News (1,097 points)news.ycombinator.com

관련 동영상

postmortem · ko · 2026. 9. 13.

자바스크립트 11줄이 인터넷을 마비시켰습니다. 한번의 게시 취소로.

2016년 3월 22일 21:30 UTC: npm이 메시징 앱 Kik의 특허 대리인이 "변호사들이 당신의 문을 두드릴 것"이라고 약속한 후 "kik"이라는 패키지 이름을 Kik에게 넘겨주자, 한 개발자가 자신의 npm 패키지 273개를 모두 게시 취소했습니다. 273개 중 하나는 left-pad로, 문자열 앞에 공백을 추가하는 11줄짜리 코드이며 한 달에

2:52 ↗
postmortem · ko · 2026. 9. 25.

1밀리초 버그로 영국 항공 교통 6시간 마비.

9월 8일 화요일 오전 10시, NATS의 국가 영공 시스템(NAS) 내에서 일상적인 스쾍 코드 요청이 값을 업데이트하는 도중에 우선순위가 더 높은 메시지에 의해 중단되었습니다. 노출 시간은 약 1밀리초입니다. 요청이 잘못 재개되고 비행 데이터가 손상되어 오후 7시 30분까지 2,000편 이상의 영국 항공편이 지연, 취소 또는 회항되었습니다.

3:06 ↗
postmortem · ko · 2026. 9. 22.

재부팅으로 텔스트라가 2006년으로 돌아갔습니다. 9백만 대의 전화.

멜버른의 한 엔지니어가 새벽 2시 50분에 타이밍 섀시 전원을 다시 켰고, 아침 식사 시간까지 호주 최대의 모바일 네트워크는 2006년 11월이라고 동의했습니다. 2026년 7월 8일: 텔스트라의 NTP 섀시에 있는 GPS 카드가 전원 공급 장치 수리 중에 재부팅되었고, 펌웨어는 GPS 주 롤오버 업데이트가 없었기 때문에 이전 에포크를 선택하여 1,024주

3:15 ↗