कोल्डकार्ड हार्डवेयर वॉलेट में वल्नरेबिलिटी के कारण $88M से अधिक का बिटकॉइन चोरी हो गया

iconMetaEra
साझा करें
AI summary iconसारांश
एक गलत रूप से कॉन्फ़िगर किए गए RNG से जुड़ी एक कोल्डकार्ड हार्डवेयर वॉलेट की कमी के कारण 594 BTC चोरी हो गए, जिनका मूल्य 88 मिलियन डॉलर से अधिक है। यह समस्या कोल्डकार्ड Mk2, Mk3, Mk4, Q और Mk5 मॉडलों को प्रभावित करती है, जिससे निजी कुंजियाँ ब्रूट-फोर्स हमलों के लिए सुलभ हो गईं। बीओसिन ने संग्रहीत धनराशि को कई बिटकॉइन पतों तक ट्रैक किया है। इस घटना से CFT के तहत चिंताएँ उठती हैं और यूरोपीय संघ द्वारा क्रिप्टो नियमों को कठोर बनाए जाने के संदर्भ में MiCA के साथ पालन की आवश्यकता पर जोर दिया जा रहा है।

8800 डॉलर से अधिक की हानि: Coldcard हार्डवेयर वॉलेट दुर्बलता का विश्लेषण और चोरी हुए धन का अनुसरण 31 जुलाई को, लगभग 500 Coldcard हार्डवेयर वॉलेट्स से कुल 594 बिटकॉइन चोरी हो गए, जिनका मूल्य लगभग 3800 डॉलर था। इसके बाद Coldcard वॉलेट के निर्माता कंपनी Coinkite ने पुष्टि की कि इस उत्पाद में कुंजी उत्पादन चरण में सुरक्षा दुर्बलता है, जिसमें Coldcard Mk2, Mk3, Mk4, Q और Mk5 सहित कई पीढ़ियाँ शामिल हैं।

अभी तक, इस दुर्भावनापूर्ण हमले के कारण हुए नुकसान की राशि 8800 डॉलर से अधिक हो चुकी है, और हमला अभी भी जारी है। Coldcard वॉलेट उपयोगकर्ताओं को अपनी राशियों को तुरंत किसी अन्य पते पर स्थानांतरित कर लेना चाहिए। Beosin द्वारा इस दुर्भावनापूर्ण हमले का विश्लेषण और संबंधित चोरी हुई राशि के ट्रैकिंग की स्थिति निम्नलिखित है।

एक, दुर्बलता विश्लेषण

Coldcard फर्मवेयर कोड के कमिट रिकॉर्ड का विश्लेषण करने से पता चलता है कि पिछले कमिट 37e4af5451c260c1e7d429fe8972c4cb5e68ee59 में, डेवलपमेंट टीम ने MK4 कॉन्फ़िगरेशन के कई कोड को अपडेट किया है, जिसमें mpconfigboard.h में शामिल है:

// हमारे पास इस कोड का अपना संस्करण है।#define MICROPY_HW_ENABLE_RNG       (0)

माइक्रोपायथन STM32 पर, यह मैक्रो डिफ़ॉल्ट हार्डवेयर रैंडम नंबर जनरेटर (RNG) बाइंडिंग और जनरिक रैंडम नंबर इम्प्लीमेंटेशन के कंपाइल पाथ को नियंत्रित करता है। इसे 0 पर सेट करने से डिफ़ॉल्ट हार्डवेयर RNG पाथ को जनरिक rng_get() के बैकएंड के रूप में उपयोग नहीं किया जाएगा।

उसके टिप्पणी में बताया गया है कि डेवलपर स्वयं RNG को लागू करेंगे, उनके कस्टम rng.h की जाँच करने पर पता चलता है कि केवल दो MicroPython ऑब्जेक्ट्स की घोषणा की गई है:

MP_DECLARE_CONST_FUN_OBJ_0(pyb_rng_get_obj);MP_DECLARE_CONST_FUN_OBJ_1(pyb_rng_get_bytes_obj);

Corresponding implementation is:

