며칠 전 비트코이너들의 가슴이 서늘해 지는 사건이 발생했습니다.
가장 비싸고 좋다고 알려져 있던 지갑 콜드카드가 해킹 당해서 비트코인이 탈취당했다는 내용이었습니다.
은행의 내 계좌가 털려서 내돈이 다 사라졌다와 같은 뜻이라 심장마비 일어날 만한 일 이었습니다.
도대체 무슨 내용인지 한 번 찾아 보았습니다.
아래 내용은 비트코인전문가 오태민교수님께서 AI의 내용을 정리한 것을 옮겨왔습니다.
기술적인 내용도 있어서 조금 어려울 수도 있지만 그렇단다 정도로 참고 하시면 좋겠고
아래의 결론을 이해 하시면 좋겠습니다.
이 사건은 비트코인 프로토콜이 해킹됐거나 모든 콜드월렛이 뚫린 사건이 아닙니다.
캐나다 업체 Coinkite의 하드웨어 지갑 COLDCARD 일부 펌웨어가 지갑 시드를 만들 때 충분한 난수를 사용하지 못한 결함입니다.
공격자는 지갑을 훔치거나 인터넷에 연결할 필요 없이, 가능한 시드 후보를 자신의 컴퓨터에서 계산한 뒤 블록체인상의 주소와 대조해 개인키를 재현할 수 있었습니다.
2026년 8월 3일 현재 Galaxy Research가 온체인 패턴으로 집계한 의심스러운 세 차례의 자금 이동은 약 1,367.05 BTC, 4,585개 주소, 당시 평가액 약 8,860만~8,900만 달러입니다.
다만 이는 법집행기관이 피해 신고를 모두 확인한 최종 손실액이 아니라, 공개된 블록체인 거래를 분석해 산출한 ‘관측된 의심 규모’입니다.
또한 4,585개 주소는 4,585명의 피해자를 의미하지 않습니다.
한 사람의 시드에서 여러 주소가 생성될 수 있습니다.
1. 무엇이 잘못됐나
비트코인 지갑을 새로 만들 때 COLDCARD는 먼저 매우 큰 범위에서 무작위 숫자를 선택합니다.
이 숫자가 복구용 시드 문구와 모든 후속 개인키의 출발점이 됩니다.
정상적인 지갑이라면 공격자가 가능한 시드를 전부 시험하는 것이 사실상 불가능해야 합니다.
그런데 2021년 펌웨어 개편 과정에서 시드 생성 함수가 다음과 같이 바뀌었습니다.
이전 경로: COLDCARD가 마련한 STM32 하드웨어 난수생성기 사용
변경된 경로: ngu.random.bytes() 호출 실제 컴파일
결과: 하드웨어 난수 대신 MicroPython의 소프트웨어 의사난수생성기인 Yasmarang 사용 COLDCARD 설정에는 MICROPY_HW_ENABLE_RNG가 0으로 정의돼 있었습니다.
그런데 연동 라이브러리는 이 값이 활성화됐는지를 검사하지 않고, 매크로가 ‘존재하는지’만 검사했습니다.
따라서 컴파일 오류가 발생하지 않았고, 시드 생성은 의도하지 않은 소프트웨어 난수 경로로 연결됐습니다.
이 소프트웨어 생성기는 주로 다음 값을 초기 상태로 사용했습니다.
칩의 고유 식별번호 일부 프로세서의 타이머 값 실시간시계의 시간·서브초 값 이 값들은 결과를 매번 조금씩 다르게 보이게 할 수 있지만, 암호학적으로 안전한 비밀 난수는 아닙니다.
칩 식별번호는 고정된 기기 정보이고, 타이머 값은 기기 부팅 과정과 동일 모델의 동작을 관찰하면 범위를 좁힐 수 있습니다.
초기 상태와 그전에 몇 번 난수 함수가 호출됐는지를 추정하면 이후 출력도 재현할 수 있습니다.
쉽게 비유하면 정상적인 지갑은 전 세계 모든 모래알보다 훨씬 많은 번호 가운데 하나를 고르는 것과 같습니다.
문제의 펌웨어는 겉으로는 긴 번호를 만들어냈지만, 실제로는 다음과 같은 제한된 정보만 섞은 셈입니다. 기기번호 일부+전원을 켠 시각+프로그램 실행 타이밍 결과값을 해시 함수로 다시 섞는다고 해도 가능한 입력의 수가 늘어나지는 않습니다.
작은 상자 안의 번호들을 매우 복잡하게 섞어도 상자 안에 들어 있는 번호의 총개수는 그대로인 것과 같습니다.
Block의 기술분석도 SHA-256 해시나 BIP39 체크섬이 부족한 엔트로피를 새로 만들어주지는 못한다고 설명합니다.
2. 어느 정도로 약해졌나
Coinkite는 Mk2와 Mk3의 문제 버전에서 생성된 시드의 실질적인 검색공간을 잠정적으로 약 40비트로 추정했습니다.
이는 의도했던 최소 128비트 보안 수준보다 극단적으로 낮습니다.
Block은 공격자가 기기 식별번호와 타이밍을 얼마나 알고 있는지에 따라 후보 수가 크게 달라지며, 특정 조건에서는 검색범위가 이보다 훨씬 더 좁아질 수 있다고 분석했습니다.
Mk4·Mk5·Q는 보안칩에서 나온 값을 추가로 섞었기 때문에 Mk2·Mk3보다는 사정이 낫습니다.
그러나 보안칩에서 나온 많은 데이터 가운데 최종적으로 소프트웨어 생성기에 들어간 것은 4바이트, 즉 32비트뿐이었습니다.
Coinkite는 후속 모델의 실질 보안 수준을 약 72비트로 추정하지만, Block은 이 수치를 일반적인 의미의 72비트 암호학적 보안으로 해석해서는 안 된다고 경고합니다.
실제 공격비용은 기기 식별정보와 타이밍, 실행경로를 얼마나 좁힐 수 있는지에 달려 있습니다.
중요한 제한도 있습니다. Block은 적극적인 도난이 진행되고 있어 분석을 조기에 공개했으며, 모든 모델과 조건에 대한 완전한 실험과 종단간 무차별대입 성능시험까지 마친 것은 아니라고 밝혔습니다.
따라서 공개된 기술분석은 심각한 취약성을 설명하지만, 특정 피해자의 시드가 어떤 계산과정으로 복원됐는지를 공개적으로 재현한 최종 포렌식 보고서는 아직 아닙니다.
3. 공격자는 어떻게 지갑을 털었나
공격 과정은 개념적으로 다음과 같습니다.
공개된 COLDCARD 펌웨어를 분석해 취약한 난수생성 과정을 재현합니다. 가능한 기기 상태와 타이밍을 조합해 시드 후보를 생성합니다.
각 시드에서 표준 비트코인 파생경로를 따라 주소를 계산합니다.
이 주소를 공개된 비트코인 UTXO 데이터와 비교합니다.
실제 잔액이 있는 주소와 일치하면 해당 시드로 개인키를 계산해 자금을 이전합니다.
블록체인이 공개돼 있다는 점이 여기서는 공격자의 확인 장치가 됐습니다.
공격자는 “이 시드 후보가 맞는가”를 피해자 기기에 물어볼 필요가 없습니다.
후보에서 나온 주소가 실제 블록체인상의 사용 주소와 일치하는지만 확인하면 됩니다.
따라서 피해자의 COLDCARD는 공격 당시 다음 상태여도 안전하지 않았습니다.
전원이 꺼져 있음 금고 안에 보관돼 있음 USB나 인터넷에 연결된 적이 없음 시드 문구가 사진이나 클라우드에 유출되지 않음 이번 사건에서 공격자가 노린 것은 기기 안에 저장된 비밀을 빼내는 것이 아니라, 처음부터 추측 가능한 비밀을 만들어냈다는 사실이었습니다.
에어갭은 정상적인 비밀키의 유출을 막을 수 있지만, 비밀키의 출발점이 충분히 무작위가 아니면 보호효과가 없습니다.
4. 취약점은 언제 들어갔나
Block의 코드 분석에 따르면 문제의 변경은 2021년 3월 1일 커밋에서 들어갔으며, 2021년 3월 17일 공개된 펌웨어 4.0.0에 처음 포함됐습니다.
Coinkite의 현재 공식 안내는 Mk2·Mk3의 문제 범위를 4.0.1부터 4.1.9까지로 제시하지만, Block의 소스 분석은 4.0.0도 취약 경로에 포함합니다.
안전 측면에서는 2021년 3월 이후 해당 계열 펌웨어에서 시드를 생성했다면 공식 안내에 따라 노출된 것으로 취급하는 편이 적절합니다.
결함은 약 5년 동안 공개 소스코드와 제품 안에 존재했지만, 2026년 7월 말 대규모 자금이 이동하기 전까지 발견되지 않았습니다.
Coinkite는 기존 검토가 올바른 하드웨어 난수 코드가 펌웨어에 포함돼 있는지는 확인했지만, 실제 시드 생성 호출이 여러 라이브러리를 지나 최종적으로 어느 rng_get() 구현에 연결되는지까지 검증하지 못했다고 설명했습니다.
이는 코드가 공개돼 있다는 것만으로 보안이 자동으로 보장되지는 않는다는 사례입니다.
보안 기능이 소스코드에 존재하는 것과 실제 중요한 실행경로에서 그 기능이 호출되는 것은 별도의 문제입니다.
5. 세 차례의 공격은 어떻게 진행됐나
처음 보도된 피해는 약 500개 주소에서 594 BTC, 약 3,800만 달러였습니다.
이는 최초로 눈에 띈 일부 거래만 집계한 숫자였습니다.
Galaxy Research가 같은 거래 지문과 자금 수집 패턴을 더 넓게 추적하면서 첫 번째 공격 규모는 약 1,082.65 BTC, 약 1,195~1,196개 주소로 확대됐습니다.
이 자금은 2026년 7월 30일 약 41분 동안 빠져나갔습니다. 세 차례를 합친 Galaxy의 관측치는 다음과 같습니다.
총 유출: 약 1,367.05 BTC 관련 주소: 4,585개 당시 평가액: 약 8,860만~8,900만 달러 첫 번째 파동: 약 1,083 BTC, 주소당 평균 약 0.9 BTC 세 번째 파동: 약 207.7~208 BTC, 1,912개 주소, 주소당 평균 약 0.1 BTC 초기에는 잔액이 큰 주소들이 주로 털렸고, 이후에는 수천 달러 수준의 작은 잔액까지 공격대상이 내려간 것으로 분석됐습니다.
이는 공격자가 수익성이 높은 후보를 먼저 처리한 뒤 남은 취약 키 공간을 계속 훑고 있을 가능성을 시사합니다.
세 번째 공격에서 바뀐 점 첫 번째와 두 번째 파동은 피해 주소의 자금을 소수의 공통 수집 주소로 모았습니다.
거래구조와 수수료, 목적지 유형이 비슷해 외부 분석가가 하나의 집단으로 묶기 쉬웠습니다. 세 번째 파동에서는 다음 변화가 나타났습니다.
피해자별 자금을 여러 개의 별도 목적지로 분리 한 거래에 평균 약 6개 피해 주소를 묶어 처리 여러 파생경로 대신 기본 파생경로 중심으로 검색 일반 단일키 출력 대신 P2WSH 출력 사용 이 변화는 공개적으로 거래패턴이 분석된 뒤 동일 공격자가 수집구조를 다시 설계했거나, 다른 공격자가 같은 취약한 키 공간을 독립적으로 탐색하기 시작했을 가능성을 보여줍니다.
Galaxy는 각 파동 내부는 한 운영자의 작업으로 보이지만, 세 파동 전체가 같은 사람의 소행이라고 단정하지 않았습니다.
기사의 P2WSH 설명은 조금 주의할 필요가 있습니다. P2WSH는 멀티시그나 시간잠금 같은 조건을 담을 수 있지만, P2WSH라는 사실만으로 실제로 어떤 조건이 사용됐는지는 알 수 없습니다.
구체적인 잠금 스크립트는 그 자금을 다시 사용할 때 공개됩니다.
현재 확실한 것은 공격자가 이전보다 분석과 주소 군집화를 어렵게 하는 출력형식을 사용했다는 정도입니다.
6. 누가 영향을 받나
Coinkite가 2026년 8월 1일 갱신한 공식 안내에 따른 영향 범위는 다음과 같습니다.
Mk2·Mk3: 펌웨어 4.0.1~4.1.9에서 생성한 시드 Block의 분석은 4.0.0도 포함 수정 버전은 4.2.0 이상 Mk4·Mk5: 표준 펌웨어 5.6.0 이전에 생성한 시드 Mk4·Mk5 Edge: 6.6.0X 이전 Q: 표준 펌웨어 1.5.0Q 이전 Q Edge: 6.6.0QX 이전 TAPSIGNER·OPENDIME·SATSCARD는 다른 코드베이스를 사용해 이 결함의 영향을 받지 않음 판단 기준은 현재 설치된 버전이나 기기 구입일이 아니라, 기존 시드를 생성했을 당시 실행 중이던 펌웨어입니다.
취약한 버전에서 만든 시드를 새 기기나 수정된 펌웨어에 복구해도 그 시드는 계속 취약합니다.
관측된 대규모 도난은 주로 단일서명 지갑에서 발생했습니다.
독립된 다른 제조사 키들과 구성한 2-of-3 멀티시그라면 COLDCARD 키 하나가 복원되더라도 그것만으로는 즉시 지출할 수 없습니다.
그러나 공격자는 그 서명키 하나를 이미 보유한 것과 같으므로 해당 키를 교체하고 새 멀티시그 지갑으로 자금을 이동해야 합니다.
7. 주사위와 패스프레이즈를 사용했다면 COLDCARD는 시드를 만들 때 사용자가 직접 주사위 값을 추가할 수 있습니다.
Coinkite는 다음 조건을 모두 충족한 경우 이 RNG 결함만으로는 시드가 위험하지 않다고 설명합니다.
공정한 6면 주사위를 사용 각 결과가 독립적이었음 공격자에게 공개되거나 기록되지 않음 최소 50회 이상 입력 50~98회는 주사위 입력만으로 최소 약 128비트의 엔트로피를 제공하며, 99회 이상은 약 256비트 수준을 제공한다고 설명합니다.
몇 번 굴렸는지 기억나지 않거나 50회 미만이라면 취약한 것으로 취급해야 합니다.
강하고 고유한 BIP39 패스프레이즈를 별도로 사용했다면 공격자는 약한 시드뿐 아니라 패스프레이즈도 알아야 합니다.
그러나 짧은 단어, 유명한 문장, 반복 패턴, 다른 곳에서 재사용한 비밀번호라면 추측될 수 있습니다.
여기서 말하는 패스프레이즈는 COLDCARD 잠금해제 PIN이 아닙니다.
Coinkite는 강한 패스프레이즈가 즉각적인 공격을 어렵게 할 수는 있지만, 취약한 시드를 정상적으로 고치는 것은 아니므로 새 시드로 이전할 것을 권고합니다.
8. 보유자가 지금 해야 할 일 영향 가능성이 있다면 단순히 펌웨어만 업데이트해서는 안 됩니다.
기존 시드는 이미 추측 가능한 상태일 수 있으므로 완전히 새로운 시드를 만들고 자금을 옮겨야 합니다.
안전한 순서는 다음과 같습니다.
자신의 COLDCARD 모델과 시드를 만든 당시 펌웨어를 확인합니다.
공식 Coinkite 사이트에서 해당 모델의 수정된 펌웨어를 설치합니다.
수정된 펌웨어 또는 별도의 안전한 하드웨어 지갑에서 완전히 새로운 시드를 생성합니다.
새 시드와 지갑 지문을 안전하게 기록합니다.
새 수신 주소를 하드웨어 지갑 화면에서 직접 확인합니다. 먼저 소액을 시험 전송합니다.
새 지갑에서 정상 입금과 지갑 지문을 확인합니다.
기존 지갑의 나머지 잔액을 모두 이동합니다.
전체 이전이 확인될 때까지 기존 백업을 폐기하지 않습니다.
Coinkite는 급하게 이전하다가 잘못된 주소로 보내거나 새 백업을 분실하는 위험도 있으므로, 작은 시험거래와 화면상의 주소 확인을 강조합니다.
다음 행동은 피해야 합니다.
기존 시드를 수정된 기기에 복구한 뒤 계속 사용 같은 시드에서 새 주소만 만들어 자금 이동 시드 문구를 웹사이트의 ‘취약성 검사기’에 입력 이메일이나 SNS로 도움을 제안하는 사람에게 시드 제공 비공식 링크를 통해 펌웨어 다운로드 공격자를 피한다며 검증되지 않은 지갑으로 전액을 한꺼번에 전송 현재 공격 방법의 기술적 원인이 공개됐기 때문에 최초 공격자 외의 다른 집단도 같은 후보 공간을 탐색할 수 있습니다.
취약한 시드에 자금이 남아 있다면 사용자와 공격자 사이의 시간 경쟁으로 봐야 합니다.
9. 아직 확인되지 않은 부분 현재까지 공개 자료만으로는 다음 사항이 확정되지 않았습니다.
세 차례 공격을 모두 동일인이 수행했는지 공격자가 기기 식별번호와 부팅 타이밍을 정확히 어떻게 좁혔는지 실제 계산에 사용한 하드웨어와 비용 4,585개 주소가 모두 COLDCARD 취약 시드에서 나온 것인지 최종 피해자 수와 중복 주소 수 모든 이동이 절도인지, 일부는 위험을 알아챈 소유자의 긴급 이전인지 공격자가 AI를 사용했는지 공개적으로 식별되지 않은 추가 공격이 얼마나 있는지 Coinkite는 공개 코드가 AI 분석을 통해 발견됐을 가능성을 언급했지만 이는 추측입니다.
Block은 공개 이후 여러 개발자가 최신 AI 모델의 도움으로 문제를 재현할 수 있었다고 설명했지만, 실제 공격자가 AI를 사용했다는 증거는 공개되지 않았습니다.
Galaxy의 수치는 거래 지문, 주소형식, 수수료와 수집구조를 바탕으로 한 온체인 귀속입니다.
분석에 잡히지 않는 별도의 공격자가 다른 수수료나 목적지 구조를 사용했을 수도 있고, 반대로 유사한 거래가 잘못 포함됐을 가능성도 있습니다.
따라서 1,367 BTC는 현재 가장 널리 인용되는 관측치이지 최종 감사액은 아닙니다.
이 사건의 본질 이번 사고가 보여주는 핵심은 다음과 같습니다.
콜드월렛의 보안은 개인키를 얼마나 잘 숨기느냐에서 시작하지 않는다.
처음 만든 개인키가 정말로 추측 불가능한가에서 시작한다.
비트코인의 서명 알고리즘이나 블록체인이 깨진 것이 아닙니다.
그러나 기기 제조사의 난수 생성과 라이브러리 연동이 실패하면, 비트코인의 강한 암호기술도 약한 출발점을 보완하지 못합니다. COLDCARD는 인터넷과의 격리, 보안칩과 하드웨어 서명을 제공했지만, 이번에는 그 보호장치보다 앞선 키 생성 단계에서 문제가 생겼습니다. 견고한 금고를 만들었지만 금고 열쇠의 번호가 추측 가능한 범위에서 선택된 사건이라고 이해하는 것이 가장 정확합니다.
지금까지 비트코인전문가 오태민교수님께서 AI의 내용을 정리한 것을 옮겨 놓았습니다.
