경계하라: 저명한 Rustacean을 겨냥한 표적 공격
Rust 보안팀은 최소 한 건의 표적 캠페인이 그럴듯한 화상 통화에서 악성 크레이트 배포로 이어진 뒤, 9월 17일 강력한 경고를 발표했다. 경계하라: 저명한 Rustacean을 겨냥한 표적 공격은 일반적인 피싱 주의 알림이 아니다. 공격자는 Rust 프로젝트 구성원과 인기 크레이트 소유자를 노리고 있다. 유지관리자 한 명을 침해하는 것만으로도 수천 개의 하위 개발 환경이 노출될 수 있기 때문이다.
이 캠페인은 채용, 컨설팅 프로젝트, 투자 논의 또는 계약 기회로 첫 접촉을 위장한다. 화상 통화 중이나 이후 표적은 이른바 기술적 문제를 마주한다. 제시되는 해결책은 오디오 코덱 설치, 명령 실행 또는 공격자가 통제하는 프로젝트 열기와 관련된다.
이러한 사회공학적 접근은 이전에도 성공한 것으로 보인다. 8월 20일 공격자는 탈취한 유지관리자 계정을 통해 arrayref, internment, append-only-vec의 악성 버전을 배포했다. 해당 코드는 컴파일 과정에서 실행됐으며, 평범한 의존성 업데이트를 개발자 워크스테이션과 지속적 통합 시스템으로 향하는 경로로 바꿨다.
핵심 갈등은 더 이상 신뢰할 수 있는 코드와 악성 코드의 단순한 대립이 아니다. 개인적 신뢰와 패키지 권한의 문제다. 이 통화를 받는 사람들은 사적인 침해를 소프트웨어 공급망 사고로 전환할 수 있는 배포 권한을 보유하고 있다.
저명한 Rustacean을 겨냥한 표적 공격은 공급망 경고가 됐다
Rust 프로젝트가 유지관리자에게 경고하는 이유는 공격자가 개별 파일이나 비밀번호가 아니라 배포 권한을 노리고 있다고 판단하기 때문이다.
Adam Harvey는 crates.io 팀과 Rust 보안 대응 워킹 그룹을 위해 표적 공격 경고를 게시했다. 두 팀은 진행 중인 캠페인이 rust-lang 구성원과 인기 크레이트 소유자를 겨냥하고 있다고 보고 있다.
추정되는 목표는 기기와 계정을 침해한 뒤, 그 접근 권한을 이용해 악성코드를 배포하는 것이다. 이 평가는 사적인 사회공학 공격과 공개 배포 메커니즘을 연결한다. 개발자의 워크스테이션, 브라우저 세션, 이메일 계정 또는 crates.io 자격 증명은 둘 사이를 잇는 다리가 될 수 있다.
보고된 접근 방식은 매력적인 기회 제안으로 시작한다. 낯선 사람이 채용, 프로젝트, 자문 역할, 투자 대화 또는 계약을 제안한다. 초대는 답장을 보낼 만할 정도로 표적화돼 있으며, 통화자는 전문적으로 보이는 프로필로 이야기를 뒷받침할 수 있다.
공격자는 그럴듯한 회사 정체성과 LinkedIn 프로필을 만든 것으로 알려졌다. 이러한 자산이 엄격한 실사를 견뎌낼 필요는 없다. 원치 않은 메시지와 예정된 통화 사이의 짧은 시간 동안 신뢰할 만해 보이기만 하면 된다.
통화는 이후 인위적인 장애물을 만든다. 오디오가 작동하지 않는다고 하거나, 코덱이 없다고 표시하거나, 접근을 복구하려면 명령이 필요하다고 주장한다. 또 다른 방식에서는 명령을 클립보드에 넣고 표적에게 터미널에 붙여넣으라고 안내한다.
이 순간이 중요한 이유는 코드 실행을 문제 해결로 재구성하기 때문이다. 표적은 자신이 알 수 없는 프로그램을 설치한다고 인식하지 않는다. 화면 속 다른 사람이 기다리는 동안 익숙한 통신 문제를 해결한다고 믿을 뿐이다.
Rust의 경고는 수신자가 갑작스러운 접근 제안을 더 의심하고, 이미 신뢰하는 플랫폼을 사용하라고 요청한다. 가능한 경우 표적이 직접 회의를 만들 것을 권고한다. 이는 상호작용에서 공격자가 통제하는 요소를 적어도 하나 제거한다.
유지관리자는 계정에 예상치 못한 활동이 없는지 점검하고 다중 인증이 활성화됐는지 확인해야 한다. crates.io 접근 권한이 우려되는 사람은 지원 주소에 연락할 수 있으며, 더 광범위한 사고는 Rust 보안팀에 보고할 수 있다.
이 권고는 의도적으로 단순하다. 이 캠페인의 위험한 부분은 난해한 Rust 취약점이 아니다. 그럴듯한 인간적 상호작용 뒤에 숨겨진 결과를 수반하는 평범한 행동이다.
경고는 보고된 모든 사고가 하나의 공격자에게 속한다고 주장하지 않는다. Rust 팀은 6월의 시도, arrayref 침해, 현재 활동이 하나의 캠페인인지 아직 알 수 없다고 명시적으로 밝혔다. 이러한 불확실성은 공격자 귀속을 제한해야 하지만, 즉각적인 위험을 줄이지는 않는다.
이 때문에 경계하라: 저명한 Rustacean을 겨냥한 표적 공격은 절제된 표현보다 더 큰 무게를 지닌다. 이 경고는 가상의 위협 모델이 아니라 실제 배포 계정 침해 뒤에 나왔다.
arrayref 사고는 탈취된 유지관리자 한 명이 무엇을 열어줄 수 있는지 보여줬다
arrayref 공격은 합법적인 유지관리자 계정 하나의 통제권을 세 개의 기존 패키지에 대한 악성 배포로 전환했다.
8월 20일 7:15 UTC, Rust 보안 대응팀은 proc-macro1이 악성이라는 보고를 받았다. 조사관들은 해당 빌드 스크립트가 원격 페이로드를 내려받는다는 사실을 확인했다.
빌드 스크립트는 Rust의 패키지 관리자이자 빌드 시스템인 Cargo가 패키지를 컴파일하는 동안 실행하는 코드다. 합법적인 설정 작업을 수행할 수 있지만, 애플리케이션이 시작되기 전에 실행된다. 따라서 악성코드를 숨기기에 매력적인 위치다.
팀은 새 arrayref 릴리스가 proc-macro1에 직접 의존한다는 사실을 발견했다. 최근의 정상 릴리스도 yanked 처리돼 있었으며, 이는 의존성 해결 과정이 악성 버전으로 향하게 할 수 있었다. 공격자는 동일한 유지관리자 계정이 관리하던 두 크레이트 internment와 append-only-vec에도 같은 패턴을 반복했다.
공식 arrayref 사고 공지는 세 개의 오염된 릴리스를 확인했다. arrayref 0.3.10은 86분간, internment 0.8.7은 90분간, append-only-vec 0.1.9는 107분간 이용 가능했다.
이 시간은 달력상으로는 짧아 보인다. 그러나 자동화된 의존성 해결, 개발자 빌드, 에디터 도구, 지속적 통합 작업이 새 패키지를 가져오기에는 충분히 긴 시간이다.
Rust 팀은 악성 버전과 관련 크레이트 여섯 개를 삭제했다. 공격자가 yanked 처리한 정상 릴리스를 복원하고, 영향을 받은 유지관리자 계정을 잠갔다. 대응팀은 합법적인 작성자가 악의적으로 행동했다고 보지 않는다고 밝혔다.
대신 팀은 작성자의 컴퓨터 또는 자격 증명이 침해됐을 가능성이 높다고 평가했다. 이 구분은 평판의 한계를 보여주기 때문에 중요하다. 잘 알려진 유지관리자가 악성 코드를 추가하기로 선택하지 않았더라도, 익숙한 패키지에 공격자가 통제하는 코드가 포함될 수 있다.
보안 연구자들은 arrayref의 누적 다운로드가 약 2억4,500만 건이라고 추정했다. internment는 약 1,440만 건, append-only-vec는 약 450만 건이었다. 누적 수치는 영향을 받은 설치 수와 같지 않지만, 계정 선택이 중요한 이유를 보여준다.
공격자는 알려지지 않은 패키지를 배포하고 채택을 기다릴 필요가 없었다. 개발자가 이미 받아들인 프로젝트 뒤에 악성 의존성을 배치했다. 오염된 상위 패키지는 그 외에는 익숙해 보였다.
이 크레이트들은 기술적 역할도 서로 달랐다. arrayref는 슬라이스에서 고정 크기 배열 참조를 가져오는 매크로를 제공한다. internment는 반복되는 값의 공유 사본 하나를 저장하는 인터닝을 지원한다. append-only-vec는 기존 항목이 제거되지 않는 동시성 벡터를 제공한다.
이 기능들 어느 것도 원격 실행 파일을 내려받는다는 인상을 자연스럽게 주지 않는다. 이 불일치는 새 의존성과 빌드 동작을 검사해야만 드러났다.
따라서 이 사고는 이후의 모든 가짜 기회를 바라보는 맥락을 바꿨다. 영향력이 큰 유지관리자에게 오는 채용 문의는 더 이상 개인 스팸으로만 평가할 수 없다. 이는 또 다른 Rust 공급망 공격의 첫 수가 될 수 있다.
가짜 면접 사기는 직업적 예의를 코드 실행으로 바꾼다
공격자는 유지관리자가 기회를 검토하려는 의지를 악용한 뒤, 정상적인 협력이 자신의 코드를 실행하도록 상호작용을 설계한다.
이 캠페인에서 가장 위험한 부분은 악성코드가 crates.io에 도달하기 전에 발생한다. 표적에 관한 조사에서 시작된다. 패키지 소유권, 프로젝트 참여, 컨퍼런스 참석, 전문 관심사는 대개 공개돼 있다.
이 정보는 공격자가 관련성 있는 제안을 만드는 데 도움을 준다. 일반적인 채용 담당자 메시지는 무시될 수 있다. 유지관리자의 작업을 언급하는 제안은 대화로 이어질 수 있으며, 그럴듯한 회사 웹사이트와 소셜 프로필이 뒷받침하면 더욱 그렇다.
Rust 개발자 Matt Mastracci가 기록한 6월 사고는 관련 준비 과정을 보여준다. 조작된 투자 담당자가 자문 업무를 제안하며 그에게 접근했고, 화상 대화를 잡은 뒤 기술 과제를 보냈다.
제공된 저장소는 평범한 TypeScript 프로젝트처럼 보였다. 지침은 수신자에게 타입 검사, 테스트, 빌드를 실행하라고 요청했다. Mastracci의 실패한 공격 분석은 TypeScript에 적용된 패치 안에 숨겨진 악성 코드를 발견했다.
예상된 개발 명령을 실행했다면 페이로드가 작동했을 것이다. 저장소는 이미지 내부의 숨겨진 구성 요소와 분리된 프로세스를 포함해 여러 은닉 계층을 사용했다. Mastracci는 이를 명령 실행과 파일 접근이 가능한 원격 액세스 트로이목마라고 설명했다.
그는 프로젝트를 실행하기 전에 검사했기 때문에 이 사례는 그의 기기를 침해하지 못했다. 그러나 이는 명백한 피싱 조언만으로는 충분하지 않은 이유를 보여준다. 공격자는 조잡한 실행 파일 첨부물을 보내지 않았다. 유해한 행위는 표적이 수행할 것으로 예상된 작업에 내장돼 있었다.
더 새로운 화상 통화 패턴은 같은 압박을 실시간 상호작용으로 압축한다. 표적이 문제를 해결하는 동안 누군가 기다리고 있다. 지연은 불편해지고, 제안된 해결책은 회의를 끝내는 것보다 쉬워 보인다.
클립보드 방식은 공격자에게 특히 유용하다. 웹사이트나 통화 참여자는 의미 있는 맥락에서 전체 효과를 보여주지 않은 채 명령을 제공할 수 있다. 이를 셸에 붙여넣으면 대화에 대한 신뢰가 운영체제로 직접 전달된다.
이른바 코덱도 비슷하게 작동한다. 오디오 문제는 충분히 흔하기 때문에 설명이 일상적으로 들린다. 그러나 실제 회의 플랫폼은 기본 오디오를 작동시키기 위해 낯선 연락처의 맞춤형 다운로드를 요구해서는 안 된다.
가장 안전한 해석은 익숙하지 않은 모든 회의가 적대적이라는 뜻이 아니다. 회의 환경이 그것을 주선한 사람으로부터 자동적인 기술적 신뢰를 받아서는 안 된다는 뜻이다.
알려진 플랫폼에서 통화를 설정하면 이러한 균형이 달라진다. 운영 자격 증명이 전혀 없는 일회용 격리 환경에서만 예상치 못한 저장소를 여는 것도 마찬가지다. 어느 조치도 통화자가 합법적임을 증명하지는 않지만, 둘 다 통화자의 각본이 지닌 가치를 낮춘다.
이 가짜 면접 사기는 crates.io 비밀번호 이상을 노린다. 개발자 기기에는 GitHub 세션, 클라우드 자격 증명, SSH 키, 서명 자료, 브라우저 쿠키, 패키지 토큰, 비공개 소스 저장소 접근 권한이 있을 수 있다.
공격자는 이러한 자산 중 무엇이든 침해를 확대하는 데 사용할 수 있다. 결국 배포되는 악성 크레이트는 눈에 보이는 결과일 수 있으며, 탈취된 조직 자격 증명은 발견되지 않은 채 남을 수 있다.
이것이 경계하라: 저명한 Rustacean을 겨냥한 표적 공격의 핵심적 반전이다. 공격자는 주로 Rust의 메모리 모델을 악용하는 것이 아니다. Rust의 공유 인프라를 유지하는 사람들을 둘러싼 직업적 신뢰를 악용하고 있다.
빌드 시 실행은 작은 패키지 변경을 큰 노출로 바꾼다
악성 릴리스가 위험했던 이유는 Cargo가 하위 개발자가 어떤 라이브러리 함수도 호출하기 전에, 빌드 과정에서 공격자의 의존성을 실행했기 때문이다.
오염된 크레이트에는 proc-macro1이라는 의존성이 추가됐다. 이 이름은 널리 사용되는 정상 패키지인 proc-macro2와 매우 유사했다. 이는 공격자가 신뢰받는 의존성으로 오인되도록 이름을 정하는 타이포스쿼팅이다.
악성 패키지는 정상 프로젝트의 외형을 상당 부분 모방했다. 피해를 유발하는 동작은 빌드 스크립트인 build.rs에 들어 있었다. 이 분리는 상위 크레이트가 예상된 소스 코드를 유지하도록 하면서도, 의존성 한 줄을 통해 페이로드를 삽입하는 데 도움이 됐다.
기술 패키지 분석에 따르면, 이 스크립트는 인코딩된 조각에서 네트워크 주소를 재구성하고 일반적인 인증서 검증을 비활성화했다. 또한 Linux, Windows, Intel 기반 macOS 또는 Apple silicon macOS에 맞는 페이로드를 선택했다.
Unix 계열 시스템에서 이 스크립트는 실행 파일을 /tmp/rust-setup에 기록한 뒤 완료를 기다리지 않고 실행했다. Windows에서는 PowerShell 스크립트를 생성하고 Visual Basic 스크립트를 이용해 이를 숨겨진 프로세스로 시작했다.
그 외에는 빌드가 성공한 것처럼 보일 수 있었다. 이는 매우 중요하다. 눈에 보이는 실패는 흔히 조사를 촉발하기 때문이다. 정상적으로 컴파일되는 패키지는 개발자가 전이 의존성을 살펴봐야 할 이유를 줄인다.
연구자들은 복제된 패키지가 네트워킹 및 암호화 라이브러리를 포함한 추가 빌드 의존성도 선언한 사실을 관찰했다. 작은 매크로 패키지에 인터넷 연결이 필요한 명확한 이유가 없다면, 이런 추가 사항은 의심스럽다.
별도 분석에서는 2단계 악성코드를 복구해 더 광범위한 기능을 확인했다. 보고된 기능에는 호스트 프로파일링, 브라우저 데이터 검사, 지속성 확보, 명령 실행, 대체 통신 방식이 포함됐다.
Wiz의 악성코드 조사는 북한 행위자에게 귀속된 다른 작전과 인프라 중복이 있다고 밝혔다. 해당 분석은 명령 경로, 호스팅 범위, 관련 캠페인의 패턴을 연결했다.
다만 인프라 중복이 곧 결정적인 귀속을 뜻하지는 않는다. 서버는 재사용, 복제, 임대될 수 있으며, 조사관을 혼란스럽게 하려고 의도적으로 선택될 수도 있다. Rust 프로젝트 역시 특정 식별 그룹이 모든 관련 활동을 담당했다고 단정하지는 않았다.
신중한 결론도 여전히 심각하다. 이 기술적 연결고리는 피상적인 소스 검토를 통과하고 일반적인 개발 작업 중 실행되도록 설계됐다. 의존 프로젝트를 빌드하는 것만으로 충분했다. 애플리케이션이 arrayref, internment, 또는 append-only-vec를 호출할 필요는 없었다.
이는 잠재적 피해자 범위를 프로덕션 배포 환경 너머로 넓힌다. lockfile을 갱신한 개발자가 노출될 수 있다. 프로젝트를 분석하는 과정에서 Cargo를 호출하는 CI 러너, 자동화된 의존성 업데이트 작업 또는 편집기 도구도 마찬가지다.
lockfile은 빌드에 선택된 정확한 의존성 버전을 기록한다. 커밋되고 검토된다면, 악성 버전 중 하나가 프로젝트에 유입됐는지 보여줄 수 있다. 그러나 현재 lockfile이 깨끗하다고 해서 노출 기간 중 어떤 워크스테이션도 영향받은 버전을 해석하지 않았다는 증거가 되는 것은 아니다.
이번 Rust 공급망 공격은 다운로드 합계를 신중하게 해석해야 하는 이유도 보여준다. 수억 건의 과거 다운로드가 수억 건의 감염을 의미하지는 않는다. 악성 버전은 짧은 기간만 제공됐고, 많은 프로젝트는 이전 릴리스에 고정된 상태였다.
그럼에도 짧게 유지된 릴리스는 민감한 시스템에 도달할 수 있다. 패키지 설치가 자동화돼 있기 때문이다. 릴리스가 제공되는 매 순간, 인기도는 공격자에게 수많은 독립적인 기회를 제공한다.
따라서 코드 경로와 사회공학적 경로는 서로를 강화한다. 유지관리자를 겨냥하면 게시 권한을 얻을 수 있다. 빌드 시점 실행은 그 권한을 하위 환경 전반의 즉각적인 코드 실행으로 전환한다.
귀속은 여전히 불확실하지만, 방어적 결론은 그렇지 않다
조사관들은 조직적인 캠페인을 시사하는 신뢰할 만한 징후를 확보했지만, 현재 공개된 증거만으로 모든 Rust 사건이 동일한 공격자와 연결된다고 입증되지는 않는다.
9월 경고는 세 가지 관찰을 연결한다. Rust 개발자들은 6월 맞춤형 접근을 받았다. 8월에는 arrayref 유지관리자 계정이 침해됐다. 9월에도 새로운 의심스러운 접촉 시도가 이어졌다.
수법 역시 알아볼 수 있는 구조를 공유한다. 공격자들은 전문적인 신원을 구축하고, 매력적인 업무를 제안하며, 실시간 상호작용을 만들고, 대상이 코드를 실행하도록 유도한다. 의도된 피해자들은 다른 개발자에게 영향을 줄 수 있는 권한을 갖고 있다.
이러한 일관성은 캠페인이라는 평가를 뒷받침한다. 하지만 단일 지휘 체계, 후원자 또는 악성코드 계열을 입증하지는 않는다.
Rust 팀은 이 간극을 명시적으로 인정한다. 경고문은 이전 표적 공격과 arrayref 공격이 모두 하나의 캠페인에 속하는지 알 수 없다고 밝힌다. 책임 있는 보도는 이 단서를 보존해야 한다.
DPRK 연관성도 마찬가지로 신중한 접근이 필요하다. 보안 연구자들은 소프트웨어 개발자를 겨냥해 가짜 채용 절차를 사용하는 북한 캠페인을 문서화해 왔다. arrayref 악성코드의 일부 인프라 및 기술적 패턴은 기존에 귀속된 작전과 중복된다고 보고됐다.
이러한 발견은 가설을 중요하게 만들지만, 확실성으로 바꾸지는 않는다. 공개 경고를 Rust 프로젝트의 공식 귀속으로 읽어서는 안 된다.
arrayref 유지관리자의 최초 침해와 관련해서도 의문은 남아 있다. 프로젝트 측은 유지관리자의 기기 또는 자격 증명이 침해됐다고 보지만, 공개 사고 공지에는 완전한 포렌식 타임라인이 담기지 않았다.
그 때문에 탈취된 세션, 자격 증명, 브라우저 데이터 또는 엔드포인트 접근과 관련해 여러 가능성이 남는다. 9월 게시물은 유사한 공격을 통해 계정이 침해됐다고 설명하지만, 모든 기술적 단계를 공개하지는 않는다.
성공한 피해자 수 역시 알려지지 않았다. 공개 기록은 악성 패키지 게시를 확인하고 실패한 접근 시도를 문서화한다. 얼마나 많은 유지관리자가 소프트웨어를 설치했는지, 명령을 실행했는지, 또는 의심스러운 통화를 비공개로 신고했는지는 밝히지 않는다.
하위 감염 건수도 공개되지 않았다. 연구자들은 악성 패키지 버전을 식별하고 패키지 보급률을 추정할 수 있지만, 이는 제한된 노출 기간에 실제 실행 횟수를 측정하는 것과는 다르다.
이러한 공백은 사고 대응에 반영돼야 한다. 팀은 프로젝트가 과거 영향을 받은 크레이트에 의존한다는 이유만으로 감염을 주장해서는 안 된다. 특정 시스템에서 영향받은 버전이 해석되거나 빌드됐는지를 판단해야 한다.
반대 방향의 실수는 더 위험하다. 악성 릴리스가 빠르게 삭제됐다는 이유로 사건을 무시해서는 안 된다. 로컬 캐시, CI 로그, lockfile 이력, 엔드포인트 텔레메트리 및 자격 증명 활동에는 현재 매니페스트가 더 이상 보여주지 않는 흔적이 남아 있을 수 있다.
영향받은 버전을 빌드한 개발자는 해당 환경이 잠재적으로 침해됐다고 간주해야 한다. 크레이트를 제거한다고 해서 이미 실행된 코드는 되돌릴 수 없다. 해당 시스템에서 접근 가능했던 시크릿은 별도의 신뢰할 수 있는 기기에서 폐기해야 할 수 있다.
이 캠페인은 다단계 인증이 계정 보안을 해결한다는 가정에도 도전한다. MFA는 많은 자격 증명 공격을 줄이지만, 인증된 워크스테이션에서 실행되는 악성코드는 세션을 탈취하거나 기존 접근 권한을 통해 행동할 수 있다.
더 강력한 패키지 인증은 여전히 중요하다. 하드웨어 기반 자격 증명, 최소 토큰 범위, 짧은 게시 권한 유효 기간, 일상적인 브라우징과 릴리스 작업의 분리는 노출을 줄일 수 있다. 이들 어느 것도 사회공학의 위험을 없애지는 않는다.
실질적인 보안 경계는 사람, 엔드포인트, ID 시스템, 레지스트리에 걸쳐 있다. 레지스트리 로그인만 보호하면 게시 권한으로 이어지는 대체 경로가 너무 많이 남는다.
이것이 Be alert: targeted attacks on prominent Rustaceans가 전하는 지속적인 교훈이다. 귀속은 해결되지 않은 채 남을 수 있지만, 방어자는 확인된 메커니즘과 입증된 영향을 토대로 행동할 수 있다.
유지관리자와 엔지니어링 팀이 다음으로 주시해야 할 사항
다음 결정적 신호는 추가 유지관리자 보고, 패키지 게시 통제의 변화, 그리고 새로운 접근 시도와 알려진 악성코드 인프라를 연결하는 증거가 될 것이다.
먼저 Rust 크레이트 소유자의 추가 공개를 주시해야 한다. 동일한 회의 문제, 회사 신원, 클립보드 명령 또는 프로젝트 템플릿을 사용한 별도 보고는 조직적 작전이라는 판단을 강화할 것이다.
서로 다른 악성코드나 무관한 목표를 식별하는 보고는 단일 캠페인 이론을 약화할 것이다. 그렇더라도 여러 그룹이 오픈 소스 유지관리자를 가치 있는 접근 권한 중개자로 보고 있음을 보여줄 수 있다.
유지관리자는 의심스러운 이메일, 회의 링크, 도메인, 프로필, 리포지토리 주소 및 타임스탬프를 보존해야 한다. 이러한 세부 정보는 개인이 직접 귀속 주장을 할 필요 없이 대응팀이 인프라를 비교하는 데 도움이 된다.
둘째, crates.io 및 다른 레지스트리가 게시 통제를 어떻게 조정하는지 지켜봐야 한다. 계정 잠금과 패키지 삭제는 이번 사고를 제한했지만, 악성 버전이 등장한 뒤에야 작동했다.
향후 통제는 비정상적인 릴리스 동작에 초점을 맞출 수 있다. 패키지가 처음으로 의존성을 게시하거나, 여러 안정 버전을 yanking하거나, 예상치 못한 네트워크 기능이 있는 빌드 구성 요소를 추가하는 경우 검토 가능한 패턴이 된다.
레지스트리는 개입과 오픈 소스 유지관리자의 자율성 사이에서 균형을 맞춰야 한다. 지나친 마찰은 정당한 긴급 릴리스를 지연시키거나 이미 과도한 업무를 떠안은 자원봉사자에게 더 많은 부담을 줄 수 있다.
핵심 시험대는 새로운 통제가 일상적인 유지관리를 감당하기 어렵게 만들지 않으면서 고위험 변경을 차단할 수 있는지다. 이는 게시 자율성과 생태계 격리 사이의 절충이다.
셋째, 사회공학적 접근과 복구된 악성코드 사이의 더 강한 기술적 연결고리를 주시해야 한다. 일치하는 도메인, 페이로드 인증서, 명령 경로, 소스 아티팩트 또는 호스팅 인프라는 귀속을 더 명확하게 할 것이다.
기존 공격자와의 연관성이 확인되면 여러 생태계 전반의 탐지 능력을 개선할 수 있다. 반대로 그런 연관성을 찾지 못한다면, 이 기술이 여러 그룹으로 확산되고 있음을 시사할 수 있다.
엔지니어링 조직은 그러한 답을 기다릴 필요가 없다. 누가 패키지 게시 권한을 보유하는지, 릴리스 자격 증명이 어디에 있는지, 그리고 해당 자격 증명이 일상적인 브라우징 및 화상 통화와 동일한 워크스테이션을 공유하는지 검토할 수 있다.
팀은 8월 노출 기간 중 어떤 빌드가 실행됐는지도 파악해야 한다. 악성 버전은 arrayref 0.3.10, internment 0.8.7, append-only-vec 0.1.9였다. proc-macro1이 나타난 경우에는 모두 조사가 필요하다.
이 검토에는 현재 리포지토리뿐 아니라 CI 러너와 로컬 개발 캐시도 포함돼야 한다. 과거 기록을 무시하면 정리된 lockfile이 이전 실행을 숨길 수 있다.
조직은 예기치 않은 외부 연결, 새로운 지속성 메커니즘, 비정상적인 브라우저 접근, 설명되지 않는 자격 증명 사용에 대한 경고도 추가로 검토할 수 있다. 실행이 확인되면 자격 증명 교체와 알려진 정상 시스템으로부터의 재구축이 필요하다.
새로운 기회를 제안받는 유지관리자는 사회적 검증과 기술적 평가를 분리해야 한다. 독립적인 채널을 통해 회사를 확인하고, 신뢰할 수 있는 서비스에서 회의를 만들며, 맞춤형 코덱이나 복사한 터미널 명령은 거부해야 한다.
예상치 못한 리포지토리는 신뢰할 수 없는 소프트웨어로 취급해야 한다. 프로젝트를 빌드, 테스트 또는 실행하라는 지침은 일반적인 면접 과제로 제시되더라도 코드를 실행하라는 요청이다.
마지막 질문은 Rust가 언어로서 여전히 안전한지 여부가 아니다. 메모리 안전성은 신뢰받는 빌드 스크립트가 운영체제가 허용하는 일을 정확히 수행하는 것을 막을 수 없다.
문제는 생태계가 권한이 고가치 표적이 된 메인테이너를 보호할 수 있는가이다. 경계하세요: 저명한 Rustacean을 겨냥한 표적 공격은 또 다른 공격자가 먼저 찾아내기 전에 모든 엔지니어링 팀이 해당 인물을 식별하도록 해야 한다. 배포 권한을 검토하고, 릴리스 자격 증명을 분리하며, 의심스러운 접촉을 쉽게 신고할 수 있도록 해야 한다.



