Coldcard 사고는 해킹 뉴스가 아니라 난수 설계 실패다

2026년 7월 30일부터 Coinkite Coldcard 하드웨어 지갑에서 생성된 일부 시드가 오프라인으로 복원되며 자금이 빠져나갔습니다. 초기 온체인 집계는 약 1,196개 주소, 1,082 BTC였고, 이후 파도가 겹치며 피해 규모는 더 커졌습니다. 이 글은 시세를 쫓는 속보가 아닙니다. 왜 물리적으로 봉인된 장치가 원격으로 털리는지, 그리고 펌웨어 업데이트만으로 이미 만든 지갑이 살아나지 않는지를 설계 관점에서 정리합니다.

사실관계의 1차 출처는 Coinkite 공지와 Galaxy Research·TRM Labs 등의 온체인 분석입니다. 수치는 집계 시점에 따라 달라지므로, 의사결정에는 공식 공지의 최신본을 우선하십시오.

HD 지갑의 기본 구조부터: 왜 시드 하나가 전 재산인가

Coldcard 같은 계층적 결정성(HD, BIP32/BIP39/BIP44) 지갑은 하나의 시드에서 수많은 주소를 결정적으로 파생시킵니다. 12~24개 단어(BIP39 니모닉)는 사실 128~256비트 엔트로피를 사람이 옮겨 적을 수 있게 인코딩한 것입니다. 시드 하나만 있으면 이론적으로 그 지갑이 만든 모든 과거·미래 주소의 개인키를 재계산할 수 있습니다. 즉 HD 지갑의 편의성(백업 문구 하나로 전체 복구)은 동시에 공격 표면이 “시드 생성 과정” 단 한 지점으로 집중된다는 뜻이기도 합니다. Coldcard 사고가 무서운 이유는 여기 있습니다 — 개별 주소가 아니라 그 주소들을 낳은 근원이 약했던 것입니다.

무엇이 깨졌는가

Coldcard는 비트코인 전용 콜드월렛입니다. 시드는 장치 안의 난수로 만들어지고, 개인키는 원칙적으로 밖으로 나가지 않습니다. 2021년 3월 전후 펌웨어 빌드에서 시드 생성 경로가 STM32 하드웨어 TRNG가 아니라 결정적 소프트웨어 PRNG로 떨어지는 구성 오류가 들어갔습니다. 엔트로피가 128비트 수준이 아니라 브루트포스가 가능한 수준까지 줄어든 장치가 있다는 것이 핵심입니다.

계층 정상 설계 사고 지점
엔트로피 소스 하드웨어 TRNG 소프트웨어 PRNG 폴백
시드 공간 실질 128비트 이상 약 40비트까지 축소됐다는 분석
공격 전제 장치 탈취, 핀홀, 사이드채널 공개 주소만으로 오프라인 탐색
패치 효과 이후 생성분부터 안전 이미 만든 약한 시드는 그대로 약함

보안 경계는 “장치가 오프라인인가”가 아닙니다. “비밀의 엔트로피가 충분한가”입니다. 난수가 약하면 콜드월렛은 비싼 종이 지갑과 같습니다.

128비트와 40비트, 숫자로 보는 차이

128비트 키 공간은 2^128 ≈ 3.4×10^38개의 후보를 가집니다. 지구상의 모든 컴퓨팅 자원을 총동원해도 현실적인 시간 안에 전수 조사가 불가능한 규모입니다. 반면 유효 엔트로피가 40비트 수준으로 축소되면 후보 공간은 2^40 ≈ 1.1×10^12, 약 1조 개로 줄어듭니다. 일반적인 GPU 클러스터나 클라우드 대여 컴퓨팅으로 며칠에서 몇 주 안에 전수 탐색이 가능한 규모입니다. “128비트에서 40비트로 줄었다”는 표현이 실감 나지 않을 수 있지만, 후보 공간은 비트 하나가 줄 때마다 절반이 됩니다. 88비트가 줄었다는 것은 후보 공간이 2^88배, 즉 대략 3×10^26배 줄었다는 뜻입니다. 안전과 위험 사이에 회색지대가 없는 이유입니다.

역사가 반복되는 지점: 약한 난수는 새로운 취약점이 아니다

