Luka bezpieczeństwa w Coldcard: około 594,5 BTC skradzione. Kto jest zagrożony i jak przenieść środki?
Poważny błąd generatora liczb losowych w firmware portfeli sprzętowych Coldcard sprawił, że część seedów tworzonych od marca 2021 roku mogła mieć znacznie mniej entropii, niż zakładali użytkownicy. Aktualizacja firmware nie naprawia już wygenerowanej frazy odzyskiwania.
Zagrożone mogą być seedy wygenerowane na Coldcard Mk2 i Mk3 z firmware serii 4 oraz na Mk4, Mk5 i Q przed poprawkami opublikowanymi 30–31 lipca 2026 roku. Aktualizacja urządzenia nie naprawia starego seeda — konieczna jest migracja na nową frazę.
Co się wydarzyło? 594,5 BTC przeniesione w 15 minut
We wczesnych godzinach 30 lipca 2026 roku rozpoczęła się skoordynowana operacja obejmująca 500 adresów Bitcoin typu single-signature. Pierwsze transakcje znalazły się w bloku 960188 około godziny 01:36 UTC.
W ciągu czterech kolejnych bloków — od 960188 do 960191 — wykonano 500 oddzielnych transakcji, które objęły łącznie około 1324 UTXO i 594,5 BTC. Cała akcja zakończyła się około godziny 01:51 UTC, czyli po mniej więcej 15 minutach.
Przy ówczesnej cenie Bitcoina wartość środków wynosiła około 38 milionów dolarów. Około 562 BTC zostało następnie skonsolidowane na jednym nowym adresie.[4]
Dlaczego operacja wyglądała na wcześniej przygotowany atak?
- transakcje pojawiły się praktycznie jednocześnie,
- każdy adres został opróżniony osobną transakcją,
- część środków pozostawała nieruszana od kilku lat,
- niektóre adresy zawierały dziesiątki lub setki wcześniejszych wpłat,
- atak objął adresy native SegWit,
- nie wykryto w tej grupie adresów Taproot ani multisig,
- sposób działania pasował do offline’owego odtwarzania kluczy, a nie pojedynczego phishingu.
Oś czasu luki Coldcard RNG
ngu.random.bytes().Czy kradzież 594,5 BTC na pewno była skutkiem luki Coldcard?
Powiązanie jest bardzo mocne, ale trzeba rozdzielić potwierdzony błąd w firmware od pełnej atrybucji wszystkich transakcji.
Zespół Block Bitcoin Engineering and Security poinformował, że wykryte podatności umożliwiały kradzież bitcoinów użytkowników Coldcarda i że w momencie publikacji trwało aktywne wykorzystywanie problemu. Jednocześnie Block zaznaczył, że nie przeprowadził jeszcze pełnych testów empirycznych każdego możliwego scenariusza.[3]
Dane on-chain również pasują do ataku na słabą entropię: wiele starych adresów zostało opróżnionych w jednym krótkim oknie, a publiczny adres lub xpub może służyć atakującemu do sprawdzania, czy odtworzony kandydat na seed jest prawidłowy.
Na czym polegała luka generatora liczb losowych?
Seed portfela sprzętowego musi powstać z prawdziwie nieprzewidywalnej liczby. Jeżeli generator tworzący tę liczbę jest przewidywalny, atakujący nie musi zgadywać wszystkich możliwych 12 lub 24 słów. Może odtworzyć ograniczoną pulę możliwych danych wejściowych i porównać wynik z publicznym adresem Bitcoin.
Coldcard posiadał własną funkcję korzystającą ze sprzętowego generatora STM32. Problem polegał na tym, że część firmware wywoływała inną funkcję — ngu.random — która w wyniku błędu integracji korzystała z deterministycznego generatora Yasmarang z MicroPython.
Błąd w sprawdzaniu makra
Konfiguracja urządzenia definiowała: MICROPY_HW_ENABLE_RNG (0).
Biblioteka sprawdzała jednak przez #ifndef wyłącznie, czy makro istnieje, a nie czy jego wartość jest różna od zera.
Kompilacja przechodziła więc poprawnie, ale funkcja rng_get() kierowała się do programowego fallbacku MicroPython zamiast do zakładanej implementacji sprzętowej.
Skąd Yasmarang brał stan początkowy?
Programowy generator wykorzystywał między innymi:
- dolne 32 bity identyfikatora UID mikrokontrolera,
- wartość licznika SysTick,
- rejestr czasu RTC,
- rejestr podsekund RTC,
- liczbę wcześniejszych wywołań generatora.
Dane te mogą zmieniać się pomiędzy uruchomieniami urządzenia, ale nie są kryptograficznym sekretem. UID jest stałym identyfikatorem sprzętu, a wartości timerów mogą być przewidywalne lub ograniczone do stosunkowo małego zakresu.
Dlaczego SHA-256 nie naprawiał problemu?
Hashowanie może sprawić, że wynik wygląda losowo, ale nie zwiększa liczby możliwych danych wejściowych. Jeżeli istnieje tylko miliard możliwych stanów generatora, przepuszczenie ich przez SHA-256 nadal daje tylko miliard możliwych wyników.
Tak samo działa suma kontrolna BIP-39 — pomaga wykrywać błędy w słowach, ale nie dodaje nowej, niezależnej entropii.
Mk2 i Mk3
W firmware serii 4 do problematycznej ścieżki nie dodawano kryptograficznie bezpiecznego reseedu z secure element.
Coinkite szacuje efektywną przestrzeń poszukiwań na około 40 bitów. Block wskazuje, że przy znanym UID, timerach i historii wywołań generowanie może być praktycznie deterministyczne.
Mk4, Q i Mk5
Nowsze urządzenia dodawały dane z secure elements, lecz po ich zahashowaniu do funkcji reseed() trafiały tylko cztery bajty.
Oznacza to maksymalnie 232 kryptograficznie rozróżnialnych reseedów. Coinkite szacuje całkowitą przestrzeń przy dodatkowych nieznanych timerach na około 72 bity.
Które modele i wersje Coldcard są zagrożone?
| Model i firmware | Status | Co wiadomo? | Zalecenie |
|---|---|---|---|
| Coldcard Mk1 | Poza tą regresją | Według Blocka wszystkie opublikowane wersje Mk1 są poza zakresem błędu wprowadzonego w 2021 roku. | Ta konkretna luka RNG nie obejmuje Mk1. |
| Mk2 / Mk3 do 3.2.2 | Starsza ścieżka RNG | Generowanie seeda korzystało bezpośrednio ze sprzętowego RNG STM32. | Poza zakresem tej regresji. |
| Mk2 v4.0.0–v4.1.9 | Wysokie ryzyko | Block wskazuje potwierdzoną podatną ścieżkę bez bezpiecznego reseedu. | Wygeneruj nowy seed na bezpiecznym urządzeniu i przenieś środki. |
| Mk3 v4.0.0–v4.1.9 | Wysokie ryzyko | Block wskazuje podatność od 4.0.0. Coinkite ostrzega oficjalnie przed seedami tworzonymi od 4.0.1. | Konserwatywnie potraktuj również seed z wersji 4.0.0 jako zagrożony. |
| Mk4 / Mk5 przed 5.6.0 | Zagrożony seed | Entropia z secure element była redukowana do 32-bitowego reseedu. | Aktualizacja do minimum 5.6.0, następnie nowy seed i migracja. |
| Coldcard Q przed 1.5.0Q | Zagrożony seed | Model korzystał z tej samej konstrukcji fallbacku i ograniczonego reseedu. | Aktualizacja do minimum 1.5.0Q, następnie nowy seed i migracja. |
| Mk4 / Mk5 5.6.0+ | Poprawiona generacja | Hotfix usuwa problematyczny fallback i dodaje kontrolę symbolu RNG podczas kompilacji. | Nowy seed wygenerowany po aktualizacji nie jest objęty tą luką. |
| Q 1.5.0Q+ | Poprawiona generacja | Firmware zawiera poprawkę generatora entropii. | Dopiero po aktualizacji generuj nowy seed. |
Problem może dotyczyć nie tylko zwykłych seedów BIP-39
Analiza Blocka wskazuje, że ten sam strumień ngu.random był wykorzystywany również przez inne funkcje firmware. Potencjalnie obejmuje to:
- nowe i tymczasowe seedy portfela,
- klucze prywatne generowane dla paper walletów,
- losowe maski funkcji Seed XOR,
- część kluczy używanych przy klonowaniu urządzenia,
- materiał kryptograficzny USB i Key Teleport,
- Web2FA,
- hasła generowane dla Secure Notes,
- lokalne kody wykorzystywane przez tryb HSM.
Nie oznacza to, że każda z tych funkcji została skutecznie wykorzystana przez napastnika. Oznacza jednak, że użytkownik nie powinien ograniczać analizy wyłącznie do głównej frazy seed.
Czy rzuty kostką chronią seed przed luką Coldcard?
Tak, ale tylko wtedy, gdy zostały poprawnie użyte podczas pierwotnego tworzenia finalnego seeda.
50–98 rzutów
Według Coinkite uczciwe, niezależne i prywatne rzuty dostarczały co najmniej około 128 bitów dodatkowej entropii.
99 lub więcej rzutów
Dane wejściowe z kostek zapewniały około 256 bitów entropii, niezależnie od wadliwej entropii urządzenia.
Czy passphrase BIP-39 chroni zagrożony portfel?
Silna, losowa i unikalna passphrase BIP-39 może stworzyć niezależną barierę. Atakujący, który odtworzy słaby seed, nadal musi znać dokładną passphrase, aby uzyskać dostęp do ukrytego portfela.
Nie należy jednak traktować passphrase jako trwałej naprawy słabego seeda. Krótkie hasło, cytat, imię, data, wzór klawiaturowy albo hasło używane w innych miejscach może zostać odgadnięte.
Jak bezpiecznie przenieść środki z zagrożonego seeda?
Szybka ocena ryzyka według scenariusza
Seed z Mk3 firmware v4
Migruj jak najszybciej
Jeżeli nie zastosowano minimum 50 pewnych rzutów kostką, seed należy traktować jako zagrożony.
Seed z Mk4/Mk5 przed 5.6.0
Wymagana migracja
Najpierw zaktualizuj firmware, następnie wygeneruj nową frazę.
Seed z Q przed 1.5.0Q
Wymagana migracja
Aktualizacja urządzenia bez zmiany seeda nie usuwa ryzyka.
Stary seed wpisany do Ledgera lub Trezora
Nadal zagrożony
Import frazy nie zwiększa jej pierwotnej entropii.
Minimum 50 prywatnych rzutów kostką
Wyjątek według Coinkite
Dotyczy tylko rzutów dodanych podczas tworzenia finalnego seeda.
Nie pamiętasz modelu ani firmware
Nie zgaduj
Jeżeli seed mógł powstać na Coldcardzie od marca 2021 roku, bezpieczniej jest wykonać migrację.
Czy Trezor, Ledger, OneKey, Keystone, Tangem i BitBox są zagrożone?
Ta konkretna luka wynika z implementacji i konfiguracji firmware Coldcarda. Nie ma dowodów, aby identyczny błąd występował w urządzeniach innych producentów.
Nie oznacza to, że każdy inny portfel jest całkowicie odporny na wszystkie możliwe ataki. Każde urządzenie ma własną architekturę, kod, układy bezpieczeństwa i model zagrożeń.
| Portfel | Sposób generowania lub zabezpieczania entropii | Status wobec luki Coldcard | Najważniejsze zastrzeżenie |
|---|---|---|---|
| Trezor | Entropia urządzenia jest mieszana z entropią dostarczaną przez hosta. Modele Safe korzystają również z dodatkowych układów bezpieczeństwa. | Inna implementacja | Seed zaimportowany z podatnego Coldcarda nadal pozostaje słaby. |
| Ledger | Entropia i klucze są generowane oraz chronione wewnątrz Secure Element z własnym TRNG. | Inna implementacja | Nowe urządzenie nie naprawi zaimportowanego, słabego seeda. |
| BitBox02 | Producent deklaruje łączenie pięciu źródeł entropii, między innymi secure chipu, MCU, hosta i hasła urządzenia. | Inna implementacja | Wiele źródeł zmniejsza ryzyko awarii pojedynczego źródła, ale prawidłowa integracja nadal ma znaczenie. |
| OneKey | OneKey deklaruje Secure Element EAL6+, sprzętowy TRNG i mieszanie wielu źródeł entropii. | Inna implementacja | Certyfikacja układu nie zastępuje audytu pełnej ścieżki firmware. |
| Keystone | Urządzenie korzysta z secure elements, otwartego kodu, komunikacji QR oraz umożliwia generowanie z własnej entropii. | Inna implementacja | Sama liczba chipów nie jest dowodem prawidłowego mieszania losowości. |
| Tangem | W trybie seedless klucz jest generowany wewnątrz Secure Element i nie opuszcza karty. Tryb BIP-39 jest opcjonalny. | Inna implementacja | Import słabej frazy BIP-39 przenosi słabość również do Tangema. |
| Bitkey | Produkt Blocka korzysta z oddzielnej architektury sprzętowej i programowej. | Block wyklucza swoje produkty | Analiza Blocka bezpośrednio wskazuje, że produkty Block nie są objęte podatnością. |
Czy multisig chroni przed podobną luką?
Multisig może ograniczyć skutki awarii pojedynczego producenta lub generatora, ale tylko wtedy, gdy wymagana liczba kluczy została utworzona niezależnie.
W konfiguracji 2-of-3 atakujący potrzebuje dwóch kluczy. Jeżeli dwa klucze zostały wygenerowane na podatnych Coldcardach, multisig może nadal zostać przejęty.
Dobrze zaprojektowany multisig
- urządzenia różnych producentów,
- niezależnie generowane seedy,
- backupy przechowywane w różnych miejscach,
- zapisany descriptor lub plik konfiguracji,
- regularnie testowana procedura odzyskiwania.
Ukryte ryzyka multisig
- utrata quorum wymaganych kluczy,
- brak descriptorów i xpubów,
- błędy podczas odtwarzania konfiguracji,
- większa liczba aktualizacji i urządzeń,
- trudniejsze dziedziczenie środków.
Dla początkującej osoby dobrze zabezpieczony single-sig z nowym seedem i przetestowanym backupem może być bezpieczniejszy niż skomplikowany multisig, którego właściciel nie potrafi samodzielnie odtworzyć.
Najważniejsze wnioski dla posiadaczy kryptowalut
- Otwarte oprogramowanie nie gwarantuje automatycznego wykrycia wszystkich błędów. Kod Coldcarda był publicznie dostępny, ale podatna ścieżka działała przez lata.
- Obecność sprzętowego TRNG nie wystarcza. Trzeba zweryfikować, czy krytyczna funkcja rzeczywiście korzysta z właściwego generatora.
- Hashowanie nie tworzy brakującej entropii. SHA-256 może ukryć strukturę danych wejściowych, ale nie zwiększa ich liczby.
- Aktualizacja nie naprawia starych kluczy. Poprawka działa dopiero przy generowaniu nowych danych.
- Seed jest ważniejszy niż urządzenie. Słaby seed pozostaje słaby po odtworzeniu na innym portfelu.
- Dywersyfikacja może ograniczyć ryzyko producenta. Duży kapitał można rozdzielić między niezależne seedy lub przemyślany multisig.
- Pośpiech również jest zagrożeniem. Błędny adres, literówka w passphrase lub niesprawdzony backup mogą doprowadzić do nieodwracalnej straty.
FAQ: luka bezpieczeństwa Coldcard
Czy aktualizacja firmware naprawia mój stary seed?
Czy problem dotyczy wyłącznie Coldcard Mk3?
Czy Coldcard firmware 4.0.0 także jest zagrożony?
Czy wpisanie seeda do Trezora lub Ledgera rozwiązuje problem?
Czy passphrase BIP-39 zabezpiecza słaby seed?
Czy PIN urządzenia jest tym samym co passphrase?
Czy 50 rzutów kostką wystarcza?
Czy mogę teraz dodać rzuty kostką do starego seeda?
Czy multisig zawsze chroni przed tą luką?
Czy luka oznacza złamanie Bitcoina lub BIP-39?
Czy TAPSIGNER, OPENDIME i SATSCARD są zagrożone?
Czy trzeba natychmiast przesłać wszystkie środki?
Nie opieraj całego bezpieczeństwa na jednym urządzeniu
Porównaj architekturę, sposób tworzenia seeda, backup, obsługę passphrase i możliwości odzyskania portfela. Najdroższy model nie zawsze jest najlepszy, jeżeli jego użytkownik nie potrafi poprawnie wykonać i przetestować backupu.
Źródła i dalsza lektura
- Coinkite: Mk3 Security Advisory
- Coinkite: Technical Deep Dive into the Entropy Issue
- Block Engineering: Predictable RNG Fallback and 32-Bit Reseed in COLDCARD Firmware
- Atlas21: 594 BTC stolen in 15 minutes
- Trezor: What is entropy and how does Trezor generate your wallet?
- Ledger: What is entropy in crypto?
- BitBox: Security features and entropy sources
- OneKey: Seed generation and randomness
Materiał ma charakter edukacyjny i informacyjny. Nie jest poradą inwestycyjną ani gwarancją bezpieczeństwa konkretnego urządzenia. Sytuacja jest dynamiczna, dlatego przed wykonaniem migracji sprawdź aktualne komunikaty na oficjalnej stronie producenta. Nigdy nie wpisuj frazy seed na stronie internetowej ani urządzeniu podłączonym do internetu.
