Buhusan ng Coldcard Hardware Wallet ay Nagdulot ng Higit sa $88M na Nasupil na Bitcoin

iconMetaEra
I-share
AI summary iconSummary
Isang kahinaan sa Coldcard hardware wallet na kaugnay sa maling konfigurasyon ng RNG ay nagresulta sa pagkawala ng higit sa 594 BTC, na may halagang higit sa $88 milyon. Ang isyu ay nakaimpluwensya sa mga modelo ng Coldcard Mk2, Mk3, Mk4, Q, at Mk5, na nag-expose sa mga private key sa mga brute-force attacks. Tinatayang sinundan ng Beosin ang mga pinagsamang pondo sa ilang Bitcoin addresses. Ang insidente ay nagdulot ng mga alalahanin sa ilalim ng CFT at nagpapakita ng kahalagahan ng pagpapakilala sa MiCA habang pinapalakas ng EU ang regulasyon sa crypto.

Pagkawala ng higit sa $88 milyon: Pagsusuri sa vulnerability ng Coldcard hardware wallet at pagtutuloy sa mga nakuha na pondo Noong Hulyo 31, binaril ang 594 na Bitcoin mula sa halos 500 na Coldcard hardware wallets, na may halagang humigit-kumulang $38 milyon. Pagkatapos ay kinumpirma ng Coinkite, ang kumpanyang responsable sa paggawa ng Coldcard wallets, na mayroong security vulnerability sa proseso ng pagbuo ng key, na nakakaapekto sa maraming bersyon ng Coldcard tulad ng Mk2, Mk3, Mk4, Q, at Mk5.

Kasalukuyang higit sa $88 milyon ang pinsalang dulot ng pag-atake sa vulnerability na ito, at patuloy pa ang pag-atake; dapat ng maglipat ng mga pondo ang mga gumagamit ng Coldcard wallet sa ibang address. Narito ang pagsusuri ni Beosin sa vulnerability na ito at ang pagsubaybay sa mga nasasakop na pondo.

Isa. Pagsusuri ng vulnerability

Ang pagsusuri sa mga commit record ng Coldcard firmware ay nagpapakita na sa nakaraang Commit 37e4af5451c260c1e7d429fe8972c4cb5e68ee59, ang koponan ng pag-unlad ay nag-update ng maraming code tungkol sa MK4 configuration, kabilang sa mpconfigboard.h:

Mayroon tayong sariling bersyon ng code na ito.#define MICROPY_HW_ENABLE_RNG       (0)

Sa MicroPython STM32 side, ang macro na ito ay kumokontrol sa pag-compile ng path para sa default hardware random number generator (RNG) binding at generic random number implementation. Ang pagpapahiwatig nito sa 0 ay nagdudulot na ang default hardware RNG path ay hindi gagamitin bilang backend para sa generic rng_get().

Ang kanyang mga tala ay nagpapaliwanag na ang mga developer ang magpapatakbo ng RNG; pagkatapos ay tiningnan ang kanilang kustom na rng.h at natuklasan na mayroon lamang dalawang MicroPython objects na inihayag:

MP_DECLARE_CONST_FUN_OBJ_0(pyb_rng_get_obj);MP_DECLARE_CONST_FUN_OBJ_1(pyb_rng_get_bytes_obj);

Ang katumbas na implementasyon ay:

/// \function pyb_rng_get()///// Ibalik ang isang 30-bit na hardware-generated na random number: o mabigo!//STATIC mp_obj_t pyb_rng_get(void){    // Kunin at ibalik ang bagong random number    return mp_obj_new_int(rng_get_or_fault() >> 2);}
/// \function rng_get_bytes()/// Punuan ang isang buffer ng random na bits; ang caller ay dapat magbigay ng may sukat na buffer.STATIC mp_obj_t pyb_rng_get_bytes(mp_obj_t buffer_io) {
    mp_buffer_info_t bufinfo;    mp_get_buffer_raise(buffer_io, &bufinfo, MP_BUFFER_WRITE);
    mp_uint_t count = bufinfo.len;    if(count < 1) {        mp_raise_ValueError(NULL);    }
    // Basahin ang 32-bit na mga salita at i-unpack sa ibinigay na buffer    random_buffer(bufinfo.buf, count);
    return mp_const_none;}