소프트웨어 난수 생성기 결함으로 인한 암호화폐·인증서 피해는 이번이 처음이 아닙니다. 2013년 안드로이드 SecureRandom 구현 결함으로 일부 비트코인 지갑의 서명에 사용된 난수가 재사용되며 개인키가 역산된 사례가 있었고, 2008년 Debian OpenSSL 패키지의 엔트로피 소스 제거 버그는 수년간 생성된 SSH 키·SSL 인증서의 상당수를 예측 가능하게 만들었습니다. 두 사례 모두 공통점은 “겉보기엔 정상 작동”하지만 내부 엔트로피 소스가 조용히 축소되어 있었다는 점입니다. Coldcard 사고는 이 오래된 실패 패턴이 하드웨어 지갑이라는 “물리적으로 안전해 보이는” 제품군에서도 예외가 아니라는 것을 다시 보여줍니다.

공격이 물리 접근 없이 가능한 이유

비트코인 주소는 공개됩니다. 공격자는 약한 생성기로 만들 수 있는 시드 공간을 미리 훑고, 나온 주소를 온체인에서 대조합니다. 일치하는 주소에 잔고가 있으면 같은 시드로 서명합니다. 이 과정에 장치 USB 연결이 필요 없습니다. “콜드”라는 단어가 주는 직관과 반대입니다.

2026년 7월 30일 첫 파도는 수십 분 단위로 주소가 비워지는 형태였습니다. 이후에도 소액 주소가 이어서 빠졌습니다. 이는 취약 시드 목록을 한 번 만들어 두고, 입금이 생기는 족족 쓸어 가는 패턴과 맞습니다. 펌웨어를 올린 뒤에도 같은 시드를 쓰는 한 주소는 계속 위험합니다.

사용자가 지금 해야 하는 일

  • 공식 도메인(blog.coinkite.com)만 봅니다. X·텔레그램의 복구 지원은 2차 피싱입니다.
  • 해당 장치에서 만든 시드라면, 패치된 환경 또는 다른 검증된 지갑에서 새 시드를 만듭니다.
  • 자금을 새 주소로 옮깁니다. 기존 시드는 폐기합니다. 백업 종이도 폐기합니다.
  • 펌웨어 업데이트는 이후 생성분을 보호합니다. 과거 시드를 “고치지” 않습니다.
  • 시드 12/24단어를 누구에게도 보내지 않습니다. 본 사이트 문의에도 보내지 마십시오.

설계자가 가져갈 교훈

엔터프라이즈 키 관리나 자체 수탁을 설계할 때도 같은 질문이 반복됩니다.

  • 폴백 난수를 허용하는가. TRNG 실패 시 생성을 중단하는가, 약한 경로로 진행하는가. 가용성을 택한 순간 보안 가정이 바뀝니다.
  • 빌드 재현성. 2021년 구성 오류가 2026년에 현금화됐습니다. 릴리스 체크섬과 재현 빌드가 없으면 5년 된 버그를 찾을 수 없습니다.
  • 패치와 비밀의 수명. 소프트웨어 업데이트로 고칠 수 있는 것과, 이미 샘플링된 비밀은 다릅니다. 인증서, JWT 시크릿, 지갑 시드가 같은 부류입니다.
  • 단일 공급자 신뢰. 하드웨어 지갑 1종에 전 재산을 두는 것은 단일 장애점입니다. 멀티시그와 제조사 분산이 운영 표준이어야 합니다.
수탁 방식 강한 지점 이번 사고에서 드러난 약한 지점
단일 하드웨어 지갑 간단, 오프라인 직관 생성기 한 곳이 무너지면 전액
멀티시그 (2-of-3 등) 장치 1대 타격 흡수 구성이 복잡, 수수료·복구 절차 필요
거래소 커스터디 UX, 출금 정책 거래소 해킹·동결. 이번 사고의 반대편 위험

설계 원칙: TRNG 실패 시 “안전하게 멈추기”

보안 시스템 설계에서 흔히 간과되는 원칙이 “실패 시 안전한 방향으로 멈추는가(fail-safe vs fail-open)”입니다. Coldcard 사고의 근본 원인은 하드웨어 TRNG를 읽지 못했을 때 시스템이 생성을 중단하는 대신 소프트웨어 PRNG로 조용히 넘어간 것입니다. 이는 가용성(사용자가 언제나 시드를 만들 수 있음)을 보안(약한 엔트로피로는 절대 만들지 않음)보다 우선한 설계 선택이었습니다. 키 관리 시스템, HSM(하드웨어 보안 모듈), 사내 PKI를 설계할 때도 동일한 질문을 던져야 합니다. 엔트로피 소스 자가진단(health check)이 실패하면 시스템은 조용히 대체 경로로 넘어가야 하는가, 아니면 명시적으로 멈추고 경보를 울려야 하는가. 정답은 언제나 후자입니다.

