Coldcard 익스플로잇: 결정론적 PRNG로 BTC 8,800만 달러 유출

2026년 8월 1일, 약 1,196개의 비트코인 주소가 조직적인 일제 인출로 비워졌다. 피싱도 없었고, 악의적인 PSBT 서명도 없었으며, 전통적인 의미의 사용자 실수도 없었다. 약 8,800만 달러 상당의 BTC를 빼돌린 Coldcard 취약점은 CoinDesk의 해당 사건 보도에 따르면 도난 당시 단 하나의 기기도 건드리지 않았다.
근본 원인은 처음 24시간 동안 내가 본 어떤 분석보다도 더 심각하다. 이것은 2021년에 출시된 하드웨어 지갑 펌웨어 결함으로, 하드웨어 진성 난수 생성기를 소프트웨어 의사난수 루틴으로 조용히 교체했다. 해당 빌드에서 생성된 모든 시드는 결정론적이었다. 그 시드에서 파생된 모든 주소는 원칙적으로 이 버그를 리버스 엔지니어링한 사람이라면 누구든 미리 계산할 수 있었다.
이것은 해킹이 아니다. 커밋과 결과 사이에 5년의 시차가 존재하는 것이다.
Coinkite 펌웨어 버그가 실제로 한 일
The Hacker News가 상세히 보도한 결함 있는 빌드는, SE 칩의 하드웨어 RNG 대신 작고 추측 가능한 상태값으로 시드된 소프트웨어 PRNG을 통해 엔트로피 호출을 처리했다. 사용자는 이 교체를 감지할 방법이 없었다. 기기는 부팅되었고, 예상되는 설정 화면을 보여주었으며, 24단어 시드를 생성했고, 올바르게 생성된 지갑과 외관상 동일했다.
이 기기가 생성한 시드는 수십억 가지 정도의 검색 가능한 공간 안에 존재했다. 이것은 지갑이 아니다. 복권 티켓이나 다름없다.
공격자(또는 이를 발견하고 책임 있는 방식으로 공개하지 않은 연구자)가 8월 1일 UTXO 세트를 대상으로 해당 공간을 탐색하기 시작했을 때, 인출은 수개월이 아니라 수 시간 만에 완료되었다.
1,196개라는 비트코인 주소 인출 수치가 중요한 이유
1,196은 절대적인 숫자로는 작지만, 신호로서는 엄청난 의미를 지닌다. 이 수치는 해당 펌웨어 버전에서 시드를 생성하고 한 번도 교체하지 않은 사용자 모집단의 범위를 한정한다. 이는 피해 규모에 대해 검증 가능하고 반증 가능한 주장이며, TechSpot의 기사도 영향을 받은 기기들이 특정 출하 기간으로 거슬러 올라간다는 점을 확인해 준다.
다른 펌웨어에서 시드를 생성했거나, 펌웨어 업데이트 후 시드를 교체했다면 거의 확실히 문제없다. 해당 빌드에서 생성하고 한 번도 옮기지 않았다면, 이미 털린 것이다. 그저 몰랐을 뿐이다.
눈에 잘 띄지 않는 세부 사항이 하나 있다. 인출된 UTXO 중 일부는 2021년 이후 한 번도 움직이지 않은 것들이었다. 5년간 "내 키, 내 코인"을 외쳤지만, 그 키는 처음부터 진정한 내 것이 아니었다.
결정론적 PRNG 비트코인 문제는 오래됐고, 계속 반복된다
이 종류의 버그에는 길고 부끄러운 역사가 있다. 2013년 안드로이드의 SecureRandom도 같은 방식으로 사람들의 BTC를 잃게 했다. 2008년 데비안 OpenSSL PRNG 버그는 누군가 알아채기까지 2년 동안 SSH 키를 무력화했다. 세대마다 우리는 엔트로피가 출력 결과를 들여다보는 것만으로는 감사할 수 없는 유일한 요소라는 사실을 다시금 깨닫는다.
잘 형성된 랜덤 256비트 숫자와 결정론적 256비트 숫자는 외관상 동일하게 보인다. 감사해야 할 대상은 출력값이 아니라 소스다. 이것이 핵심이다.
하드웨어 지갑은 보안 요소(SE)가 이 부분을 대신 처리해 준다는 전제를 판매한다. 펌웨어가 SE를 우회하면, 콜드 스토리지의 불편함은 그대로 감수하면서 그 어떤 보안 보장도 받지 못하는 최악의 상황이 된다.
자기 수탁 vs ETF 논쟁은 사람들이 생각하는 것과 다르다
내 의견을 밝히겠다. 자기 수탁 대 ETF 논쟁은 이념의 문제로 프레임이 씌워져 왔지만, 실상은 공급망의 문제다.
스팟 BTC ETF에서 내가 신경 쓰는 공격 표면은 하나다: 수탁 기관의 운영 보안. 이 표면은 규제 기관이 감사할 수 있고, 보험 가입이 가능하며, 코인을 잃지 않는 것이 본업인 사람들로 구성된다. 실패하면 누군가 수표를 쓴다.
자기 수탁(self-custody)은 더 긴 체인을 가진다: 칩 제조사, 펌웨어 빌드 파이프라인, 릴리스 서명, 공급 경로, 최종 사용자 OPSEC, 백업 관리. 어느 한 링크가 끊어지면 수표는 없다. Coldcard 유출 사태는 이 테제에 있어 Terra 모멘트다. 자기 수탁이 끝났기 때문이 아니라, "그냥 직접 키를 보관하라"는 맥시멀리스트식 프레이밍이 성숙해야 하기 때문이다.
두 모델 모두 실질적인 위험이 있다. 둘 중 하나가 위험 없다고 가장한 것이 1,196개 주소를 탈탈 털리게 만든 원인이다.
Coldcard 익스플로잇 이후 실제로 달라지는 것들
내가 생각하기에 바뀔 (그리고 바뀌어야 할) 몇 가지:
- 재현 가능한 펌웨어 빌드가 기본 조건이 된다. 소스에서 바이너리를 재빌드해 바이트 단위로 대조할 수 없다면, 코드베이스가 아닌 서명을 신뢰하는 것이다.
- 생성 후 엔트로피 증명. 기기는 특정 시드가 소프트웨어가 아닌 보안 요소(SE)에서 생성되었다는 증명에 서명해야 한다. 어려운 일이 아니다. Coinkite라면 한 분기 안에 출시할 수 있다.
- 독립적인 시드 유효성 검사. 시드를 직접 확인하지 않고도, 그 파생 경로가 진정한 무작위성과 일치하는 분포에 속한다는 것을 검증할 수 있는 서드파티 도구.
- 자기 수탁을 위한 보험 상품. 흉내만 내는 것 말고. 증명된 펌웨어를 요구하고 빌드가 노후화됨에 따라 보장을 갱신하는 실질적인 언더라이팅.
이 중 어느 것도 하드웨어 지갑을 쓸모없게 만들지 않는다. 오히려 항상 주장해 왔던 것처럼 엔터프라이즈급으로 만들어 준다.
우리에게 불편한 시사점
LCX에서 우리는 사용자 눈에 보이지 않는 것들에 불균형할 정도로 많은 엔지니어링 시간을 쏟는다: HSM 키 세레모니, 결정론적 빌드 파이프라인, 개인 키를 건드리는 모든 코드 경로에 대한 엔트로피 감사. 지루한 작업이다. 그리고 그것이 헤드라인과 평범한 화요일의 차이를 만든다.
Coldcard 사건은 올해 초 DeFi 감사에 대한 OpenZeppelin CEO의 발언과 같은 무게감으로 다가온다. 우리가 물려받은 감사 스택은 배포한 코드가 곧 실행되는 코드인 세계를 전제로 설계되었다. 그러나 지금은 그런 세상이 아니다. 애초에 그런 세상이 존재했는지조차 의문이다.
콜드 스토리지는 따분하지만 올바른 답으로 여겨졌다. 알고 보니, 따분함을 지키려면 우리가 인정했던 것보다 훨씬 많은 뒷받침이 필요했다.