Баг лежал в прошивке Coldcard пять лет никем не замеченный — вот что это говорит про open source, а не про Coldcard
Технический разбор того, что произошло, вы уже наверняка видели: с 1 марта 2021 года прошивка Coldcard использовала programmatic PRNG вместо аппаратного TRNG для генерации seed-фраз, Mk3 получал около 40 бит энтропии вместо 128, Mk4/5/Q — около 72. 31 июля кто-то нашёл слабое место и вывел порядка 594 BTC (~$38M) примерно с 500 кошельков за 25 минут. Механика бага уже разобрана детально в нескольких тредах, и я не буду её повторять построчно.
Меня в этой истории занимает другая цифра, гораздо менее обсуждаемая, чем сумма украденного: пять лет. Именно столько прошло между тем, как ошибка попала в код, и тем, как её кто-то использовал. Пять лет, за которые прошивку теоретически видели тысячи людей — исходный код Coldcard открыт, это ровно то, чем проект гордится и что рекомендуют все, включая меня, как критерий доверия к аппаратному кошельку.
И вот в чём проблема с этим критерием: «открытый код» — это утверждение о возможности проверки, а не о том, что проверка реально произошла. Пять лет никто — ни внутренний ревью команды, ни внешний аудит, ни открытое сообщество, читающее исходники ради собственной безопасности, — не поймал слабость в самом фундаментальном месте, какое только есть у аппаратного кошелька: в источнике случайности для приватного ключа. Заметили её не аудиторы. Заметил её злоумышленник, который её же и эксплуатировал.
Это не история про то, что у Coinkite плохая инженерная культура — судя по всему, обычная. Это история про то, что фраза «больше глаз — значит безопаснее» — это утверждение, которое нужно активно проверять фактическим аудитом, а не принимать как данность просто потому, что репозиторий публичный. Открытость создаёт возможность проверки. Она не гарантирует, что кто-то этой возможностью воспользовался вовремя.
Вопрос, который я бы задал не про Coldcard, а про весь класс устройств: сколько ещё аппаратных кошельков прямо сейчас несут в себе непроверенный путь генерации энтропии, который никто не аудировал именно потому, что «код же открытый, наверное кто-то уже посмотрел»? Мы это узнаем, скорее всего, тем же способом, что и в этот раз — постфактум.
Комментариев (3)
Пять лет это реально жёстко. У меня вопрос: багбаунти у Coinkite вообще был на этот конкретный компонент прошивки, или там просто никто не докопался до генерации энтропии?
Открытый код это не аудит, точно подмечено. У меня после этой истории реальное желание проверить прошивку своего кошелька, а раньше даже не задумывался.
Пять лет незамеченного бага в Coldcard уже не выглядят единичным случаем: через девять дней та же история повторилась в BTCPay, только вместо энтропии там был доступ к macaroon. Два разных слоя стека, один и тот же провал ревью.