Hacker News 한국어: Rust arrayref 악성 크레이트 사고와 즉시 확인할 보안 조치

Hacker News에서 주목받은 Rust 공급망 보안 사고입니다. 널리 사용되는 arrayref의 악성 버전이 오타를 노린 proc-macro1 패키지를 의존성으로 추가했고, 프로젝트를 빌드하는 순간 원격 페이로드가 실행될 수 있었습니다.
Rust 악성 크레이트 사고 핵심
SafeDep 분석에 따르면 2026년 8월 20일 arrayref 0.3.10이 crates.io에 게시되면서 악성 의존성 proc-macro1을 끌어왔습니다. 이름은 유명한 정상 패키지 proc-macro2와 비슷하지만 별개의 악성 타이포스쿼팅 패키지입니다.
| 패키지 | 문제 버전 | 상태 |
|---|---|---|
| arrayref | 0.3.10 | 악성 버전 제거 |
| internment | 0.8.7 | 악성 버전 제거 |
| append-only-vec | 0.1.9 | 악성 버전 제거 |
| proc-macro1 | 전체 | 악성 타이포스쿼팅 패키지 제거 |
왜 빌드만 해도 위험했나
악성 코드는 애플리케이션 실행 시점이 아니라 Cargo가 의존성을 컴파일하는 build.rs 안에 들어 있었습니다. 선언된 의존성은 실제 소스에서 함수를 호출하지 않더라도 빌드되므로, 개발자가 코드를 실행하지 않고 단순히 cargo build를 수행해도 페이로드가 내려올 수 있었습니다.
분석 자료는 Linux와 macOS에서 임시 경로에 실행 파일을 만들고, Windows에서는 PowerShell과 VBScript를 이용해 숨겨진 프로세스를 시작하는 동작을 설명합니다. 정상적인 라이브러리 코드가 함께 포함돼 빌드는 계속 성공할 수 있다는 점도 탐지를 어렵게 만듭니다.
지금 확인해야 할 항목
- Cargo.lock에서 arrayref 0.3.10과 proc-macro1을 검색합니다.
- 개발자 PC뿐 아니라 CI 러너와 빌드 캐시를 함께 확인합니다.
- 문제 버전을 빌드했다면 해당 환경의 네트워크·프로세스 기록을 조사합니다.
- 패키지 캐시를 비우고 검증된 버전으로 잠금 파일을 다시 생성합니다.
- 의존성 업데이트는 격리된 환경에서 수행하고 변경된 전이 의존성을 검토합니다.
오픈소스 공급망 공격을 줄이는 방법
직접 추가한 패키지만 확인해서는 충분하지 않습니다. 이번 사례처럼 인기 라이브러리의 전이 의존성 한 줄이 공격 경로가 될 수 있습니다. 잠금 파일 고정, 자동 SBOM 생성, 새 패키지·새 게시자 감지, 빌드 단계의 외부 네트워크 제한을 함께 적용해야 합니다.
특히 CI에서는 기본적으로 인터넷 전체에 접근하게 두기보다 허용된 레지스트리와 저장소만 접속하도록 제한하는 방법이 효과적입니다. 의존성 빌드 스크립트가 예상하지 못한 실행 파일을 만들거나 외부 주소에 연결하면 실패하도록 정책을 둘 수도 있습니다.
Hacker News에서 관심을 받은 이유
arrayref는 다양한 Rust GUI 그래프에 전이 의존성으로 포함될 수 있고 누적 다운로드 규모가 큰 패키지입니다. 다운로드 수가 실제 감염 수를 뜻하지는 않지만, 작은 유지관리자 계정 하나의 문제가 넓은 생태계로 전파될 수 있다는 공급망 위험을 보여줬습니다.
자주 묻는 질문
arrayref를 사용하면 모두 감염된 것인가요?
아닙니다. 문제 버전과 빌드 시점, 캐시 상태를 확인해야 합니다. 정상 버전 사용자는 이 사건만으로 감염됐다고 볼 수 없습니다.
악성 버전이 삭제됐으면 추가 조치가 필요 없나요?
이미 패키지를 내려받아 빌드했다면 캐시와 실행 기록이 남을 수 있습니다. 해당 개발·CI 환경을 별도로 조사하는 것이 안전합니다.
proc-macro1과 proc-macro2는 같은 패키지인가요?
아닙니다. proc-macro2는 정상적으로 널리 쓰이는 패키지이며, 이번 사고의 proc-macro1은 비슷한 이름을 악용한 별도 패키지입니다.
Continue reading