Семь лет баг незаметно жил в приложении для аппаратных кошельков Ledger — и раскрылся только потому, что кто-то начал использовать его на практике.
Речь о приложении для сети Zilliqa, которое Ledger предлагал пользователям с 2019 года для подписи «родных», не-EVM-транзакций. Программа неправильно собирала случайное число для каждой подписи: терялись восемь байт настоящей энтропии, а вместо них оставались нули из технического буфера. В криптографии такой параметр называют nonce — по сути, разовый «случайный ключ» к подписи. Если он предсказуем, соседние подписи одного и того же аккаунта можно сравнить между собой и математически вычислить приватный ключ — без вирусов, без доступа к устройству, только по данным, которые и так лежат в открытом виде в блокчейне. По оценке Zilliqa, для этого достаточно пяти таких подписей, а расчёт занимает секунды на обычном компьютере.
19 июля биржа KuCoin заметила подозрительную активность в сети и начала разбираться. К 21 июля причину подтвердили, а 22-го Zilliqa раскрыла детали публично. Один день между этими датами уже стоил проекту как минимум одной кражи: с холодного кошелька биржи-партнёра вывели ZIL, сумму не раскрывают. Сеть немедленно остановила все «родные» транзакции — EVM-совместимые переводы бага не затронул. Upbit заморозил ввод и вывод ZIL, токен за неделю потерял около 17–19%, опустившись примерно до $0,0024.
Важная деталь: сами устройства Ledger не взломаны — проблема была в стороннем приложении, а не в защищённом чипе кошелька. Но пользователям, которые с 2019 года подписывали «родные» ZIL-транзакции через Ledger, от этого не легче: даже после исправления старые подписи уже опубликованы в блокчейне навсегда, и восстановленный по ним ключ остаётся скомпрометированным. Единственный выход — перевести средства на новый адрес с чистой историей.
История поднимает вопрос не только про Zilliqa: аппаратный кошелёк защищает ключ внутри чипа, но подпись всё равно готовит программный код — и если в нём ошибка, железо тут ни при чём.



