무작위성이 무너질 때: Coldcard 엔트로피 결함과 두 기기가 바꾸는 것

·6분 읽기·작성자: SSP Editorial Team
SSP Academy 커버: Coldcard 엔트로피 결함과 두 기기 구조

무작위성이 무너질 때: Coldcard 엔트로피 결함과 두 기기가 바꾸는 것

2026년 7월 말, 공격자들이 아무 잘못도 하지 않은 수천 개의 하드웨어 지갑에서 비트코인을 빼내기 시작했습니다. 주인들은 조언을 따랐습니다. 서명 전용 기기를 샀고, 시드를 오프라인에 두었고, 웹사이트에 입력한 적이 한 번도 없었습니다. 그 무엇도 소용이 없었습니다. 그 기기들이 만들어 낸 시드가 보이는 것만큼 무작위였던 적이 애초에 없었기 때문입니다.

약 1,816 BTC가 5,200개가 넘는 주소에서 네 차례에 걸쳐 빠져나갔습니다. 그것은 올해 최대의 하드웨어 지갑 익스플로잇이 되었습니다.

이 글은 승리의 한 바퀴가 아닙니다. 여기 연루된 결함은 우리 것을 포함해 거의 어떤 지갑에도 일어날 수 있었던 종류이고, 흥미로운 물음은 누가 그것을 내보냈는가가 아니라 그 일이 벌어졌을 때 지갑의 구조가 무엇을 하는가입니다.

실제로 무엇이 잘못되었나

커밋 하나, 2021년 3월에.

Coldcard의 설계는 시드를 하드웨어 난수 생성기 — 물리적 과정에서 엔트로피를 뽑아내는 전용 칩 — 에서 만들도록 했습니다. 그것이 옳은 방식입니다. 그런데 펌웨어 4.0.1의 한 변경이 시드 생성을 대신 공개된, 코드에 박힌 상수로 시드를 준 소프트웨어 의사난수 생성기를 통과하게 만들었습니다.

의사난수 생성기는 정의상 결정론적입니다. 같은 시작값을 주면 언제나 같은 수열을 내놓습니다. 그러니 그렇게 만들어진 시드는 아무도 알아맞힐 수 없는 수가 아닙니다 — 훑어볼 수 있을 만큼 작은 집합에서 뽑힌 수이고, 그때 쓰인 상수는 내내 공개된 펌웨어 안에 놓여 있었습니다.

기기들은 계속 정상으로 굴었습니다. 스물네 개의 단어를 보여 주었고, 사람들은 그것을 받아 적었고, 올바른 주소를 도출했고, 유효한 트랜잭션에 서명했습니다. 당신의 시드에 얼마만큼의 엔트로피가 들어갔는지 보여 주는 화면은 어떤 지갑에도 없습니다. 영향을 받은 모든 사용자는, 최대 5년 동안, 멀쩡한 기기와 똑같이 보이고 똑같이 움직이는 기기를 갖고 있었습니다.

창은 2021년 3월 펌웨어 4.0.1부터 2026년 7월 4.1.9까지입니다. 펌웨어 업데이트는 그 뒤의 생성을 고쳤을 뿐, 이미 만들어진 시드에는 아무것도 하지 못했습니다. 그 키들은 이미 약했고, 어떤 업데이트도 누군가의 금고 속 카드에 벌써 적힌 숫자에 소급해서 무작위성을 더해 줄 수는 없습니다. 영향을 받은 사용자는 새 시드를 만들고 코인을 옮겨야 했습니다.

왜 약한 무작위성은 조용한 전손인가

이 부류의 결함이 왜 그토록 무거운지 정확히 말해 둘 값어치가 있습니다. 직관적이지 않기 때문입니다.

24단어 BIP-39 시드는 256비트의 엔트로피를 나타냅니다. 하나를 알아맞히는 일은 단지 어려운 것이 아니라 상상 불가능합니다. 그 공간을 무차별 대입할 컴퓨터는 지금도 앞으로도 없습니다. 자기 보관 모델 전체가 이 토대 위에 놓여 있습니다. 당신의 키가 안전한 것은 그것이 헤아릴 수 없이 많은 가능성 가운데 하나이기 때문입니다.

그 보장은 단어들의 성질이 아닙니다. 그 단어들을 고른 과정의 성질입니다. 약한 생성기에서 뽑은 스물네 단어는 강한 생성기에서 뽑은 스물네 단어와 똑같아 보입니다. 모든 체크섬을 통과하고, 유효한 주소를 만들어 내고, 어떤 지갑에서도 완벽하게 복구됩니다. 유일한 차이는 다른 누군가도 거기 도달할 수 있다는 것입니다.

그러니 이 실패는 안쪽에서는 보이지 않고, 그리고 완전합니다. "당신이 실수하면 공격자가 훔쳐 갈 수 있다"가 아닙니다 — 피할 실수도, 거절할 피싱 링크도, 꼼꼼히 읽을 확인 창도 없습니다. 돈은 공격자가 편할 때 가져갈 수 있는 상태이고, 무언가 잘못되었다는 첫 신호는 그것이 사라졌다는 사실입니다.

