콜드카드가 존재하는 이유는 바로 개인키가 절대 인터넷에 닿지 않게 하기 위해서다. 캐나다 창업가 Jonathan Goodman은 이 원칙을 철저히 지켰다. 개인키를 저장한 콜드카드는 한 번도 인터넷에 연결된 적 없이 은행 금고에 넣어뒀고, 니모닉 시드는 별도로 두 번째 금고에 보관해 누구에게도 보여준 적이 없었다. 그러나 7월 29일, 그의 지갑은 완전히 털렸고 18.25 비트코인을 잃었다. 당시 시세로 117만 달러가 넘는 금액이었다. "가장 견디기 힘든 건, 내가 모든 걸 제대로 했다는 사실이다." 그는 8월 1일 X에 이렇게 적었다.

Goodman만이 아니다. 연구기관 Galaxy Research는 약 7,300개 주소에서 연쇄 공격을 통해 1,596 비트코인, 1억 달러 이상이 도난당했을 것으로 높은 확신을 갖고 밝혔다. 이 기관의 리서치 책임자 Alex Thorn은 8월 4일, 최소 15개 이상의 서로 다른 공격 그룹이 동일한 취약점을 악용했으며, 그중 어느 그룹도 기기를 실제로 만질 필요가 없었다고 추정했다.

문제는 하드웨어가 아니라, 시드가 생성되는 방식에 있었다

Block의 조사에 따르면, 이번 사건의 핵심은 콜드카드 기기 자체가 해킹당한 게 아니라 자금을 보호하는 니모닉 시드가 생성되는 단계에서 오류가 발생했다는 데 있다. 비트코인 지갑의 무작위성(엔트로피)은 시드를 얼마나 추측하기 어렵게 만드는지를 결정하며, 비트(bit) 하나가 늘어날 때마다 가능한 조합의 수는 두 배로 늘어난다. 콜드카드는 원래 기기에 내장된 하드웨어 난수 생성기에서 무작위성을 얻어야 했지만, 설정 오류로 인해 더 단순한 소프트웨어 생성기를 사용하게 됐다. 이 소프트웨어는 기기 정보와 타임스탬프에 의존하는 방식이라 완전한 무작위가 아니었고, 범위를 좁히거나 심지어 재현하는 것도 가능했다.

Coldcard 種子生成漏洞內幕:鎖進保險箱也擋不住的比特幣竊案

영향을 받은 정도는 모델마다 달랐다. Mk2와 Mk3 기기는 이 과정에서 안전한 무작위성을 전혀 얻지 못했다. Mk4, Q, Mk5는 일부를 얻긴 했지만, 소프트웨어가 그중 극히 일부만 남겨두는 방식이었다. Coinkite의 추정에 따르면, 이 최신 기기들은 실제로 72비트의 무작위성만 생성했으며, 이는 설계 목표였던 128비트에 훨씬 못 미치는 수치로, 시드의 가능한 조합 수를 원래보다 2의 56제곱분의 1 이하로 줄여버린 셈이다.

4년간 숨어 있던 오류, 출처는 펌웨어 4.0.0

이 결함은 2021년 3월 17일, 펌웨어 4.0.0과 함께 콜드카드에 유입됐다. 당시 Coinkite의 버전 설명에는 "All New Code, Same Great Features"라고 적혀 있었고, 감사(credit) 목록에는 새로운 소스코드 라이브러리를 제공한 "switck"이라는 계정에 대한 감사 인사가 포함돼 있었다. 비트코인 개발자 James O'Beirne은 감사(audit) 과정에서 "switck" 계정 명의로 공개된 58건의 코드 변경 내역을 대조한 결과, 이 변경들에 Coinkite 공동창업자 Peter Gray가 본명으로 게시할 때 사용한 것과 동일한 암호학적 서명이 포함돼 있다는 사실을 발견했다. 이는 switck이 곧 Gray 본인임을 사실상 확인시켜준다. switck이 개발한 libngu 라이브러리는 사용자 기기의 콜드카드 펌웨어에 통합됐으며, 이 라이브러리가 맡은 역할 중 하나가 바로 지갑 생성에 필요한 무작위성을 만드는 것이었다.

O'Beirne은 올해 5월 감사 과정에서 이미 이 프로세스에 의문을 제기하며 Coinkite 측에 결함 가능성을 전달했지만, "만약 정말 문제가 있었다면 진작 발견됐을 것"이라는 답변을 받았다고 말했다. Coinkite는 사후에, 자사가 자체적으로 진행한 AI 보조 검토에서도 사건 발생 전까지 이 오류를 잡아내지 못했다고 밝혔다. 취약점이 드러난 뒤 여러 주요 AI 모델로 다시 테스트해봤지만, 마찬가지로 문제를 찾아내지 못했다.

Coinkite는 영향을 받은 모든 모델과 배포 채널에 수정 펌웨어를 배포했지만, 이 수정은 '앞으로' 생성될 시드에만 유효할 뿐, 이미 결함이 있던 소프트웨어로 생성된 기존 시드를 구제할 수는 없다. 영향을 받은 사용자는 수정 펌웨어를 설치하고 새로운 시드를 다시 생성한 뒤, 비트코인을 새 주소로 옮겨야 한다. Goodman처럼 개인키와 니모닉 시드를 서로 다른 금고에 나눠 보관한 사용자들은 물리적인 탈취는 막을 수 있었지만, 시드가 생성되는 그 순간부터 이미 충분히 무작위적이지 않았다는 사실만큼은 막을 수 없었다.