블록(Block)의 비트코인 엔지니어링 및 보안팀 엔지니어 클레이 개럿은 공격자가 잘 알려진 블록체인 서비스 제공업체의 유료 계정을 사용해 취약한 주소를 효율적으로 식별하고 질의했다고 밝혔습니다 . 공격자의 온체인 패턴—동일한 취약점을 공유하는 주소들을 비정상적으로 빠르고 순차적으로 스캔한 점—이 수사관들의 단서가 됐습니다. 블록은 해당 운영자의 활동을 해당 제공업체 인프라와 직접 연결하는 증거를 확보했습니다
.
개럿은 "계정 수준까지 내려가는 특이한 정밀도"를 확인했다고 말했습니다 . 이 분석 서비스는 사실상 정찰 도구 역할을 하며, 공격자가 취약한 펌웨어로 생성된 주소를 빠르게 파악해 가장 자금이 많은 대상을 우선 공략할 수 있게 했습니다
.
버그는 2021년 3월 펌웨어 커밋(Mk3 펌웨어 버전 4.0.1부터)에서 비트코인 코어의 libsecp256k1 라이브러리로 이전하는 과정에서 도입됐습니다 . 빌드 설정 매크로 오류로 펌웨어가 기기의 전용 STM32 하드웨어 난수생성기를 우회하고, 대신 마이크로파이썬의 결정론적 소프트웨어 야스마랑(Yasmarang) 난수생성기에 의존하게 됐습니다
.
프로덕션 보드 설정은 MICROPY_HW_ENABLE_RNG를 0으로 정의했는데, 이는 콜드카드가 별도의 하드웨어 RNG 래퍼를 사용하기 때문이었습니다. 하지만 libngu 라이브러리가 해당 래퍼를 올바르게 호출하지 못했습니다. 문제의 보호 조건(#ifndef MICROPY_HW_ENABLE_RNG. 매크로가 정의됐다(값이 0)는 이유로 libngu는 하드웨어 경로가 사용 가능하다고 묵시적으로 판단하고 마이크로파이썬의 소프트웨어 기반
rng_get() 함수에 바인딩됐습니다 .
이로 인해 실질 엔트로피는 약 32~40비트로 줄어들었고(의도한 128비트 이상에서), 가능한 시드 값은 약 40억 개에 불과해 현대 하드웨어로 무차별 대입 공격이 가능한 수준이었습니다 . 사용자가 직접 주사위를 굴리거나 BIP 39 암호를 추가하지 않은 시드는 모두 노출됐습니다
.
코인카이트 CEO **로돌포 노박(일명 NVK)**은 이후 실수를 인정했습니다: "MICROPY_HW_ENABLE_RNG를 0으로 명시적으로 설정했지만, 어떤 버전도 필요하지 않을 것이라고 생각했는데 실제로 그렇지 않았습니다" .
| 영향받음 | 영향받지 않음 |
|---|---|
| 콜드카드 Mk3, 펌웨어 4.0.1~5.0.3 | Mk4, Q, Mk5(초기 코인카이트 분석 기준) |
| 사용자 주사위 굴림 또는 BIP 39 암호 없이 생성된 시드 | 사용자 제공 주사위 굴림 또는 암호를 사용해 생성된 시드 |