두 기기가 바꾸는 것

같은 결함, 두 개의 구조

여기가 구조적으로 중요한 대목이고, 마케팅 용어가 아니라 정확하게 말하고 싶습니다.

SSP는 2-of-2 멀티시그입니다. 자금은 두 개의 독립된 기기에서 만들어진 두 개의 독립된 키가 통제하는 주소에 있습니다 — 하나는 브라우저 확장에, 하나는 SSP Key 모바일 앱에 — 그리고 트랜잭션은 두 서명을 모두 요구합니다. 둘 중 둘 짜임이 이 지갑의 토대 전부입니다.

이제 Coldcard의 시나리오를 그 구조에 대고 돌려 보십시오. 확장의 시드 생성에 같은 결함이 있었고, 공격자가 당신의 브라우저 키를 온전히 도출해 낼 수 있다고 합시다.

그래도 그는 아무것도 쓸 수 없습니다. 그는 필요한 두 서명 중 하나를 쥐고 있습니다. 그 주소는 누구의 키든, 어떻게 얻었든, 키 하나로는 자금을 내놓지 않습니다. 당신의 코인을 옮기려면 당신 휴대폰의 키까지 독립적으로 그리고 동시에 깨야 합니다 — 다른 애플리케이션, 다른 운영체제, 다른 엔트로피 원천, 다른 시각에 만들어진 것을요.

그것이 구조적인 차이입니다. 단일 키 지갑에서 약한 시드는 전손입니다. 2-of-2에서 약한 시드는 심각한 문제이되, 그 자체로는 손실이 아닙니다.

한계를, 분명히

여기서 멈추고 SSP는 이것에 면역이라는 결론을 내리게 두기는 쉬울 것입니다. 그렇지 않고, 남의 사고가 진행 중일 때 그런 척하는 것은 바로 가장 부적절한 순간입니다.

SSP의 두 애플리케이션은 같은 BIP-39 구현을 씁니다 — @scure/bip39, 양쪽 모두 같은 버전에 고정되어 있습니다. 그 라이브러리 자체의 결함은 두 키 모두에 닿습니다. SSP가 주는 독립성은 실재하지만 구체적입니다. 서로 다른 시각에, 서로 다른 기기에서 만들어진 두 개의 별도 시드가, 서로 다른 운영체제 원천에서 엔트로피를 끌어옵니다 — 한쪽은 브라우저의 Web Crypto, 다른 쪽은 모바일 플랫폼의 CSPRNG. 완전히 무관한 두 코드베이스의 독립성은 아닙니다.

그것이 사 주는 것은 Coldcard에서 실제로 벌어진 실패 양상에 대한 방어입니다. 곧, 한 제품이 시드를 만드는 방식에서 벌어진 기기 특유의 구현 오류에 대한 방어. 둘 아래에 놓인 공유 암호 원시 요소의 결함은 막아 주지 못합니다.

이것은 "우리에게는 일어날 수 없다"보다 뚜렷하게 약한 주장이고, 참인 쪽입니다. 자기 지갑이 엔트로피 실패에 원칙적으로 면역이라고 말하는 사람은 자기 구조가 아니라 자기 마케팅을 이야기하고 있는 것입니다.

여기서 가져갈 것

그 펌웨어 창에 해당하는 Coldcard를 갖고 계시다면, 자금이 움직였든 아니든 시드가 침해되었다는 가정만이 안전합니다. 패치된 펌웨어에서 새 시드를 만들고 옮기십시오. 아직 비워지지 않은 기기가 안전한 기기인 것은 아닙니다.

단일 키 지갑을 쓰신다면, 이것이 당신이 지고 있는 위험이고, 불안해하기보다 의식해 둘 값어치가 있습니다. 하드웨어 지갑은 대부분의 사람에게 여전히 대안들보다 훨씬 낫습니다. 교훈은 그것이 나쁘다는 것이 아닙니다. 키가 하나면 단일 실패 지점도 하나이고, 그 키의 내력 가운데 어느 대목이든 — 몇 해 전, 당신이 읽지 않은 펌웨어 안에서 그것이 태어난 순간까지 포함해 — 당신의 위협 모델의 일부라는 것입니다.

그리고 일반적으로, 하나가 잘못되는 것만으로는 충분하지 않은 구조를 고르십시오. 그 원칙이 SSP가 두 기기를 요구하는 이유이고, 이미 인증되어 있어도 어떤 조작은 재서명을 요구하는 이유이며, 무엇이 실제로 트랜잭션을 막는가가 당신이 신뢰하는 어떤 지갑에든 물어볼 값어치가 있는 물음인 이유입니다. 그 답이 "비밀 하나, 그리고 그것이 제대로 만들어졌으리라는 희망"이어서는 결코 안 됩니다.

선택지들의 더 넓은 비교와 각각이 실제로 무엇으로부터 지켜 주는지는 자기 보관 선택지 비교가 다룹니다.

이 글 공유하기

관련 글