Уразливість апаратних гаманців Coldcard призвела до викрадення біткоїнів більш ніж на $88 млн
Ринкове зведення ШІ
Як повідомляється, розкрита вада генерації ключів у апаратному гаманці Coldcard дозволила зловмисникам викрасти понад $88M у BTC, при цьому експлойт описується як такий, що триває, а кошти агрегуються ончейн. Хоча це не проблема Bitcoin на рівні протоколу, інцидент може тиснути на короткострокові настрої, підвищуючи ризики зберігання та операційні ризики, потенційно спонукаючи до прискореної міграції до самостійного зберігання, посиленого контролю ланцюгів постачання апаратних гаманців і збільшення моніторингу пов'язаних адрес біржами та командами з комплаєнсу.
Рівень впливу
● Високий
Активи, яких стосується
BTC/USDT+0.87%
Інсайт ШІ · BTC/USDTІнсайт ШІ
▼ Ведмежий
Торгувати
⚠️ Інсайти, згенеровані ШІ, ґрунтуються на новинних матеріалах і надаються виключно з інформаційною метою. Вони не є інвестиційною порадою та не відображають поглядів BingX. Інвестування пов’язане з ризиком. Будь ласка, торгуйте відповідально.
Сукупні збитки від експлуатації уразливості в апаратних гаманцях Coldcard уже перевищили $88 млн, а атака триває. 31 липня було скомпрометовано приблизно 500 пристроїв Coldcard, унаслідок чого зловмисники викрали 594 BTC орієнтовною вартістю близько $38 млн. Компанія Coinkite, виробник Coldcard, згодом підтвердила проблему безпеки в механізмі генерації ключів, яка зачіпає кілька поколінь продукту: Coldcard Mk2, Mk3, Mk4, Q та Mk5. Користувачам рекомендують якомога швидше перевести кошти на іншу адресу.
Нижче наведено виклад аналізу Beosin щодо технічної причини інциденту та руху викрадених коштів.
I. Технічний розбір уразливості
Аналіз історії комітів прошивки Coldcard показує, що в попередньому коміті 37e4af5451c260c1e7d429fe8972c4cb5e68ee59 команда оновила фрагменти коду, пов'язані з конфігурацією MK4. Зокрема, у mpconfigboard.h було встановлено:
// We have our own version of this code.
#define MICROPY_HW_ENABLE_RNG (0)
У MicroPython для STM32 цей макрос визначає, чи буде використовуватися стандартна прив'язка апаратного генератора випадкових чисел (RNG) як бекенд для загального rng_get(). Значення 0 відключає стандартний шлях апаратного RNG. Коментарі вказують, що розробник планує реалізувати 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);
Їхня реалізація, за оцінкою Beosin, справді орієнтована на використання апаратного RNG, але гарантує його застосування лише у викликах pyb_rng_get* або внутрішньому random_buffer().
Під час створення гаманця Coldcard фактично викликається логіка з shared/seed.py:
async def make_new_wallet(nwords):
# Select a new random seed.
await ux_dramatic_pause('Generating...', 3)
seed = generate_seed()
words = await approve_word_list(seed, nwords)
if words:
await commit_new_words(words)
Цей виклик переходить до модуля shared/random.py. У попередніх версіях random.py явно покладався на ngu.random і містив підказку:
# random.py subset of the random module, with no compatibility, using cryptographically secure RNG
# for bytes, use ngu.random.bytes(len)
# bytes = ngu.random.bytes
Ініціалізація гаманця використовує random.bytes, а не pyb.rng(); відповідно, користувацький pyb_rng_get_obj не підміняє random.bytes автоматично. Через MICROPY_HW_ENABLE_RNG (0) у процесі генерації seed, за висновком Beosin, не використовувався апаратний RNG, натомість спрацьовував fallback із micropython/ports/stm32/rng.c — pyb_rng_yasmarang:
#if MICROPY_HW_ENABLE_RNG
uint32_t rng_get(void) {
// Use STM32 hardware RNG ...
}
#else
// For MCUs without an RNG, we still need to provide an rng_get() function.
// A pseudoRNG is not ideal, but we use it for now.
// Yasmarang random number generator
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 є псевдовипадковим генератором і вважається неприйнятним для створення seed апаратного гаманця, оскільки дає змогу атакувальникам підібрати ключ перебором.
Coinkite, за даними Beosin, уже прямо виключила stm32/rng.c з процесу збірки через Makefile, щоб не компілювати fallback PRNG MicroPython:
Do not compile MicroPython's fallback PRNG.
The board-specific rng.c provides rng_get(), and this empty object satisfies the upstream object list.
$(BUILD)/rng.o: CFLAGS += Dpyb_rng_yasmarang=errordonotwantthis
$(BUILD)/rng.o:
$(ECHO) "SKIP stm32/rng.c"
$(Q)$(CC) $(CFLAGS) -xc -c /dev/null -o $@
II. Відстеження викрадених коштів
Кошти з кількох гаманців жертв уже було переведено та агреговано на низці адрес; ознак подальшого відмивання на цей момент не зафіксовано. За результатами threat intelligence та аналізу ончейн-поведінки Beosin Trace назвала такі адреси-агрегатори:
bc1qq85v2c926eg6pgxhwp6q7lf6cnsz80qs3fcu9r (562 BTC)
bc1qx76cae2706qd5q576feh7xq8rfcsjpf2htfhe3 (398.47 BTC)
Також зазначено додаткові адреси з подібним шаблоном руху коштів, по яких поки не відбулося подальших переказів:
bc1q8jy96fe5lf8vfugydnte3cguk92gpev7kwtp3q (89.62 BTC)
bc1q0rvn88w08j75k4h48lf9fvhan7unjp7vjf5q6m (64.9 BTC)
bc1qtfrwa4j6rmj9rsgspv6a0yjumkg39js2numu75 (45.9 BTC)
bc1qmd5m5ktv7m5ffujxv4248fxv36myvdx79n8jp6 (30.18 BTC)
Beosin повідомляє, що атаки на Coldcard продовжуються, а команда й надалі моніторить нові адреси агрегації та аналізує подальший рух коштів.
III. Висновки
Як зазначає Beosin, інцидент став наслідком помилки реалізації: у критичному етапі генерації seed було використано псевдовипадковий генератор замість криптографічно надійного джерела випадковості. Розробникам рекомендовано проводити постійне комплексне тестування та аудит коду. Користувачам Coldcard радять оперативно перевести активи на нову адресу та уважно стежити за подальшими повідомленнями Coinkite щодо безпеки.
Beosin позиціонує себе як провідну компанію у сфері блокчейн-безпеки та технологій регуляторного комплаєнсу, яка спеціалізується на передрелізних аудитах безпеки смартконтрактів, моніторингу та блокуванні ризиків у реальному часі, поверненні активів, AML для віртуальних активів і розслідувальному ончейн-трейсингу. Компанія повідомляє, що надала "onestop" комплаєнс-продукти та послуги безпеки регуляторам і правоохоронним органам у понад 20 країнах і регіонах, більш ніж 200 постачальникам послуг із віртуальними активами та 4,500+ Web3-проєктам.