2026년 7월 31일 01:31 UTC, 소유자가 아무것도 하지 않은 지갑들에서 비트코인이 빠져나가기 시작했습니다. 25분 뒤인 01:56까지, 약 500개의 단일 서명 지갑에서 약 594 BTC — 약 3,800만 달러 — 가 쓸려 나갔습니다. 이후 Galaxy Research의 분석과 Chainalysis의 보도는 약 1,196개 주소에 걸쳐 최대 약 1,083 BTC를 이 사건과 연결했습니다. 누구도 피싱을 당하지 않았습니다. 누구도 악성코드를 설치하지 않았습니다. 누구도 거래를 승인하지 않았습니다. 피해자들이 공유한 단 하나의 공통점은 지갑이 생성된 날짜였습니다 — 실패한 것이 바로 지갑 엔트로피, 즉 시드 문구의 재료가 되는 무작위성, 지갑의 생애 첫 1초에 확정되는 그것이었기 때문입니다.
문제의 지갑들은 Coldcard 하드웨어 기기에서 생성된 것이었고, 그 배후의 결함은 출하된 펌웨어 안에 5년 넘게 잠들어 있었습니다. 이 글에서는 무슨 일이 있었는지, 이 버그 부류가 왜 눈에 띄지 않은 채 남는지, 이 사건이 하드웨어 지갑에 대해 말해 주는 것과 말해 주지 않는 것 — 그리고 우리 제품을 포함해 어떤 지갑에든 그 무작위성에 관해 무엇을 물어야 하는지를 다룹니다.
2021년의 결함, 2026년의 현금화
Coinkite의 보안 권고에 따르면, 이 결함은 2021년 3월에 출시된 Coldcard 펌웨어 4.0.0에서 유입되었습니다. 영향을 받은 기기에서는 시드 생성이 하드웨어 난수 생성기를 건너뛰고, 비밀이 아닌 칩 데이터로 시드된 키 재료로 폴백했습니다. BIP39 시드 문구는 본래 128비트의 엔트로피 — 2¹²⁸개의 가능한 시드, 어떤 공격자도 탐색할 수 없는 공간 — 를 담아야 합니다. 그런데 영향을 받은 Mk3 기기에서 생성된 시드는 실질적으로 약 40비트의 엔트로피만을 담고 있었습니다. 2⁴⁰은 약 1.1조 개의 후보입니다 — 사람에게는 어마어마하지만, 기계에게는 전부 탐색 가능한 수입니다. Coldcard 취약점을 한 문장으로 설명하면 이렇습니다: 기기가 조용히 자신의 무작위성 사용을 멈췄는데, 겉으로 그것을 드러내는 것은 아무것도 없었다는 것입니다.
두 부류의 사용자는 처음부터 위험에 노출되지 않았습니다: BIP39 패스프레이즈와 함께 시드를 만든 사람, 그리고 50회 이상의 주사위 굴리기로 시드를 생성한 사람입니다. Coinkite는 문제를 공개하고 수정된 펌웨어 — Mk4와 Mk5용 5.6.0, Q용 1.5.0Q — 를 배포했습니다. 그 사이 5년 동안 영향을 받은 지갑들은 흠잡을 데 없이 작동했고, 안전한 지갑과 겉모습이 완전히 같았습니다. 자금을 쓸어 간 자는 피해자를 건드릴 필요조차 없었습니다: 약한 키 공간을 열거하고, 주소를 파생하고, 체인과 대조해 일치하는 것을 찾은 뒤, 단 25분의 시간 창 안에 전부 옮기면 그만이었습니다.
소리 없는 엔트로피 저하: 시드가 무작위로 보였던 이유
불편한 진실은, 영향을 받은 시드에서 잘못되어 보이는 부분이 단 하나도 없었다는 점입니다. 40비트의 예측 가능한 입력으로 만들어진 시드도 여전히 유효한 체크섬을 갖춘, 지극히 평범한 BIP39 단어 열두 개로 나옵니다. 지갑은 그것을 받아들이고, 주소를 파생하고, 거래에 서명합니다; 모든 화면은 강한 지갑이 보여 줄 것과 정확히 같은 것을 보여 줍니다.
통계적 검사도 도움이 되지 않습니다: 예측 가능한 데이터로 시드된 결정론적 생성기도 무작위성 검정을 통과하는 출력을 만들어 냅니다 — 비트는 고르게 분포되어 있지만, 가능한 수열의 집합이 파국적으로 작을 뿐입니다. 약점은 어떤 출력으로도 드러나지 않는 속성 안에 살고 있습니다: 그 대신 생성될 수 있었던 다른 시드가 몇 개나 되는가 하는 것이죠. 그 답은 오직 생성 코드만이 갖고 있습니다.
약한 시드는 약해 보이지 않습니다. 2¹²⁸과 2⁴⁰의 차이는 그 단어들을 만들어 낸 코드 안에만 존재합니다.
이것이 이 버그 부류가 수년씩 살아남는 이유이고, Coldcard 사건이 하나의 계보에 속하는 이유입니다. Libbitcoin의 bx 도구에서 발견된 Milk Sad, Trust Wallet 브라우저 확장의 MT19937 생성기, Cake Wallet, 배니티 주소 도구 Profanity, 초기 브라우저 지갑들의 Randstorm — 이 모두는 하나의 형태를 공유합니다: CSPRNG가 예측 가능한 소스로 소리 없이 대체되는 것입니다. 오류도, 경고도, 눈에 보이는 차이도 없습니다. 누군가 키 공간을 열거하기 전까지는요.
불편한 교훈
“하드웨어 지갑”은 폼 팩터의 이름이지, 보증의 이름이 아닙니다. 7월 31일에 쓸려 나간 지갑들은 서명 전용으로 설계된 하드웨어에서 만들어졌습니다 — 그리고 실패한 것은 그 층이 아니었습니다. 생존을 가른 것은 수년 전에 이미 고정된 속성, 즉 지갑이 만들어지던 그날 시드가 어떻게 생성되었는가였습니다. 그 하류의 모든 것 — 콜드 스토리지, 에어갭 서명, 꼼꼼한 검증 — 은 키를 도난으로부터 보호합니다. 하지만 키를 다시 만들어 낼 수 있다면, 그중 어떤 것도 도움이 되지 않습니다.
Coinkite가 결함을 공개하고 수정된 펌웨어를 신속히 배포했다는 사실도 똑같이 중요합니다. 이것은 부주의한 벤더에 관한 이야기가 아닙니다; 하드웨어와 소프트웨어를 가리지 않고 업계가 거듭 재발견해 온 실패 양식입니다. 어떤 지갑이든 — 우리 지갑을 포함해 — 소리 없는 폴백 하나만 있으면 같은 부류의 버그에 빠질 수 있습니다. 정직한 질문은 “어느 벤더가 면역인가?”가 아니라 “이 지갑은 어떻게 실패할 것이며, 그때 누군가 알아차릴 수 있는가?”입니다.
어떤 지갑에든 무작위성에 관해 던져야 할 다섯 가지 질문
기준을 높이는 데 암호학자가 될 필요는 없습니다. 다섯 가지 질문이면 지갑들을 의미 있게 가려낼 수 있습니다:
- 엔트로피 소스는 무엇인가? 시드는 CSPRNG에서 나와야 합니다. 타임스탬프, 기기 식별자, 또는 외부자가 재구성할 수 있는 그 어떤 것에서 나와서는 안 됩니다.
- 그 소스가 실패하면 어떻게 되는가? 받아들일 수 있는 답은 지갑 생성을 중단시키는 명시적 오류입니다. 받아들일 수 없는 답은 조용한 대체물입니다 — 소리 없는 폴백이야말로 이 버그 부류를 규정하는 특징입니다.
- 생성 경로는 오픈 소스이고 검증 가능한가? 약한 엔트로피는 출력에서는 보이지 않으므로, 코드 리뷰가 그것을 잡아낼 수 있는 유일한 곳입니다.
- 지갑이 BIP39 패스프레이즈를 지원하는가? 패스프레이즈는 기기의 생성기가 전혀 건드린 적 없는 비밀 재료를 더합니다. 영향을 받은 Coldcard에서 패스프레이즈 사용자들이 아무것도 잃지 않은 이유가 바로 이것입니다.
- 멀티시그라면, 키들이 독립적인 기기에서 생성되는가? 독립적인 기기는 곧 독립적인 무작위성을 뜻합니다: 결함 있는 생성기 하나는 키 하나를 위태롭게 할 뿐, 정족수를 위태롭게 하지는 못합니다.
Ownbit은 엔트로피를 어떻게 생성하는가
이런 질문에는 우리 자신의 제품에 관한 구체적인 답이 따라야 마땅합니다. Ownbit의 니모닉 생성은 두 개의 층으로 이루어져 있습니다. 앱 층에서는 generateMnemonicRandom(entropy, langIndex)이 표준 bip39 라이브러리의 generateMnemonic을 호출합니다 — 기본값은 128비트의 엔트로피이며, 여덟 가지 BIP39 단어 목록을 지원합니다: 영어, 중국어 간체와 번체, 일본어, 프랑스어, 이탈리아어, 한국어, 스페인어. 라이브러리 층에서는 bip39의 randomBytes가 crypto.getRandomValues — 플랫폼 CSPRNG — 에서 난수를 끌어옵니다.
여기서 중요한 것은 그 소스를 사용할 수 없을 때 무슨 일이 일어나는가입니다: 라이브러리는 오류를 던집니다. 시계도, 칩 식별자도, 그 어떤 2차 소스도 참조하지 않습니다 — 코드에 폴백 경로 자체가 없습니다. 실패 양식은 생성 시점의 요란한 오류이지, 소리 없이 약해진 시드가 결코 아닙니다. 이 속성 — 요란하게 실패하되, 결코 폴백하지 않는다 — 은 예측 가능한 소스로 생성이 조용히 이어졌던 Coldcard 사건, Milk Sad, Randstorm 배후의 결함과 정확히 반대입니다.
이것으로 Ownbit이 버그에 면역이 된다고 주장하지는 않겠습니다; 정직한 벤더라면 누구도 그럴 수 없습니다. 설계상 제거되는 것은 바로 이 실패의 형태입니다: Ownbit 지갑이 소리 없이 약한 시드를 생성하게 되는 코드 경로는 존재하지 않습니다. 나머지 모델은 보안 페이지에 정리되어 있습니다.
독립적으로 생성된 키가 이 버그 부류에서 살아남는 이유
7월 31일의 탈취는 단일 서명 지갑을 덮쳤습니다: 시드 하나, 서명 하나, 그리고 자금은 사라졌습니다 — 단일 실패 지점으로서의 시드 문구의 교과서적 사례입니다. 멀티시그는 이 산수를 바꿔 놓습니다. Ownbit 멀티시그 지갑에서는 모든 키가 각 참여자 자신의 기기에서 생성된, 그 자체로 하나의 표준 BIP39 시드 문구입니다. 어느 한 기기에 정확히 이 부류의 결함이 있었다고 가정해 봅시다. 2-of-3 지갑이라면, 약한 키 공간을 열거한 공격자가 손에 넣는 것은 키 하나 — 임계값 미달입니다. 아무것도 움직이지 않습니다. 약한 키는 손실이 아니라 유지보수 작업 — 교체하면 되는 일 — 이 됩니다.
보호는 “멀티시그”라는 단어가 아니라 독립성에서 나옵니다. 결함 있는 같은 기기 모델에서 생성된 세 개의 공동 서명자 키는 함께 무너질 것입니다. 진정으로 서로 다른 기기 — 매일 쓰는 휴대폰, QR 서명 콜드월렛으로 오프라인에 보관하는 남는 휴대폰, 가족의 기기 — 에서 태어난 세 개의 키는 생성기를 공유하지 않으므로 버그도 공유하지 않습니다. 같은 논리로, BIP39 패스프레이즈가 영향을 받은 Coldcard 사용자들을 구한 이유도 설명됩니다: 패스프레이즈는 기기 RNG가 만들어 낸 적 없는 비밀 재료이므로, 2⁴⁰개의 시드를 열거하는 것만으로는 자금을 쓸 수 없었습니다.
영향을 받은 Coldcard를 갖고 있다면
세 가지 조치입니다:
- 펌웨어를 업데이트하십시오. Coinkite의 권고에 명시된 수정 버전은 Mk4와 Mk5용 5.6.0, Q용 1.5.0Q입니다.
- 수정된 펌웨어에서 새로 생성한 시드로 자금을 옮기십시오. 업데이트는 앞으로 만들 시드를 보호할 뿐, 이미 있는 시드를 강하게 만들지는 못합니다. 약 40비트로 태어난 시드는 영원히 열거 가능한 상태로 남습니다 — 완전히 폐기하고, 결코 재사용하지 말고, 그 주소로 자금을 다시 보내지 마십시오.
- 취약 여부를 “확인”해 준다는 어떤 웹사이트에도 기존 시드 문구를 절대 입력하지 마십시오. 온라인의 무언가에 시드를 입력하는 것이야말로 남은 자금을 빼앗기는 방식입니다; “확인” 사이트는 이런 사건 뒤에 어김없이 등장하는 피싱 패턴입니다.
자주 묻는 질문
지갑 엔트로피란 무엇인가요?
지갑 엔트로피는 시드 문구를 만드는 데 쓰이는 무작위성입니다. 표준 12단어 BIP39 시드는 128비트의 엔트로피 — 2¹²⁸개의 가능한 시드 — 를 담습니다. 생성기가 예측 가능하다면 실제로 가능한 시드의 수는 붕괴하고, 그 뒤에 시드를 어떻게 보관했든 공격자는 그것들을 열거할 수 있습니다.
제 Coldcard도 영향을 받나요?
Coinkite의 권고에 따르면 이 결함은 2021년 3월 펌웨어 4.0.0에서 유입되었고, 영향을 받은 Mk3 시드는 128비트가 아니라 실질적으로 약 40비트의 엔트로피만을 담고 있었습니다. BIP39 패스프레이즈와 함께 만든 시드나 50회 이상의 주사위 굴리기로 생성한 시드는 위험하지 않습니다. 확신이 없다면 수정된 펌웨어 — Mk4/Mk5용 5.6.0, Q용 1.5.0Q — 로 업데이트하고, 새로 생성한 시드로 자금을 옮기십시오.
약한 시드를 눈으로 보고 알아낼 수 있나요?
아닙니다. 약한 시드도 유효한 체크섬을 갖춘 평범한 열두 단어를 만들어 내며, 통계적 검정으로는 예측 가능한 소스를 드러낼 수 없습니다. 강도는 단어가 아니라 생성 코드의 속성입니다 — 영향을 받은 지갑들이 5년 넘게 눈에 띄지 않은 이유가 바로 이것입니다.
멀티시그는 약한 엔트로피로부터 보호해 주나요?
구조적으로는 그렇습니다 — 단, 키들이 독립적인 기기에서 생성되었다는 전제 하에서요. 약한 키 하나는 공격자에게 서명 하나만 안겨 줄 뿐 — M-of-N 임계값 미달 — 자금은 움직이지 않습니다. 결함 있는 같은 기기 모델에서 생성된 키들은 함께 무너질 수 있으므로, 임계값만큼이나 독립성이 중요합니다.
하드웨어 지갑 사용을 그만둬야 하나요?
아닙니다. 교훈은 그보다 좁습니다: “하드웨어 지갑”이라는 말 자체가 보증이 아니라, 시드가 어떻게 생성되었는가가 보증입니다. 잘 관리되는 기기를 계속 사용하고, 펌웨어 업데이트를 적용하고, 지원되는 곳에서는 BIP39 패스프레이즈를 더하고, 진지한 잔액은 어느 하나의 시드가 아니라 멀티시그 임계값 뒤에 두십시오.
이번 사건으로 자신의 보관 설정을 다시 살펴보고 있다면, 구조적인 해법은 어느 하나의 시드가 당신의 자금과 공격자 사이에 홀로 서 있게 두지 않는 것입니다. Ownbit의 멀티시그 지갑은 독립적인 기기에서 생성된 키들 — 각각이 표준 BIP39 시드 문구입니다 — 에 M-of-N 임계값을 세웁니다. 모든 신규 사용자는 7일 무료 체험을 받으며, 어느 쪽이든 당신의 키는 여전히 당신의 것입니다.