/// \function pyb_rng_get()///// 30-बिट हार्डवेयर जनित यादृच्छिक संख्या प्राप्त करें: या विफलता!//STATIC mp_obj_t pyb_rng_get(void){    // नया यादृच्छिक संख्या प्राप्त करें और लौटाएं    return mp_obj_new_int(rng_get_or_fault() >> 2);}
/// \function rng_get_bytes()/// यादृच्छिक बिट्स के साथ एक बफर को भरें; कॉलर को आकार वाला बफर प्रदान करना होगा।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);    }
    // 32-बिट शब्द पढ़ें और उन्हें प्रदान किए गए बफर में अपैक करें    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);

rng_get_or_fault() स्वयं STM32 RNG पेरिफेरल को पढ़ता है:

static uint32_t rng_get_or_fault(void){    // यदि RNG पेरिफेरल पहले से सक्षम नहीं है, तो इसे सक्षम करें    rng_init();
    // एक नया यादृच्छिक संख्या तैयार होने का इंतजार करें, जिसमें लगभग 10us लगते हैं    uint32_t start = HAL_GetTick();
    while (!(RNG->SR & RNG_SR_DRDY)) {        if (HAL_GetTick() - start >= RNG_TIMEOUT_MS) {            // हार्डवेयर विफलता... कुछ भी वापस न करें!            mp_raise_OSError(MP_EFAULT);        }    }
    // नया यादृच्छिक संख्या प्राप्त करें और वापस करें    last_value = RNG->DR;
    return last_value;}

यह बताता है कि Coldcard कस्टम कोड वास्तव में हार्डवेयर RNG का उपयोग करना चाहता है, लेकिन यह केवल pyb_rng_get* या इसके आंतरिक random_buffer() को कॉल करने पर ही इस हार्डवेयर फ़ंक्शन का उपयोग सुनिश्चित करता है।

और वॉलेट बनाते समय निम्न कोड को वास्तव में कॉल किया जाता है, जिसमें shared/seed.py में वॉलेट बनाने का फ़ंक्शन है:

async def make_new_wallet(nwords):    # एक नया यादृच्छिक बीज चुनें।    await ux_dramatic_pause('Generating...', 3)    seed = generate_seed()    words = await approve_word_list(seed, nwords)    if words:        await commit_new_words(words)

यह कॉल सबसे पहले Coldcard के shared/random.py मॉड्यूल में प्रवेश करता है। पुराने संस्करणों में, random.py स्पष्ट रूप से ngu.random पर निर्भर करता था और बनाए रखा गया:

# random.py - random मॉड्यूल का एक उपसेट, बिना कोई संगतता के, और क्रिप्टो-गुणवत्ता वाले RNG का उपयोग करते हुए# बाइट्स के लिए, ngu.random.byte(len) का उपयोग करें# bytes = ngu.random.bytes

यानी कि वॉलेट इनिशियलाइजेशन के लिए random.bytes का उपयोग किया जाता है, pyb.rng() नहीं, और कस्टम pyb_rng_get_obj ने random.bytes को स्वचालित रूप से ओवरराइड नहीं किया है।

चूंकि MICROPY_HW_ENABLE_RNG को 0 पर सेट किया गया है, इसलिए वॉलेट जनरेशन के दौरान हार्डवेयर RNG का उपयोग नहीं किया गया है, बल्कि micropython/ports/stm32/rng.c का pyb_rng_yasmarang फ़ंक्शन कॉल किया गया है:

#if MICROPY_HW_ENABLE_RNG
uint32_t rng_get(void) {    // STM32 हार्डवेयर RNG का उपयोग करें    ...}
#else
// जिन MCUs में RNG नहीं है, उनके लिए हमें अभी भी rng_get() फ़ंक्शन प्रदान करने की आवश्यकता है।// एक प्सीडो-RNG वास्तव में आदर्श नहीं है, लेकिन हम अभी के लिए इसका उपयोग करते हैं।
// Yasmarang यादृच्छिक संख्या जनरेटरstatic 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

और pyb_rng_yasmarang एक प्रायोगिक यादृच्छिक संख्या जनरेटर है, जो हार्डवेयर वॉलेट बीज उत्पन्न करने के लिए बहुत असुरक्षित है, जिससे हमलावर ब्रूट फोर्स हमले के माध्यम से कुंजी प्राप्त कर सकते हैं। वर्तमान में, Coinkite ने makefile फ़ाइल में stm32/rng.c को स्पष्ट रूप से बाहर कर दिया है:

माइक्रोपायथन के फॉलबैक PRNG को संकलित न करें। बोर्ड-विशिष्ट rng.c  
rng_get() प्रदान करता है, और यह खाली ऑब्जेक्ट अपस्ट्रीम ऑब्जेक्ट सूची को संतुष्ट करता है।  
$(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 $@

द्वितीय: चोरी हुए धन का अनुसरण

अभी तक, कई पीड़ित वॉलेट की धनराशि स्थानांतरित कर दी गई है और कई पतों पर एकत्रित कर ली गई है, जिन्हें अभी तक आगे साफ नहीं किया गया है। Beosin Trace ने खतरे की सूचना और चेन पर व्यवहार विश्लेषण के माध्यम से निम्नलिखित एकत्रित पते का पता लगाया है:

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

इसके अलावा, निम्नलिखित संग्रह पते हैं, जिनकी धन प्रवाह आरेख ऊपर के आरेख के समान है, और वर्तमान में कोई अतिरिक्त स्थानांतरण नहीं हुआ है:

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

Coldcard वॉलेट के खिलाफ हमला अभी भी जारी है, Beosin टीम अधिक संग्रह एड्रेस की निगरानी कर रही है और संबंधित फंड प्रवाह का विश्लेषण कर रही है।

तीन, समापन

इस Coldcard हार्डवेयर वॉलेट की गंभीर सुरक्षा घटना का कारण विकास टीम द्वारा रैंडम नंबर जनरेशन के कार्यान्वयन में त्रुटि थी, जिसमें महत्वपूर्ण वॉलेट सीड जनरेशन चरण में प्सीडो-रैंडम नंबर जनरेटर का उपयोग किया गया। विकास टीम को कोड का निरंतर, व्यापक परीक्षण और ऑडिट करना चाहिए, और Coldcard वॉलेट उपयोगकर्ताओं को अपने संपत्ति स्थानांतरित करने के लिए शीघ्र कार्रवाई करनी चाहिए और Coinkite के आगे के सुरक्षा अधिसूचनाओं पर ध्यान देना चाहिए।

Beosin एक अग्रणी ब्लॉकचेन सुरक्षा और नियामक अनुपालन टेक कंपनी है, जो प्रोजेक्ट लॉन्च से पहले स्मार्ट कॉन्ट्रैक्ट सुरक्षा ऑडिट, प्रोजेक्ट चलाने के दौरान सुरक्षा जोखिम की निगरानी और रोकथाम, चोरी हुए संपत्ति की वापसी, वर्चुअल संपत्ति धोखाधड़ी के खिलाफ प्रतिबंध (AML) और जांच और ट्रैकिंग पर केंद्रित है। Beosin ने वैश्विक स्तर पर 20 से अधिक देशों और क्षेत्रों के नियामक और कानून प्रवर्तन एजेंसियों, 200 से अधिक वर्चुअल संपत्ति सेवा प्रदाताओं और 4500 से अधिक Web3 प्रोजेक्ट्स को "वन-स्टॉप" ब्लॉकचेन अनुपालन उत्पाद + सुरक्षा सेवाएं प्रदान की हैं।

डिस्क्लेमर: इस पेज पर दी गई जानकारी थर्ड पार्टीज़ से प्राप्त की गई हो सकती है और यह जरूरी नहीं कि KuCoin के विचारों या राय को दर्शाती हो। यह सामग्री केवल सामान्य सूचनात्मक उद्देश्यों के लिए प्रदान की गई है, किसी भी प्रकार के प्रस्तुतीकरण या वारंटी के बिना, न ही इसे वित्तीय या निवेश सलाह के रूप में माना जाएगा। KuCoin किसी भी त्रुटि या चूक के लिए या इस जानकारी के इस्तेमाल से होने वाले किसी भी नतीजे के लिए उत्तरदायी नहीं होगा। डिजिटल संपत्तियों में निवेश जोखिम भरा हो सकता है। कृपया अपनी वित्तीय परिस्थितियों के आधार पर किसी प्रोडक्ट के जोखिमों और अपनी जोखिम सहनशीलता का सावधानीपूर्वक मूल्यांकन करें। अधिक जानकारी के लिए, कृपया हमारे उपयोग के नियम और जोखिम प्रकटीकरण देखें।