고객사의 디지털 공급망의 한 조각은 코드 한 줄도 바뀌지 않은 채 소유자가 바뀔 수 있습니다. 도메인은 똑같이 해석됩니다. 스크립트는 똑같은 해시를 가집니다. 트래픽은 동일하게 보이며, 동일하기 때문입니다. 바뀐 것은 그 구성 요소가 다음에 무엇을 할지 결정하는 것이 누구인가이며, 그 판단에 관한 어느 것도 네트워크 캡처에는 보이지 않습니다.
침해는 찾아올 때 이미 신뢰받고 있던 경로를 통해 몇 달 또는 몇 해 뒤에 도착합니다. 그리고 그것을 잡아냈을 질문은 애초에 기술적인 질문이 아니었습니다. 누가 이것을 언제 누구로부터 샀는지였습니다.
작동 방식

이 이전 하나하나는 어딘가의 서류에 기록됩니다

하나하나가 어딘가에 문서화된 기록을 남깁니다. 매매 증서, 등록부 기재, 권한 변경, 인사 기록입니다. 그 가운데 어느 것도 패킷이나 알림이나 바뀐 해시를 만들어내지 않으며, 바로 그 때문에 그것들을 잡아낼 모니터링이 네트워크에 놓여 있지 않습니다.

01

자산이 매입됩니다
도메인, 리포지터리, 패키지, 확장 기능, 또는 그 가운데 어느 것의 배후에 있는 회사가 주인이 바뀝니다. 설치 기반과 축적된 신뢰가 매입의 부수적인 부분이 아니라 매입의 목적인 경우가 잦습니다. 연구자들은 이제 자리를 잡은 브라우저 확장 기능을 오로지 그 기존 사용자를 노려 인수하는 일을 개별적으로 떨어진 사건의 연속이 아니라 상시적인 사업 모델로 기술합니다.

02

배포 권한이 넘겨집니다
수천 개의 조직이 의존하는 패키지의 보수를 받지 않는 유지관리자가 낯선 사람에게 도움을 제안받고 그것을 받아들입니다. 주요 레지스트리에서 이는 들어오는 당사자에 대해 이메일 주소의 지배 외에는 어떤 신원 확인도, 어떤 대기 기간도, 하류의 누구에게도 어떤 공개도 요구하지 않습니다. 명령 하나입니다.

03

신뢰가 길러집니다
한 기여자가 몇 달 또는 몇 해에 걸쳐 실질적이고 유용한 작업을 기여하고, 그 공로로 승격되며, 그런 다음 무엇이든 마음대로 배포할 수 있는 위치에 서게 됩니다. 그 과정에서 탐지할 부정한 단계는 없습니다. 마지막 하나를 빼면 모든 단계가 진짜이기 때문입니다. 기존 유지관리자가 부담을 받고 있는 곳에서는, 겉보기에 독립적인 목소리들이 공동 유지관리자를 두라고 압박하는 조율된 활동이 그것을 앞당깁니다.

04

내부의 사람이 바뀝니다
커밋 권한을 가진 개발자, 배포 접근 권한을 가진 업무 수탁자, 세 계층 아래의 제공업체에 있는 관리자입니다. 그들의 접근 권한에 관해서는 아무것도 바뀌지 않습니다. 그 접근 권한은 처음부터 정당했기 때문입니다. 바뀌는 것은 그들의 사정, 고용주, 동기, 또는 누가 그들에 대해 지렛대를 쥐고 있는가이며, 그 가운데 어느 것도 그들을 고용한 조직의 바깥에서는 관측할 수 없습니다.
네트워크 밖

중요한 기록은 네트워크 밖에 놓여 있습니다

