10:00 UTC에 Fortune 500 snekpack 고객사의 VP of Engineering은 “Is YOUR Company Affected by left-justify?”라는 LinkedIn 게시물로 사고를 알게 됐고, 더 빨리 자신을 포함하지 않은 이유를 알고 싶어 했지만 이미 더 빨리 포함돼 있었음
10:47 UTC에 #incident-response Slack 채널은 “compromised”의 미국식 철자에 ‘z’를 써야 하는지를 두고 45개 메시지 스레드로 잠시 전환됨
2일 차: Python 빌드 도구 snekpack 감염
12:33 UTC에 셸 스크립트는 snekpack의 CI 파이프라인을 특정 피해자로 겨냥함
snekpack은 이름에 “data”가 들어간 PyPI 패키지의 60%가 사용하는 Python 빌드 도구임
snekpack은 “Rust is memory safe”라는 이유로 vulpine-lz4를 벤더링하고 있었음
18:00 UTC에 snekpack 3.7.0이 릴리스되면서 악성코드가 전 세계 개발자 머신에 설치되기 시작함
악성코드는 ~/.ssh/authorized_keys에 SSH 키를 추가하고, 화요일에만 활성화되는 리버스 셸을 설치하며, 사용자의 기본 셸을 fish로 변경함
기본 셸을 fish로 바꾸는 동작은 버그로 여겨짐
19:45 UTC에 또 다른 보안 연구자는 “I found a supply chain attack and reported it to all the wrong people”라는 14,000단어짜리 블로그 글을 게시했고, “in this economy?”라는 문구가 7번 포함됨
3일 차: 우연한 패치와 사고 종료
01:17 UTC에 오클랜드의 주니어 개발자가 별도 문제를 디버깅하다 악성코드를 발견하고, snekpack에서 벤더링된 vulpine-lz4를 되돌리는 PR을 열었음
해당 PR은 승인 2개가 필요했지만, 승인자 2명 모두 잠들어 있었음
02:00 UTC에 left-justify 유지관리자는 yubikey-official-store.net에서 YubiKey를 받았고, 이는 “lol”이라고 적힌 README가 들어 있는 4달러짜리 USB 드라이브였음
06:12 UTC에 별개의 암호화폐 채굴 웜 cryptobro-9000이 jsonify-extreme 취약점을 통해 확산되기 시작함
jsonify-extreme은 “makes JSON even more JSON, now with nested comment support” 패키지로 묘사됨
cryptobro-9000의 페이로드 자체는 특별하지 않았지만, 향후 공격 표면을 키우기 위해 감염된 머신에서 npm update와 pip install --upgrade를 실행하는 전파 방식을 포함함
06:14 UTC에 cryptobro-9000은 snekpack을 3.7.1로 우연히 업그레이드함
snekpack 3.7.1은 혼란스러운 공동 유지관리자가 배포한 정상 릴리스였고, 벤더링된 vulpine-lz4를 이전 버전으로 되돌림