이 글이 다루지 않는 것

피해 확정 금액의 실시간 집계, 특정 주소 추적, 토큰 가격 해석은 다루지 않습니다. 초기 보도의 $70M과 이후 $116M대 추정은 집계 범위가 다르기 때문에 둘 다 “틀린 뉴스”라기보다 시점 다른 스냅샷입니다. 숫자보다 재현해야 할 것은 생성 경로의 엔트로피입니다.

엔트로피가 줄면 오프라인 탐색이 되는 이유

128비트 시드는 전수 조사가 현실적이지 않습니다. 생성 경로가 소프트웨어 난수로 떨어지고 유효 비트가 수십 비트 수준으로 줄면, 공격자는 장치를 열지 않고도 후보 시드를 만들어 주소를 대조합니다. 공개 주소가 곧 검색 키가 됩니다. 이 때문에 “콜드”라는 직관이 깨집니다. 오프라인은 전송 경로의 성질이지, 비밀 공간의 크기가 아닙니다.

펌웨어를 올린 뒤에도 같은 시드를 쓰면 주소는 그대로입니다. 패치가 고치는 것은 이후 샘플링입니다. 이미 뽑힌 비밀은 JWT를 재발행하지 않고 키 파일만 덮어쓰는 것과 같습니다. 운영에서 할 일은 새 시드, 새 주소, 옛 백업 폐기의 세 줄입니다.

기관이라면 추가로 볼 것

  • 시드 생성 시점의 펌웨어 해시가 자산 대장에 있는가.
  • 단일 제조사·단일 시드에 전액이 모여 있지 않은가.
  • 복구 절차가 “지원 계정에 단어를 보낸다”로 적혀 있지 않은가. 그 문장은 피싱입니다.
  • 엔트로피 소스 자가진단 실패 시 생성 중단·경보 로직이 문서화되어 있는가.
  • 정기적으로 펌웨어 릴리스 노트와 CVE·보안 공지를 구독하고 있는가.

이미 만든 지갑을 살리는 패치는 없다

펌웨어를 올려도 주소는 시드의 함수입니다. 약한 엔트로피로 뽑힌 단어 목록은 새 바이너리와 무관합니다. 대응은 새 장치·새 시드·자산 이동·옛 백업 파기입니다. “나중에 옮긴다”는 공개 주소가 탐색 키로 남아 있는 시간과 같습니다.

대상 할 일 하지 말 일
개인 새 시드, 소액 시험 송금 후 이전 지원 센터에 단어 12개를 보냄
팀 금고 제조사·펌웨어 시각을 자산 대장에 기록 단일 시드에 전액
복구 문서 오프라인, 조각 보관 클라우드 메모, 채팅 첨부

기관이라면 멀티시그와 제조사 분산이 기본입니다. 같은 공급자의 같은 펌웨어 세대에 전액을 두는 것은 단일 장애점입니다. 사고 공지의 온체인 수치는 집계 시점에 달라집니다. 의사결정은 최신 공식 공지와 자체 주소 대조로 하십시오. 이 글은 투자 권유가 아닙니다.

Takeaway

  • Coldcard 사고의 본질은 펌웨어 폴백이 시드 엔트로피를 떨어뜨린 것입니다. 물리 탈취가 아닙니다.
  • 펌웨어 패치는 이후 시드만 보호합니다. 약한 시드는 폐기하고 자금을 옮기는 수밖에 없습니다.
  • 콜드월렛 신뢰는 “칩이 있나”가 아니라 “난수 경로가 실패 시 중단되는가”로 검증해야 합니다.
  • 개인이든 기관이든 단일 장치·단일 시드는 아키텍처가 아닙니다.
  • 128비트에서 비트 수가 줄어들 때마다 후보 공간은 절반이 됩니다. “조금 줄었다”는 표현에 속으면 안 됩니다.
  • 약한 난수로 인한 피해는 2008년 Debian OpenSSL, 2013년 Android SecureRandom 사례처럼 반복되어 온 실패 패턴입니다.

관련 공식 출발점: Coinkite seed generation warning, TRM Labs 분석.

댓글 남기기