Альтернативно про криптосферу.
Расследования, опровержения, легализация, регулирование, CBDC Фундаментальный, сентимент, on-chain анализ.
Чат канала - @gfistalk
Наш проект:
BTCparser.com
Связь: @taisiarom
Команда: @taisiarom @BTCparser @streamtv85
Post #526
6.17K
Про последний взлом Bitcoin кошелька Coldcard
Ночью в чате мы разбирали эту историю по цепочкам, и картина получилась шире той, что разошлась по новостям.
Кратко: ломали не устройство и не пользователя - ломали генерацию сида. У аппаратного кошелька нет операционной системы, а значит, нет и её источника случайности: энтропию он добывает сам, своим железом. В прошивке вместо аппаратного источника оказался программный, со слабой энтропией. Следствие простое: такой сид воспроизводится офлайн, без участия владельца - перебрать варианты, получить из них адреса, сверить с блокчейном и подписать вывод.
Вечером 30 июля производитель это подтвердил, а к утру, получив жалобы на чужие опустошённые кошельки, инженеры Block (Bitkey) выложили свой разбор.
Как это выглядело в сети: 1195 адресов опустошены за 41 минуту, переводы однотипные, комиссия одинаковая. Суммарно около 1082,59 BTC.
И вот здесь важный момент, которого в публикациях нет. Веток было две. СМИ расписали первую волну - порядка 594 BTC примерно с 500 адресов - и на этом остановились. Параллельно шла вторая: отдельные транзакции, свой адрес-сборщик, 491 адрес, около 398,5 BTC. Наборы адресов не пересекаются ни одним кошельком, поэтому по отдельности каждая ветка читается как самостоятельный инцидент.
Ончейн-факты связывают их между собой: два сборщика ранней волны ушли одной транзакцией на 204 входа, вторая ветка - отдельной на 491 вход, но в том же блоке 960190 и в ту же минуту, 01:43 UTC. Ещё один сборщик не опустошён: 562 BTC лежат на нём до сих пор. Позже добавился фрагмент ещё почти на 89,6 BTC. То есть фактический объём вдвое выше опубликованного.
Ещё одно наблюдение, из мемпула. Присутствовал всплеск замен транзакций (RBF), что читается двояко: владельцы наперегонки вытаскивают монеты или перехватчики дерутся за один ключ. По срезу на 08:00 UTC во всех 149 парах замен падение выплаты в точности равно приросту комиссии - люди добивают комиссию собственных переводов, следов гонки за чужой UTXO не видно.
Отсюда версия - именно версия, а не вывод. Базы владельцев уязвимых устройств для такой атаки не нужно: при маленьком пространстве ключей поиск идёт не «вот владелец, найдём его ключ», а наоборот - генерируется кандидат, из него выводятся адреса и сверяются с публичным набором UTXO. Адресов, созданных на устройстве, продавец не видит, так что инсайдер не нужен. Скорее всего, атака была в формате «а попробую-ка я дать эту задачу ИИ», что радикально снижает порог квалификации взломщика.
Отдельно - то, что произошло по ходу дня: позиция производителя изменилась, и это меняет круг пострадавших. Вчера речь шла только про Mk3, а Mk4, Q и Mk5 считались «не затронутыми по ранней оценке». В обновлённом адвайзори этой формулировки уже нет: под угрозой все сиды с Mk3 начиная с прошивки 4.0.1, а также сиды с Mk4 и Mk5 до версии 5.6.0 и с Q до 1.5.0Q - там около 72 бит энтропии вместо положенных 128. TAPSIGNER, OPENDIME и SATSCARD не затронуты, у них другая кодовая база. Расследование не закончено, круг могут уточнить ещё раз. Кевин Луаэк из Wizardsardine формулирует жёстче: под ударом и мультиподписи, собранные из этих устройств.
Кому, вероятно, повезло. Сайфедин Аммус напомнил про броски костей: при генерации через Add Dice Rolls прошивка подмешивала каждый бросок к машинной энтропии, поэтому от 50 бросков одни кости дают не меньше 128 бит, а от 99 - около 256. Меньше 50 или не помните сколько - считайте, что сид под угрозой. Пассфраза (BIP-39, а не PIN) тоже барьер, но только длинная и уникальная - короткую или переиспользованную подберут.
Что же делать владельцам кошельков? Скомпрометирован сид, а не железо: перепрошивка не чинит уже созданный ключ. Новый сид - на исправленной прошивке или другом устройстве. И главное, чем заканчивают сами Coinkite: спешка при миграции опаснее самой уязвимости. Сверить адрес на экране, отправить пробную сумму, дождаться её и только потом переводить остальное.
Отдельная благодарность @Kikcha за первый сигнал об инциденте, а так же Павлу и Михаилу за участие в разборе инцидента. Помогал в расследовании наш прекрасный сын полка Чадо
Ночью в чате мы разбирали эту историю по цепочкам, и картина получилась шире той, что разошлась по новостям.
Кратко: ломали не устройство и не пользователя - ломали генерацию сида. У аппаратного кошелька нет операционной системы, а значит, нет и её источника случайности: энтропию он добывает сам, своим железом. В прошивке вместо аппаратного источника оказался программный, со слабой энтропией. Следствие простое: такой сид воспроизводится офлайн, без участия владельца - перебрать варианты, получить из них адреса, сверить с блокчейном и подписать вывод.
Вечером 30 июля производитель это подтвердил, а к утру, получив жалобы на чужие опустошённые кошельки, инженеры Block (Bitkey) выложили свой разбор.
Как это выглядело в сети: 1195 адресов опустошены за 41 минуту, переводы однотипные, комиссия одинаковая. Суммарно около 1082,59 BTC.
И вот здесь важный момент, которого в публикациях нет. Веток было две. СМИ расписали первую волну - порядка 594 BTC примерно с 500 адресов - и на этом остановились. Параллельно шла вторая: отдельные транзакции, свой адрес-сборщик, 491 адрес, около 398,5 BTC. Наборы адресов не пересекаются ни одним кошельком, поэтому по отдельности каждая ветка читается как самостоятельный инцидент.
Ончейн-факты связывают их между собой: два сборщика ранней волны ушли одной транзакцией на 204 входа, вторая ветка - отдельной на 491 вход, но в том же блоке 960190 и в ту же минуту, 01:43 UTC. Ещё один сборщик не опустошён: 562 BTC лежат на нём до сих пор. Позже добавился фрагмент ещё почти на 89,6 BTC. То есть фактический объём вдвое выше опубликованного.
Ещё одно наблюдение, из мемпула. Присутствовал всплеск замен транзакций (RBF), что читается двояко: владельцы наперегонки вытаскивают монеты или перехватчики дерутся за один ключ. По срезу на 08:00 UTC во всех 149 парах замен падение выплаты в точности равно приросту комиссии - люди добивают комиссию собственных переводов, следов гонки за чужой UTXO не видно.
Отсюда версия - именно версия, а не вывод. Базы владельцев уязвимых устройств для такой атаки не нужно: при маленьком пространстве ключей поиск идёт не «вот владелец, найдём его ключ», а наоборот - генерируется кандидат, из него выводятся адреса и сверяются с публичным набором UTXO. Адресов, созданных на устройстве, продавец не видит, так что инсайдер не нужен. Скорее всего, атака была в формате «а попробую-ка я дать эту задачу ИИ», что радикально снижает порог квалификации взломщика.
Отдельно - то, что произошло по ходу дня: позиция производителя изменилась, и это меняет круг пострадавших. Вчера речь шла только про Mk3, а Mk4, Q и Mk5 считались «не затронутыми по ранней оценке». В обновлённом адвайзори этой формулировки уже нет: под угрозой все сиды с Mk3 начиная с прошивки 4.0.1, а также сиды с Mk4 и Mk5 до версии 5.6.0 и с Q до 1.5.0Q - там около 72 бит энтропии вместо положенных 128. TAPSIGNER, OPENDIME и SATSCARD не затронуты, у них другая кодовая база. Расследование не закончено, круг могут уточнить ещё раз. Кевин Луаэк из Wizardsardine формулирует жёстче: под ударом и мультиподписи, собранные из этих устройств.
Кому, вероятно, повезло. Сайфедин Аммус напомнил про броски костей: при генерации через Add Dice Rolls прошивка подмешивала каждый бросок к машинной энтропии, поэтому от 50 бросков одни кости дают не меньше 128 бит, а от 99 - около 256. Меньше 50 или не помните сколько - считайте, что сид под угрозой. Пассфраза (BIP-39, а не PIN) тоже барьер, но только длинная и уникальная - короткую или переиспользованную подберут.
Что же делать владельцам кошельков? Скомпрометирован сид, а не железо: перепрошивка не чинит уже созданный ключ. Новый сид - на исправленной прошивке или другом устройстве. И главное, чем заканчивают сами Coinkite: спешка при миграции опаснее самой уязвимости. Сверить адрес на экране, отправить пробную сумму, дождаться её и только потом переводить остальное.
Отдельная благодарность @Kikcha за первый сигнал об инциденте, а так же Павлу и Михаилу за участие в разборе инцидента. Помогал в расследовании наш прекрасный сын полка Чадо









