공격자들은 인기 있는 Rust 패키지 arrayref와 연결된 유지 관리 계정을 악용해 프로젝트를 빌드하는 동안 개발자 기기에서 악성 코드를 실행하는 악성 버전을 배포했습니다. 23분을 넘지 않는 시간 동안 진행된 이 작업은 append-only-vec와 internment 패키지에도 영향을 미치며 소프트웨어 공급망 공격으로 이어졌습니다.
StepSecurity에 따르면 영향을 받은 버전은 arrayref 0.3.10, append-only-vec 0.1.9, internment 0.8.7이며, 세 패키지는 모두 같은 계정에서 관리되었습니다. arrayref는 널리 사용되는 패키지로, 지난 90일 동안 5,300만 회 이상, 전체적으로 2억 4,500만 회 이상 다운로드되었습니다. 이 패키지는 암호화, 그래픽, Rust 그래픽 인터페이스와 관련된 프로젝트 및 도구뿐 아니라 Ethereum과 Solana 생태계에서 사용되는 구성 요소에도 포함되어 있습니다.
공격은 어떻게 실행되었나?
공격자들은 알려진 proc-macro2 패키지의 이름을 사칭한 proc-macro1이라는 패키지에 대한 의존성을 추가했습니다. 원본 패키지 소스의 대부분은 변경되지 않은 상태로 남아 있었기 때문에, 소프트웨어 차이만 검토하는 사람에게는 조작을 발견하기가 더 어려웠습니다.
proc-macro1에는 빌드 중 자동으로 실행되는 build.rs 파일이 포함되어 있었습니다. 이 파일은 Base64로 인코딩된 부분에서 악성 구조의 구성 요소를 다시 조합한 뒤 Linux, Windows, macOS의 x86-64 및 ARM64 아키텍처를 포함해 운영 체제에 맞는 페이로드를 선택합니다. Unix에서는 페이로드를 /tmp/rust-setup에 기록하고 별도 프로세스로 실행하며, Windows 공격에서는 TEMP 폴더에 rust-setup.ps1이라는 파일을 생성하고 wscript.exe와 VBS 형식의 실행기를 사용해 프로세스를 계속 실행합니다.
악성 코드는 무엇을 훔칠 수 있나?
Wiz의 분석에 따르면 2단계는 호스트 정보와 자격 증명을 수집합니다. 악성 코드는 Google Chrome, Brave, Edge 브라우저의 SQLite 데이터베이스에서 로그인 정보를 추출합니다. 또한 Windows의 Registry Run, macOS의 LaunchAgent, Linux의 systemd를 통해 지속성 메커니즘을 만듭니다. 페이로드는 주소를 인수로 전달받으며, 이는 명령 및 제어 서버의 주소로 추정됩니다.
타임라인과 개발자에게 의미하는 점
캠페인은 2026년 8월 20일 01:17(UTC)에 유명한 Rust 개발자 David Tolnay를 사칭하는 GitHub 계정을 만든 것으로 시작되었고, 이어 crates.io에도 유사한 계정이 만들어졌습니다. 01:55에는 proc-macro1의 정상 버전이 게시되었고, 07:11에는 악성 버전 1.0.107이 뒤따랐습니다. 4분 후 David Roundy와 연결된 정식 계정 droundy를 통해 arrayref 0.3.10이 게시되었으며, 0.3.5부터 0.3.9까지의 버전이 제거되었습니다. 이로 인해 설치 도구가 악성 버전을 선택하게 될 수 있었습니다.
사고는 07:54에 신고되었고, crates.io는 08:03에 proc-macro1 패키지를 삭제했으며 08:41에는 색인에서 arrayref 0.3.10을 제거했습니다. aovine, arone, aronenao, tinymember 등 다른 패키지의 악성 버전도 제거되었습니다.
대응 조치
노출 기간인 약 1시간 30분 동안 영향을 받은 버전을 설치한 사람은 해당 환경이 침해된 것으로 간주해야 합니다. 검토 과정에는 Cargo.lock 파일에서 의심스러운 버전을 검색하고, 생성되거나 배포된 파일을 확인하며, 9089 및 443 포트를 통한 23.254.165[.]112 주소와의 연결을 점검하는 작업이 포함됩니다. 침해가 확인되면 모든 자격 증명, CI 토큰, 서명 키 및 기타 비밀 정보를 교체한 뒤 신뢰할 수 있는 백업으로 환경을 다시 구축할 것을 분석 기관들은 권고합니다. 영향을 받지 않은 프로젝트는 유지 관리 계정의 상태가 명확해질 때까지 안전한 것으로 알려진 버전을 고정해야 합니다.