Какой релиз зафиксирован CVE-2010-5141 (злоумышленник может потратить любую монету)

Этот пост Майка Херна связывает интересную историю:

  

Когда биткойн был впервые выпущен, он содержал две совершенно смертельные ошибки, которые сделали всю систему бесполезной. К счастью, они были найдены и исправлены до того, как Биткойн действительно имел какую-то серьезную ценность.

     

Первая ошибка заключалась в том, что скрипты были объединены до запуска вместо использования общего стека. Это означало, что любой мог написать скриптSig, который всегда оценивался как истинный и требовал, чтобы кто-либо elses монеты. Исправлено в v0.3.2:

     

https://github.com/bitcoin/bitcoin/commit/73aa262647ff9948eaf95e83236ec323347e95d0

Однако ссылка указывает на обновление 0.3.7 .

Если посмотреть на diff, это обновление, похоже, изменит интерпретатор сценария тем способом, который описал Майк.

В обновлении 0.3.7 поиск очень мало. Одним ударом был этот вопрос , в котором не было ответов:

  

Я заметил, что 0.3.7 выпущен на веб-сайте, но после поиска в форумах я не могу найти никакой информации о том, что такое изменения. Не берите в голову, что изменения от версии к версии должны быть упакованы вместе с загрузкой ....

     

кто-нибудь хочет понять меня на этом?

Страница CVE , однако, заявляет следующее:

  

28 июля 2010 года в тестовой сети были обнаружены и продемонстрированы две ошибки. Один из них использовал ошибку в коде обработки транзакций и позволил злоумышленнику тратить монеты, которых у них не было. Это никогда не использовалось в основной сети и было исправлено по версии Bitcoin 0.3.5.

Итак, в зависимости от используемого вами источника релиз, который исправил ошибку, был 0.3.2, 0.3.5 или 0.3.7.

Учитывая, что это была одна из худших ошибок в истории биткойнов, похоже, что документация должна быть более последовательной. Может ли кто-нибудь указать мне на другие источники, которые могут помочь прояснить ситуацию?

7 голосов | спросил Rich Apodaca 14 Maypm15 2015, 22:21:03

1 ответ


3

Обновление 0.3.7 действительно исправляет ошибку выполнения сценария, которая описывается, уязвимый код ниже удаляется и заменяется функциями, которые выполняют скриптSig, а затем скриптPubKey в том же стеке.

if (!EvalScript(txin.scriptSig + CScript(OP_CODESEPARATOR) + txout.scriptPubKey, txTo, nIn))

Раньше, что было бы, так это то, что две записи сценария были буквально объединены, а затем выполнены как один. Проблема здесь в том, что мы можем использовать конечный OP_PUSHDATA в scriptSig вставлять весь код scriptPubKey в стек как единый элемент данных, а не дискретные коды операций. Наш scriptSig будет просто push-кодом для длины scriptPubKey плюс OP_CODESEPERATOR. В конце выполнения единственный элемент, оставшийся в стеке, не равен нулю, поэтому оценка возвращает true, и мы можем потратить любые монеты, которые нам нравятся.

ответил eponymous 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 15 Sep 2015 16:03:30 +0300 2015, 16:03:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132