이 페이지의 모든 작동 방식은 기록을 만들어냅니다. 기업은 등기하고 공시합니다. 도메인은 이전되고 등록대행자는 그것을 기록합니다. 리포지터리와 레지스트리의 소유 변경은 구성원 목록과 패키지 메타데이터에 적힙니다. 루트 프로그램은 바로 이런 종류의 변경을 공개할 것을 요구합니다. 제재와 집행 조치는 당사자의 이름을 듭니다. 그 가운데 어느 것도 비밀이 아닙니다. 그 전부가 보안팀이 모니터링하는 네트워크 밖에, 누구의 일로도 정해지지 않아 아무도 읽지 않는 출처에 놓여 있습니다.
그래서 관측만으로는 충분하지 않으며, 그래서 이 방법론은 애플리케이션이 접촉하는 것에서 멈추지 않습니다. 캡처는 어느 당사자가 고객사의 신뢰 경계 안에 있는지를 확정합니다. 그 당사자를 기업과 소유자로 해석하는 일이, 나중에 그 가운데 하나가 더 이상 고객사가 평가한 그 회사가 아니라는 것을 알아차릴 수 있게 만듭니다. 두 절반은 서로 대체할 수 있는 것이 아닙니다.
등록 데이터는 출처로서 실질적으로 더 나빠졌습니다. 2024년에는 일반 최상위 도메인의 약 89%가 공개 기록에 식별 가능한 등록자를 담고 있지 않았으며, 프라이버시 규칙이 바뀌기 전에는 그 비율이 약 24%였습니다. 이전의 기록은 여전히 존재합니다. 다만 그것을 근거로 행동할 사람으로부터 더 멀어졌을 뿐이며, 그로 인해 보는 비용은 올라가고 누군가가 실제로 보는 가능성은 낮아집니다.
지연

누군가 알아차리기까지

한 회사에서 위쪽으로 계층으로 된 지주회사와 불투명한 투자자를 거쳐 여러 관할권을 넘나들며 그 배후의 개인까지 따라간 소유 사슬입니다.
제공업체를 그 배후의 당사자로 해석하는 일이, 그 당사자에게 나중에 일어난 변화를 애초에 보이게 만듭니다. 소유권 사슬 매핑 읽기.
실제로는

이 기록 하나하나는 서로 다른 시계에 따라 바뀝니다

패키지 배포자 목록은 명령이 실행되는 그 순간에 바뀝니다. 등록대행자 기록은 이전이 완료되는 날에 바뀝니다. 기업 공시는 나타나기까지 몇 주가 걸릴 수 있고, 제재 지정은 도착할 때 도착합니다. 네 가지를 모두 지켜보는 일이 그 가운데 가장 빠른 것을 무언가 값어치 있게 만듭니다.
기업 관련 사건
인수, 등기된 지배력의 변경, 새로운 공시, 임원이나 등기 주소의 변경, 지급불능, 그리고 고객사가 평가한 것과 이해관계가 다른 투자자의 등장입니다. 고객사가 통과시킨 회사가 그 이름으로 여전히 영업하고 있는 회사와 언제나 같은 것은 아닙니다.
도메인과 인프라의 이전
등록대행자와 네임서버의 변경, 호스팅과 배포의 이동, 인증서 발급자의 변경, 주소 공간의 주인이 바뀌는 일입니다. 하나하나로는 평범하고, 모아 보면 어떤 제공업체에 관해 무언가 움직였다는 가장 분명한 초기 징후입니다.
리포지터리와 레지스트리의 지배력
사슬이 실제로 의존하는 패키지와 리포지터리에서의 소유와 유지관리자 변경, 자리를 잡은 패키지에 새로운 배포자가 나타나는 일, 그리고 릴리스에 서명하는 사람이 갑작스럽게 바뀌는 일입니다. 기록은 공개되어 있습니다. 하류에서 그것을 읽는 사람은 거의 없습니다.
지위와 집행
제재 지정, 집행 조치, 소송, 루트 프로그램의 불신 결정, 그리고 고객사가 계약한 벤더만이 아니라 사슬의 어느 당사자에 대한 불리한 보도입니다. 노출은 모든 계층에서 물려받으며, 불명예도 마찬가지입니다.
간격

그 이전 가운데 여덟 건을 지배력이 이동한 날부터 측정한 것입니다

Nano Adblocker는 2주였습니다. xz-utils는 28개월이었습니다. 이 간격은 구성 요소가 얼마나 큰지, 몇 사람이 그것에 의존하는지, 또는 그것이 얼마나 신중하게 선택되었는지의 함수가 아닙니다. 누군가가 보기까지 얼마나 걸렸는지의 함수입니다.
구성 요소의 지배력이 넘어간 시점부터의 개월 수 척도 위에 가로 막대로 그린 여덟 건의 문서화된 사례입니다. Particle과 Nano Adblocker는 며칠 안, event-stream은 2개월, Polyfill.io는 4개월, The Great Suspender는 5개월, WoSign과 StartCom은 12개월, Stylish는 18개월, xz-utils는 28개월입니다.
기록

