누적 2억 4,500만 번 받아 간 러스트 crate arrayref 의 관리자 계정이 털려, 8월 20일 07:15 UTC 에 악성 0.3.10 이 올라왔다가 86분 만에 지워졌어요(같은 관리자의 internment 0.8.7 은 90분, append-only-vec 0.1.9 는 107분이었고, 공격자는 멀쩡한 최신 버전들을 yank 해서 새 버전으로 몰았어요). 이 0.3.10 은 David Tolnay 의 proc-macro2 를 흉내 내며 저자 이름까지 도용한 proc-macro1 을 의존성으로 달았고, 그 crate 의 build.rs 가 23.254.165.112 에서 리눅스·윈도우·맥용 실행 파일을 받아 돌려 크롬·브레이브·엣지가 저장해 둔 로그인 정보와 컴퓨터 정보를 빼 갔어요. 러스트 보안 대응팀은 문제 버전을 yank 가 아니라 아예 삭제하고 계정을 잠갔고, 지금 crates.io 의 arrayref 최신은 2024년 9월에 나온 0.3.9 예요.
- crate
- 러스트의 패키지 단위. 공식 저장소가 crates.io.
- build.rs
- 크레이트를 컴파일하기 전에 자동 실행되는 러스트 빌드 스크립트. 제한 없이 아무 코드나 돌 수 있음.
- proc-macro
- 절차적 매크로. 컴파일 도중 코드를 만들어 내며, 만드는 코드 자체가 컴파일러 안에서 실제로 실행됨.
- yank
- 패키지 저장소에서 특정 버전을 새로 고르지 못하게 막는 조치. 파일은 남아 있어 기존 잠금 파일은 계속 받을 수 있음.
- CI
- 지속적 통합(Continuous Integration). 코드를 올릴 때마다 자동으로 빌드·테스트를 돌리는 서버.
받아 놨는지부터 확인해요 — find ~/.cargo/registry/cache -name 'arrayref-0.3.10.crate'. 걸렸으면 브라우저 저장 비밀번호는 물론 CI 토큰·서명키까지 갈아야 해요. 러스트는 build.rs·proc-macro 가 cargo build 한 번에 돌아서 '코드에서 아직 안 쓰니 괜찮다'가 통하지 않아요 — 에이전트가 crate 를 알아서 붙이게 두고 있다면, 새로 생기는 build.rs 만큼은 사람이 보고 넘기게 막아 두세요.
- 러스트 공식 대응 악성 버전 셋을 yank 가 아니라 삭제하고 계정을 잠갔어요. 내 캐시에 그게 있는지 훑는 find 명령을 공식으로 알려 줘요. Rust Blog
- 무엇을 훔쳤나 크롬·브레이브·엣지가 저장한 로그인 정보와 컴퓨터 정보를 노렸고, 물렸다면 CI 토큰·서명키까지 갈라고 권해요. BleepingComputer
- 해커뉴스 반론 'build.rs 만 막아 봤자 테스트에서 도는 코드로 옮겨 갈 뿐'이라는 반론에, 그래도 빌드 때는 CI 시크릿이 손에 잡힌다는 재반박이 붙었어요. Hacker News
- cargo 쪽 대책 진행 상황 새로 나온 버전을 며칠 묵혔다 쓰는 global-min-publish-age = "7 days" 는 아직 나이틀리고, 안정화 PR 이 최종 의견 수렴 단계예요. GitHub