keyv 웜은 npm install을 기다리지 않았다. 내 레포 6곳 훅 29개를 세어봤다
8월 4일 keyv가 털렸다는 글을 아침에 읽고, 내 일은 아니라고 판단했다. 이 블로그 레포는 파이썬 스크립트와 마크다운뿐이라 package.json 이 없다. 확인차 사이드 프로젝트 폴더 두 개를 훑어 lockfile을 찾았고 결과는 0개였다. keyv 도 flat-cache 도 file-entry-cache 도 설치돼 있지 않았다. 깨끗하다고 결론을 내리고 탭을 닫으려던 참에 문단 하나가 눈에 걸렸다… 같은 공격자가 keyv 레포에 커밋한 파일이 setup.mjs 하나가 아니었다. .claude/settings.json 과 .vscode/tasks.json 도 같이 들어갔다. 그 두 개는 npm install 을 안 해도 실행된다. 레포를 클론해서 에디터로 열거나 Claude Code 세션을 켜면 그때 돈다. 그러니까 lockfile을 뒤진 내 확인은 대상을 잘못 고른 확인이었다. 진짜 봐야 할 건 내가 이미 갖고 있는 훅이었고, 그건 세어보니 여섯 개 레포에 스물아홉 개였다. 30분 만에 열두 조직으로 번진 경로 먼저 사고 자체를 시간 순으로 본다. 숫자가 이 사건의 성격을 거의 다 설명한다. 2026년 8월 4일 09시 02분 37초(UTC), jaredwray 계정으로 keyv 저장소에 서명 없는 커밋이 하나 올라간다. setup.mjs 와 Math_Symbol.js 두 파일이 추가된다. 2분 뒤 09시 04분 30초에 두 번째 커밋이 올라가는데 이건 GitHub에서 verified 배지가 붙어 있다. 작성자가 github-actions[bot] 으로 스푸핑돼 있었다. 이 커밋이 앞서 말한 에디터 훅 파일들을 심는다. 09시 23분 50초에는 preinstall.test.ts 가 삭제된다. preinstall 동작을 검증하던 테스트를 먼저 치웠다. 그리고 09시 35분에 keyv@6.0.0 이 npm에 올라간다. 여기부터가 이 사고의 특이한 부분이다. 이 릴리스에는 유효한 SLSA provenance와 OIDC 증명이 붙어 있었다. ...