같은 실패가 13년에 걸쳐 여섯 가지 방식으로 찾아왔습니다

날짜 순서로 놓은 스무 건의 사건이며, 들어온 경로는 여섯 가지입니다. 그 가운데 세 건이 지배력의 이전이고, 그것들은 일어난 순간에 아무런 기술적 흔적도 남기지 않은 것들입니다. 나머지가 여기에 있는 이유는, 노출을 지는 당사자에 대해서도 같은 말이 성립하기 때문입니다. 그 당사자가 실패한 당사자인 경우는 거의 없습니다.
2013년부터 2026년까지 왼쪽에서 오른쪽으로 이어지는 연표이며, 위아래에 연도 축이 있고 스무 건의 사건을 여섯 개의 띠에 걸쳐 기간 막대로 그렸습니다. 빌드 또는 갱신 경로, 소유 또는 지배력의 이전, 유지관리자 또는 배포 계정, 실제 운영 페이지의 서드파티 스크립트, 플랫폼 또는 관리형 서비스, 그리고 모두가 내장하는 구성 요소입니다.
Target, 2013년
공격자는 Target의 네트워크에 원격 접근 권한을 가진 냉동 및 HVAC 업무 수탁자에게 발급된 자격 증명을 통해 침입하여, 거기에서 결제 시스템으로 이동했습니다. 약 4,000만 건의 카드 기록과 7,000만 건의 고객 기록이 빠져나갔습니다. 그 벤더는 결제에 아무 역할도 없었고 그 근처에 있을 이유도 없었습니다.
WoSign과 StartCom, 2015년
한 인증 기관이 다른 인증 기관을 조용히 인수하고 그것을 공개하지 않았으며, 이는 바로 그 공개를 요구하는 브라우저 루트 프로그램 규칙을 위반한 것이었습니다. 소급 발급된 인증서와 오발급이 이어졌습니다. Mozilla, Google, Apple은 각각 양쪽에 대한 신뢰를 제거했으며, 은폐된 지배력 변경을 주된 위반으로 다루었습니다.
left-pad, 2016년
한 작성자가 이름 분쟁 끝에 열한 줄짜리 패키지를 공개 레지스트리에서 삭제했고, 몇 시간 안에 전 세계에서 수천 건의 빌드가 깨졌습니다. 침해된 것은 없었고 누구도 공격받지 않았습니다. 이 일은 누구도 의도적으로 선택하지 않은 구성 요소가 그래도 아주 많은 작업을 멈춰 세울 수 있다는 것을 확정했습니다.
M.E.Doc과 NotPetya, 2017년
우크라이나의 세무 회계 제품의 갱신 경로가 그것을 운영하는 모든 조직에 파괴적인 악성 코드를 배포하는 데 쓰였고, 거기에서 연결된 네트워크를 통해 퍼졌습니다. Merck와 Maersk는 몇 주 동안 운영이 멈춘 회사에 속했습니다. 그 손실에 대한 Merck의 보험 청구는 약 14억 달러에 이르렀고 해결까지 여러 해의 소송이 걸렸습니다.
CCleaner, 2017년
널리 쓰이는 유틸리티의 백도어가 심긴 빌드가 벤더 자신의 인증서로 서명되어 벤더 자신의 다운로드 인프라를 통해 배포되었습니다. 침해가 발견되기 전에 약 227만 명의 사용자가 그것을 설치했습니다. 그 벤더는 바로 얼마 전에 인수되었으나, 증거는 그 거래보다 빌드 환경에의 침입을 가리킵니다.
Ticketmaster와 Inbenta, 2018년
서드파티가 제공한 챗봇 스크립트가 결제 페이지에서 실행되고 있었습니다. 침해된 것은 소매업체가 아니라 그 공급업체의 인프라였고, 최대 900만 명의 고객이 영향을 받았습니다. 규제 당국은 소매업체에 과징금을 부과했고, 소매업체는 자신이 작성하지 않은 스크립트에 대한 책임을 다투었습니다.
British Airways, 2018년
스크립트 스물두 줄이 항공사 자신이 호스팅하던 코드에 추가되었고, 3주에 걸쳐 약 429,000명의 결제 정보가 빠져나갔습니다. 이는 서드파티 공급업체의 실패가 아니라 같은 기법을 사용한 퍼스트파티 침해이며, 이 둘은 자주 그리고 잘못 한데 묶입니다. 규제 당국은 그 항공사에 2,000만 파운드의 과징금을 부과했습니다.
event-stream, 2018년
주당 수백만 번 내려받아지는 패키지에서 한발 물러나 있던 유지관리자에게 낯선 사람이 돕겠다고 접근했고, 그는 배포 권한을 부여했습니다. 두 달 뒤 새 유지관리자가 추가한 의존 관계가 특정 암호화폐 지갑을 노리는 페이로드를 담고 있었습니다. 그것은 그로부터 석 달 뒤에 코드를 읽던 한 개발자에 의해 발견되었습니다.
Stylish, 2017년
사용자가 약 200만 명인 브라우저 확장 기능이 2017년에 한 분석 회사에 인수되었습니다. 열여덟 달 뒤 한 연구자는 그것이 설치한 모든 사람의 전체 열람 기록을 새 소유자에게 보내고 있다는 것을 문서화했습니다. Chrome과 Firefox는 그 보고가 나온 며칠 안에 그것을 제거했습니다.
Nano Adblocker, 2020년
두 개의 광고 차단 확장 기능의 개발자가 2020년 10월에 그것을 매각하고 당시에 그 사실을 공개적으로 밝혔습니다. 약 2주 안에 새 소유자들은 사용자 데이터를 수집하는 갱신을 내보냈고, 그 확장 기능은 내려졌습니다. Polyfill.io의 간격이 4개월이고 xz-utils의 간격이 28개월이었던 데 비해, 이번 것은 2주였습니다.
ASUS, 2019년
올바르게 서명되어 벤더 자신의 서버에서 제공된 벤더 갱신 유틸리티가 많은 수의 기계에 백도어를 전달했습니다. 연구자들은 그 페이로드가 각 기계를 수백 개의 네트워크 주소로 이루어진 하드코딩된 목록과 대조하고 나머지 어느 것에도 아무 일도 하지 않았다는 것을 확인했습니다. 대량 배포는 매우 적은 수의 의도된 표적을 위한 전달 수단이었습니다.
SolarWinds, 2020년
공격자가 어느 네트워크 관리 제품의 빌드 파이프라인에 도달하여 서명된 릴리스에 코드를 삽입했습니다. 영향을 받은 버전을 설치한 고객은 18,000곳 미만으로 추정되며, 그 가운데 훨씬 적은 수가 더 깊이 추적되었습니다. 그것은 어느 고객이 아니라 자사 시스템에의 침입을 조사하던 한 보안 회사가 발견했습니다.
The Great Suspender, 2020년
설치 수가 200만을 넘는 브라우저 확장 기능이 개발자에 의해 신원이 공개되지 않은 매수자에게 매각되었습니다. 기능은 바뀌지 않았고 어떤 갱신도 이상하게 보이지 않았습니다. 악의적인 동작은 다섯 달 뒤에 나타났고, 그 확장 기능은 이듬해 2월에 제거되어 사용자의 기계에서 원격으로 비활성화되었습니다.
Kaseya, 2021년
관리형 서비스 제공업체가 고객을 관리하는 데 사용하는 원격 관리 플랫폼을 통해 랜섬웨어가 내보내졌습니다. 하류의 최대 약 1,500곳의 사업체가 영향을 받았으며, 그 대부분은 그 플랫폼에 대해 들어본 적조차 없었습니다. 그들은 자신이 운영하는 무엇을 통해서가 아니라 자신의 제공업체의 도구를 통해 노출되었습니다.
Log4Shell, 2021년
엄청나게 많은 애플리케이션에 들어 있던 Java 로깅 라이브러리의 결함이 손쉽게 악용할 수 있는 것이 되었고, 조직들은 그 라이브러리가 대체 어디에 있는지 확정하려고 몇 주를 보냈습니다. 대부분은 그 질문에 빠르게 답할 수 없었습니다. 그 혼란은 결함에 관한 것이라기보다 그것을 대조해 볼 목록이 전혀 없다는 데 관한 것이었습니다.
3CX, 2023년
한 직원이 개인 기계에 관련 없는 거래 소프트웨어의 트로이 목마가 심긴 사본을 설치했습니다. 공격자는 거기에서 얻은 자격 증명을 사용해 회사 자신의 빌드 환경에 도달하여 데스크톱 애플리케이션에 트로이 목마를 심었고, 그 애플리케이션의 고객 조직은 60만 곳이 넘었습니다. 이는 하나의 공급망 침해가 다른 침해를 준비하는 데 쓰인 가장 분명하게 문서화된 사례입니다.
MOVEit, 2023년
관리형 파일 전송 제품의 결함이 그것을 운영하는 조직과 그 조직이 데이터를 보유하던 훨씬 더 많은 곳에서 데이터를 빼내는 데 쓰였습니다. 추적 기관들은 영향을 받은 조직이 2,000곳을 훌쩍 넘고 개인이 수천만 명에 이른다고 기록했습니다. 그 개인 가운데 상당 비율은 그 소프트웨어와도, 그것을 운영하는 회사와도 아무 관계가 없었습니다.
xz-utils, 2021년부터 2024년까지
한 기여자가 2021년 10월에 핵심 압축 라이브러리에 첫 평범한 기여를 했고, 겉보기에 관련 없는 목소리들이 단독 유지관리자에게 도움을 받아들이라고 압박하는 활동이 이어진 뒤 2022년 중반에 더 큰 역할을 부여받았으며, 2024년 2월에 빌드 스크립트에 백도어를 삽입했습니다. 탐지할 부정한 단계 없이 스물여덟 달이 흘렀으며, 마지막 하나를 빼면 모든 단계가 진짜였기 때문입니다. 그것은 관련 없는 성능 문제를 조사하던 한 엔지니어가 우연히 발견했고, 안정 릴리스가 아니라 테스트 배포판과 롤링 배포판까지 도달해 있었습니다.
Polyfill.io, 2024년
널리 쓰이던 스크립트 서비스가 2024년 2월에 도메인과 리포지터리를 중국에 등기된 회사에 매각했고, 개발자들은 같은 달 공개 리포지터리 이슈에서 그 변경을 제기했습니다. 악의적인 리다이렉트가 6월 말에 독립적으로 문서화되었고, 10만 곳이 넘는 사이트가 영향을 받았습니다. 그 인수자는 관련 없는 사기 행위를 이유로 2025년 5월에 미국 재무부의 제재를 받았습니다.
CrowdStrike, 2024년
보안 에이전트에 대한 결함 있는 콘텐츠 갱신으로 인해 Microsoft에 따르면 약 850만 대의 Windows 기계가 부팅하지 못했습니다. 침해된 것은 없었고 누구도 무엇도 공격하지 않았습니다. 항공사, 병원, 은행이 멈춰 선 것은 모두가 같은 구성 요소에 의존했기 때문이며, 그것이 집중도가 우연히 실패할 때의 모습입니다.
tj-actions, 2025년
탈취된 접근 토큰이 널리 쓰이는 지속적 통합 액션의 버전 태그를 다시 쓰는 데 사용되어, 그 태그가 빌드 비밀 정보를 공개적으로 읽을 수 있는 로그에 출력하는 코드를 가리키게 되었습니다. 약 23,000개의 리포지터리가 그 액션을 참조하고 있었습니다. 그 토큰은 몇 달 전에 관련 없는 프로젝트를 통해 취득된 것이었습니다.
Shai-Hulud, 2025년
탈취된 배포 자격 증명이 패키지 릴리스에 코드를 추가하는 데 사용되었고, 그 코드는 그것을 설치한 기계에서 자격 증명을 수집한 뒤 그것으로 영향을 받은 릴리스를 더 배포했습니다. 이는 주요 패키지 레지스트리에서 스스로 번지는 침해가 문서화된 첫 사례입니다. 첫 물결에서 100개가 넘는 패키지가 영향을 받았습니다.

평가는 소유가 이동하는 순간 효력을 잃습니다

그것이 애초에 당사자를 해석해야 하는 이유이고, 그 뒤에 기록을 읽어야 하는 이유입니다. 지도를 만들어내는 방법론과 한 번의 세션이 확정하는 것은 다음 글에서 다룹니다.