MP_DEFINE_CONST_FUN_OBJ_0(pyb_rng_get_obj, pyb_rng_get);MP_DEFINE_CONST_FUN_OBJ_1(pyb_rng_get_bytes_obj, pyb_rng_get_bytes);

Ang rng_get_or_fault() ay direktang nababasa ang STM32 RNG peripheral:

static uint32_t rng_get_or_fault(void){    // I-enable ang RNG peripheral kung hindi pa naka-enable    rng_init();
    // Maghintay hanggang maghanda ang bagong random number, nangangahulugan ng halos 10us    uint32_t start = HAL_GetTick();
    while (!(RNG->SR & RNG_SR_DRDY)) {        kung ang HAL_GetTick() - start >= RNG_TIMEOUT_MS) {            // pagkabigo sa hardware... huwag ibalik ang anumang bagay!            mp_raise_OSError(MP_EFAULT);        }    }
    // Kunin at ibalik ang bagong random number    last_value = RNG->DR;
    return last_value;}

Nagpapakita ito na ang custom code ng Coldcard ay talagang nais gamitin ang hardware RNG, ngunit tanging sinisiguro nito ang paggamit ng hardware function kapag tinatawag ang pyb_rng_get* o ang loob nitong random_buffer().

At samantalang sa paglikha ng wallet, ang sumusunod na code ang talagang tinatawag, kung saan ang wallet creation function sa shared/seed.py ay:

async def make_new_wallet(nwords):    # Pumili ng bagong random na seed.    await ux_dramatic_pause('Generating...', 3)    seed = generate_seed()    words = await approve_word_list(seed, nwords)    if words:        await commit_new_words(words)

Una sa pagtawag ay pumapasok sa module ng Coldcard na shared/random.py. Sa mga nakaraang bersyon, ang random.py ay direktang nakadepende sa ngu.random at nanatili:

# random.py - subset ng random module, walang compat, at gumagamit ng crypto-quality rng# para sa bytes, gamitin ang ngu.random.byte(len)#bytes = ngu.random.bytes

Ang ginamit para sa pag-initialize ng wallet ay ang random.bytes, hindi ang pyb.rng(), at ang custom na pyb_rng_get_obj ay hindi awtomatikong naka-overwrite sa random.bytes.

Dahil ang MICROPY_HW_ENABLE_RNG ay itinakda bilang 0, hindi ginamit ang hardware RNG sa pagbuo ng wallet, kundi tinawag ang pyb_rng_yasmarang mula sa micropython/ports/stm32/rng.c:

#if MICROPY_HW_ENABLE_RNG
uint32_t rng_get(void) {    // gamitin ang STM32 hardware RNG    ...}
#else
// Para sa MCUs na walang RNG, kailangan pa rin nating bigyan ang rng_get() na punsiyon// Ang pseudo-RNG ay hindi talaga ideyal ngunit gagamitin natin ito sa kasalukuyan.
// Yasmarang random number generatorstatic uint32_t pyb_rng_yasmarang(void) {    static bool seeded = false;    static uint32_t pad = 0, n = 0;    ...}
uint32_t rng_get(void) {    return pyb_rng_yasmarang();}
#endif

Ang pyb_rng_yasmarang ay isang pseudorandom number generator, at sobrang hindi ligtas ito para sa pagbuo ng seed ng hardware wallet, dahil maaaring makakuha ng key ang mga attacker sa pamamagitan ng brute force. Sa kasalukuyan, tinanggal na ng Coinkite ang stm32/rng.c sa makefile file:

Huwag i-compile ang fallback PRNG ng MicroPython. Ang board-specific na rng.c
ay nagbibigay ng rng_get(), at ang empty na object na ito ay nagpapatotoo sa listahan ng object mula sa upstream.
$(BUILD)/rng.o: CFLAGS += -Dpyb_rng_yasmarang=error-do-not-want-this
$(BUILD)/rng.o:
$(ECHO) "SKIP stm32/rng.c"
$(Q)$(CC) $(CFLAGS) -x c -c /dev/null -o $@

Pangalawa: Pagsubaybay sa mga nasupil na pera

Kasalukuyang, ang mga pondo ng ilang biktima ay naka-transfer at nakapag-ikumpuni na sa maraming address, ngunit hindi pa ginawa ang karagdagang paglilinis. Sa pamamagitan ng threat intelligence at analisis ng on-chain behavior, kinukumpleto ni Beosin Trace ang mga sumusunod na address ng pag-ikumpuni:

bc1qq85v2c926eg6pgxhwp6q7lf6cnsz80qs3fcu9r (562 BTC)

https://wdcdn.qpic.cn/MTMxMDI3MDE1MTgxMDU0NzA_369595_usmImxZpHsKmu9X__1785899827?w=1080&h=656

bc1qx76cae2706qd5q576feh7xq8rfcsjpf2htfhe3 (398.47 BTC)

https://wdcdn.qpic.cn/MTMxMDI3MDE1MTgxMDU0NzA_304781_-IeWjFtIQ4RhvCbz_1785899827?w=1080&h=674

Bukod dito, mayroon pa ang mga sumusunod na address ng pagkolekta kung saan ang flow ng pera ay katulad ng nakalikhang larawan, at wala pa ring karagdagang paglipat:

  • bc1q8jy96fe5lf8vfugydnte3cguk92gpev7kwtp3q (89.62 BTC)
  • bc1q0rvn88w08j75k4h48lf9fvhan7unjp7vjf5q6m (64.9 BTC)
  • bc1qtfrwa4j6rmj9rsgspv6a0yjumkg39js2numu75 (45.9 BTC)
  • bc1qmd5m5ktv7m5ffujxv4248fxv36myvdx79n8jp6 (30.18 BTC)

Ang mga pag-atake sa Coldcard wallet ay patuloy na nangyayari, at ang koponan ng Beosin ay patuloy na sinusubaybayan ang mga karagdagang address ng pagkolekta at sinusuri ang mga daloy ng pera.

Tatlo: Wakas

Ang malaking insidente sa seguridad ng Coldcard hardware wallet ay nagmula sa maling implementasyon ng development team sa pagbuo ng random number, kung saan ginamit ang pseudorandom number generator sa mahalagang proseso ng pagbuo ng wallet seed. Dapat magpatuloy ang development team sa patuloy at komprehensibong pagsubok at pagsusuri ng code, habang dapat maglipat agad ng mga ari-arian ang mga gumagamit ng Coldcard wallet at manatiling nakafokus sa mga susunod na pahayag sa seguridad mula sa Coinkite.

Ang Beosin ay isang nagtataguyod na kompanya sa teknolohiya para sa seguridad at pagpapatupad ng regulasyon sa blockchain, na nakatuon sa pag-audit ng seguridad ng smart contract bago ang paglunsad ng proyekto, pagmonito at pagpigil sa mga panganib sa seguridad habang tumatakbo ang proyekto, pagbabalik ng mga nasasakop, pagtutol sa paglilinis ng pera (AML) para sa mga virtual na ari-arian, at pag-imbestiga at pagtatakas. Ang Beosin ay nagbigay ng “isang-solusyon” na mga produkto para sa pagpapatupad ng blockchain at serbisyo sa seguridad sa 20+ na bansa at rehiyon sa buong mundo, 200+ na mga serbisyong virtual na ari-arian, at 4,500+ na mga Web3 na proyekto.

Disclaimer: Ang information sa page na ito ay maaaring nakuha mula sa mga third party at hindi necessary na nagre-reflect sa mga pananaw o opinyon ng KuCoin. Ibinigay ang content na ito para sa mga pangkalahatang informational purpose lang, nang walang anumang representation o warranty ng anumang uri, at hindi rin ito dapat ipakahulugan bilang financial o investment advice. Hindi mananagot ang KuCoin para sa anumang error o omission, o para sa anumang outcome na magreresulta mula sa paggamit ng information na ito. Maaaring maging risky ang mga investment sa mga digital asset. Pakisuri nang maigi ang mga risk ng isang produkto at ang risk tolerance mo batay sa iyong sariling kalagayang pinansyal. Para sa higit pang information, mag-refer sa aming Terms ng Paggamit at Disclosure ng Risk.