Подписанты федерации Blockstream на этот раз не потеряли ни одного приватного ключа. Их процесс подписи от начала до конца прошёл ровно по замыслу: функциональные ноды проверили всё, что должны были проверить, затем по уставу выпустили биткоины. Проблема в том, что партия L-BTC, под которую требовали вывод, была создана «из воздуха» — никто этого не заметил.
Инцидент произошёл 6 сентября. Кто-то использовал уязвимость в Elements, чтобы на Liquid выпустить около 4000 L-BTC без биткоин-обеспечения. Затем эти документы передали члену федерации SideSwap — и тот прошёл полностью обычный peg-out. Примерно через полчаса, почти 4000 $BTC покинули адреса резервного хранения; по курсу на тот момент это составило более 300 миллионов долларов. До происшествия на этом адресе было 4205; после завершения вывода и обработки последующих операций осталось только 197. Сеть затем остановили, и до сих пор она не была перезапущена.
Уязвимость жила на слое конфиденциальных транзакций. Liquid прячет сумму перевода, а ноды с помощью range proof подтверждают, что учёт по транзакции «сходится». Проверка каждого такого доказательства требует немалых вычислений, поэтому Elements кэшировала результаты проверок и переиспользовала их. Ключ кэша был утечён — в нём отсутствовал контекст на уровне актива и скрипта. В итоге доказательство, которое уже кем-то было проверено в другом контексте, можно было повторно использовать для нового выпуска-обеспечения. В официально выпущенном Elements 23.3.4 позже исправление назвали так: «усилить ключ кэша для range proof», а также добавили переключатель, чтобы ноды вовсе не кэшировали.
Порог сам по себе не был проблемой. Из пятнадцати ключей надо собрать одиннадцать подписей — так и было сделано; подписанты были реальными. Функциональные ноды проверяли, был ли peg-out инициирован членом, имеющим полномочия по PAK; что при этом изначально в L-BTC были действительно обеспечены биткоинами, не входило в круг их проверки. Ноды SideSwap и функциональные ноды по всему миру запускали одну и ту же версию Elements, наткнулись на один и тот же дефект кэша и получили ответ из одного источника — независимых проверок по сути не было. Если повысить порог ещё выше, результат бы не изменился.
Дать этой группе точную характеристику пока не удалось. Со стороны злоумышленников в адрес основной цепочки оставили сообщение, где они назывались white hat и просили связаться с ними в ончейне; Blockstream ответил безопасной почтой. Вечером 7 сентября 3400 биткоинов вернулись на резервный адрес; остальные 598,5 до сих пор не трогали. Тогда CTO Ledger Чарльз Гийемэ говорил, что white hat не станет сначала «вытаскивать мост» досуха, а потом приходить за контактами. Позже он смягчил формулировку: признал, что это и правда не похоже на обычное поведение white hat, но обычные преступные организации и сами не стали бы напрямую связываться с жертвой. Оставив деньги у себя, он скорее назвал это не «белой шляпой», а шантажом. А Samson Mow из JAN3 отметил, что запрос на перевод в Signal исходил с другого адреса.
Термин «white hat» я не принимаю: тот, кто ведёт переговоры, имея на руках деньги, не является white hat. Но это разные вещи — могут ли деньги вернуться, и у Blockstream сейчас нет более сильного рычага.
В этот раз проблема была в верификации записей: слой хранения на самом деле не сломался, и это особенно важно помнить. В майском роадмапе Blockstream есть BitVM-подобный мост 1-of-n: по замыслу он должен снизить доверие с точки зрения сговора — чтобы хватило одного честного человека. Эта конструкция рассчитана на то, чтобы предотвращать сговор и бегство, но она не умеет гарантировать, что все побегут прочитать одну и ту же заражённую версию кода и в одном и том же месте ошибутся в учёте. Даже если в федерации сидит сотня честных членов, они читают всё равно одну и ту же загрязнённую книгу.
Поэтому для людей, у которых на руках разные обёртки BTC или кроссчейн BTC, количество подписантов как показатель почти не имеет смысла. Я хочу проверить три вещи: кто имеет право отчеканить новые документы; чем именно после выпуска сверяются эти документы; и являются ли те, кто выполняет сверку, независимыми проверяющими. Третья вещь на этот раз и стала ключевой. #Bitcoin в самой основной сети всё цело — проблема всё время была в надстройке, стоящей рядом.
У модели федерации есть и свои плюсы. Да, сеть можно остановить — и тогда плохие долги останутся там, где остановились. А если столкнуть с инфляционной уязвимостью сеть, которую никто не в силах остановить, то необеспеченные документы будут распространяться по всей цепочке downstream — и их уже не собрать обратно.
Патч выпустили уже в ночь на 9 сентября, но цепь оставалась остановленной на том состоянии, где она была на рассвете 7 сентября. Со стороны кода всё уже было готово; «застряли» в том, как убрать запись о недействительном peg-out из учёта и кто должен закрыть образовавшуюся брешь. Сейчас на резервном адресе лежит 3601 биткоин; L-BTC, ожидающие конвертации, — ещё свыше 4100. Официально сказано, что при перезапуске они откажутся от недействительного вывода и восстановят полное обеспечение. Но не сказано, кто именно заполнит эту дыру. Если в итоге дыру залатают Blockstream или сами члены федерации, это будет инцидент уровня кода — и критика за направление к хранению (custody) не ляжет по существу. А если дыру переложат на владельцев L-BTC, то та критика получит доказательства.
Стоит обратить внимание на баланс того резервного адреса. Как только цепь восстановится и начнёт добывать блоки, будет видно, пополнился ли баланс — это напрямую информирует сильнее любых пресс-релизов.
Инцидент произошёл 6 сентября. Кто-то использовал уязвимость в Elements, чтобы на Liquid выпустить около 4000 L-BTC без биткоин-обеспечения. Затем эти документы передали члену федерации SideSwap — и тот прошёл полностью обычный peg-out. Примерно через полчаса, почти 4000 $BTC покинули адреса резервного хранения; по курсу на тот момент это составило более 300 миллионов долларов. До происшествия на этом адресе было 4205; после завершения вывода и обработки последующих операций осталось только 197. Сеть затем остановили, и до сих пор она не была перезапущена.
Уязвимость жила на слое конфиденциальных транзакций. Liquid прячет сумму перевода, а ноды с помощью range proof подтверждают, что учёт по транзакции «сходится». Проверка каждого такого доказательства требует немалых вычислений, поэтому Elements кэшировала результаты проверок и переиспользовала их. Ключ кэша был утечён — в нём отсутствовал контекст на уровне актива и скрипта. В итоге доказательство, которое уже кем-то было проверено в другом контексте, можно было повторно использовать для нового выпуска-обеспечения. В официально выпущенном Elements 23.3.4 позже исправление назвали так: «усилить ключ кэша для range proof», а также добавили переключатель, чтобы ноды вовсе не кэшировали.
Порог сам по себе не был проблемой. Из пятнадцати ключей надо собрать одиннадцать подписей — так и было сделано; подписанты были реальными. Функциональные ноды проверяли, был ли peg-out инициирован членом, имеющим полномочия по PAK; что при этом изначально в L-BTC были действительно обеспечены биткоинами, не входило в круг их проверки. Ноды SideSwap и функциональные ноды по всему миру запускали одну и ту же версию Elements, наткнулись на один и тот же дефект кэша и получили ответ из одного источника — независимых проверок по сути не было. Если повысить порог ещё выше, результат бы не изменился.
Дать этой группе точную характеристику пока не удалось. Со стороны злоумышленников в адрес основной цепочки оставили сообщение, где они назывались white hat и просили связаться с ними в ончейне; Blockstream ответил безопасной почтой. Вечером 7 сентября 3400 биткоинов вернулись на резервный адрес; остальные 598,5 до сих пор не трогали. Тогда CTO Ledger Чарльз Гийемэ говорил, что white hat не станет сначала «вытаскивать мост» досуха, а потом приходить за контактами. Позже он смягчил формулировку: признал, что это и правда не похоже на обычное поведение white hat, но обычные преступные организации и сами не стали бы напрямую связываться с жертвой. Оставив деньги у себя, он скорее назвал это не «белой шляпой», а шантажом. А Samson Mow из JAN3 отметил, что запрос на перевод в Signal исходил с другого адреса.
Термин «white hat» я не принимаю: тот, кто ведёт переговоры, имея на руках деньги, не является white hat. Но это разные вещи — могут ли деньги вернуться, и у Blockstream сейчас нет более сильного рычага.
В этот раз проблема была в верификации записей: слой хранения на самом деле не сломался, и это особенно важно помнить. В майском роадмапе Blockstream есть BitVM-подобный мост 1-of-n: по замыслу он должен снизить доверие с точки зрения сговора — чтобы хватило одного честного человека. Эта конструкция рассчитана на то, чтобы предотвращать сговор и бегство, но она не умеет гарантировать, что все побегут прочитать одну и ту же заражённую версию кода и в одном и том же месте ошибутся в учёте. Даже если в федерации сидит сотня честных членов, они читают всё равно одну и ту же загрязнённую книгу.
Поэтому для людей, у которых на руках разные обёртки BTC или кроссчейн BTC, количество подписантов как показатель почти не имеет смысла. Я хочу проверить три вещи: кто имеет право отчеканить новые документы; чем именно после выпуска сверяются эти документы; и являются ли те, кто выполняет сверку, независимыми проверяющими. Третья вещь на этот раз и стала ключевой. #Bitcoin в самой основной сети всё цело — проблема всё время была в надстройке, стоящей рядом.
У модели федерации есть и свои плюсы. Да, сеть можно остановить — и тогда плохие долги останутся там, где остановились. А если столкнуть с инфляционной уязвимостью сеть, которую никто не в силах остановить, то необеспеченные документы будут распространяться по всей цепочке downstream — и их уже не собрать обратно.
Патч выпустили уже в ночь на 9 сентября, но цепь оставалась остановленной на том состоянии, где она была на рассвете 7 сентября. Со стороны кода всё уже было готово; «застряли» в том, как убрать запись о недействительном peg-out из учёта и кто должен закрыть образовавшуюся брешь. Сейчас на резервном адресе лежит 3601 биткоин; L-BTC, ожидающие конвертации, — ещё свыше 4100. Официально сказано, что при перезапуске они откажутся от недействительного вывода и восстановят полное обеспечение. Но не сказано, кто именно заполнит эту дыру. Если в итоге дыру залатают Blockstream или сами члены федерации, это будет инцидент уровня кода — и критика за направление к хранению (custody) не ляжет по существу. А если дыру переложат на владельцев L-BTC, то та критика получит доказательства.
Стоит обратить внимание на баланс того резервного адреса. Как только цепь восстановится и начнёт добывать блоки, будет видно, пополнился ли баланс — это напрямую информирует сильнее любых пресс-релизов.
