10 февраля 2014 в 17:47

Особенность протокола Bitcoin, которая привела к задержкам выводов Mtgox и общему переполоху перевод

MtGox выступил с заявлением, что в связи с «проблемой» в протоколе Bitcoin, у них были задержки с выводом BTC и поэтому им пришлось прекратить все выплаты, пока причина не будет устранена. www.mtgox.com/press_release_20140210.html

Если вам нужен быстрый ответ — нет ошибки в самом Bitcoin. Вы можете пойти на Bitstamp / Coinbase / btc-e и купить больше BTC с огромной скидкой, прежде чем курс вернется к $800 — $900…

Длинный ответ:

Неподтвержденные транзакции Bitcoin всегда были malleable (тягучими), то есть вы можете немного изменить транзакцию, которая «в подвешенном состоянии » (еще не в blockchain), и вы не нарушите свои подписи. Однако, невозможно изменить какие-то важные данные, такие как исходные операции, суммы, порядок входов и выходов, а также какие-то другие метаданные. То, что вы можете сделать, это добавить некоторые фиктивные данные, что не меняет сути сделки, но меняет ее содержание.

Что это означает? Вы можете отправить ABC123 транзакцию, а кто-то может увидеть ее в сети и по тихому изменить, в результате чего ее вид будет — ABC124. Если ему повезет, то ABC124 будут включена первой, а исходная ABC123 никогда не будет включена (для предотвращения даблспендинга). Нет никаких проблем для получателя сделки — он все равно получат все свои деньги на адрес, на который он запросил вывод. Но если он будут наблюдать за транзакцией через blockchain специально, то ABC123, он никогда там уже не обнаружит.

MtGox объясняет, как они были обмануты:

1). Пользователь делает запрос на вывод из MtGox некоторое количество BTC на свой адрес.
2). MtGox принимает некоторые из его собственных «неизрасходованных выходов» и составляет транзакцию, которая посылает средства на адрес пользователя.
3). MtGox помнит хэш этой транзакции и смотрит появилась ли она в blockchain.
4). Пользователь (злоумышленник) или кто-то еще, видит неподтвержденную транзакцию MtGox в p2p сети и создает транзакцию, состоящую из тех же данных что и оригинальная, в следствии чего ему не требуется подписывать ее элементы (т.е. он не меняет суммы, входы или выходы), но добавляет в нее незначительные данные (лишние байты например), в итоге хеш этой транзакции отличается от исходной но она остается валидной для сети (прим. переводчика).
5). Новая, измененная, транзакция включается в blockchain. MtGox послал деньги, но еще не знает об этом. Запросивший вывод, к тому времени уже получил средства на кошелек и уже видит их.
6). Затем пользователь(злоумышленник) идет в поддержку MtGox и жалуется, что деньги не поступили. Или, MtGox сам видит, что средства не поступают слишком долго, и может автоматически, повторно, отправить другую транзакцию, которая посылает некоторые другие «неизрасходованные TX выходы» на тот же адрес (повторяет отправку). Так или иначе, он создает много путаницы для MtGox и первоначально может даже привести к отправке одной и той же сумы много раз.
Является ли это проблемой самого Bitcoin, который позволяет проводить такие изменения в транзакциях? Да, вероятно, так. Но не совсем ясно, как это можно предотвратить вообще.

MtGox наткнулись на эту проблему, потому что они не знали, об этом свойстве Bitcoin.

MtGox могло бы решить проблему следующим образом: вместо того, чтобы использовать blockchain для наблюдения за появлением хэша конкретной транзакции, следует смотреть, если адрес X ( задается пользователем ) получил сумму N ( указанную пользователем ) с выходами Y, Z и W (используется MtGox ). Это гарантировало бы, что даже если сделка будет изменена, они наверняка это увидят и узнают, получил ли пользователь деньги, предназначенные для него или нет.

P.S. Материал размещен с разрешения автора oleganza, который тут бывает редко и сейчас высказывается на Reddit.
Автор оригинала: Oleg Andreev
@Ajex
карма
46,0
рейтинг 0,0
Самое читаемое

Комментарии (41)

  • +9
    Ну вот и толковое объяснение. А то лишь бы паниковать
    • НЛО прилетело и опубликовало эту надпись здесь
  • +4
    Тяжелый перевод.
    • 0
      Тема просто очень специфическая и сложная для понимания. Тут надо достаточно глубоко понимать, как работает сеть. Я лишь перевел как было, объяснить простым языком без ссылок на основы наверное сложновато.

      Если по-простому. При отправке денег с биржи генерится уникальный хэш транзакции по типу 9c7e169e2056d904ef5f4b6afedaa8931dc7cc17b79c18af688fa2ffb649669b через который можно отследить все операции по сделке (кому и сколько было выплачено). По этому хэшу через сеть MtGox и проверял получил ли клиент свои средства или нет. Однако можно сделать маленький финт ушами и добавить некоторые незначительные данные в транзакцию о тех пор, пока она еще не была подтверждена в результате чего, изменится ее хэш и уточнить данные об успешном прохождении можно будет только по новому хэшу. Сама транзакция не пострадает, однако гокс, который использует такой механизм проверки, таким способом удалось обвести вокруг пальца..
      • +1
        Если удалось обвести.
        Вообще слишком всё совпало. И именно у Гокса. И именно тогда, когда тянуть було дальше некуда. Забавно, да?
        • 0
          Понятно, что в истории еще много неизвестного и никто не знает как, что и сколько точно, и возможно этого мы никогда и не узнаем. Так что пока лишь предположения дабы хоть немного понимать ситуацию, не паниковать и не делать скоропостижных выводов.
      • 0
        Дело не в теме.
      • 0
        Тема — темой, но:
        1) запятые невпопад (и куча лишних)
        2) настоящее время
        3) кривые англицизмы типа «даблспендинг»
        4) неумение подобрать нормальные русские слова: не «некоторое количество», а «несколько».
  • 0
    Но ведь транзакция подписывается закрытым ключом. Или в транзакции есть поля, которые не подписываются?
    • +3
      Подпись не покрывает все данные в транзакции, а хэш считается от всей. Таким образом, можно изменить некоторые поля, что подпись останется неизменной, а хэш будет другим.
    • 0
      как оказалось — есть.
      там достаточно сложная для понимания структура данных: есть несколько входов и несколько выходов.
      каждый вход подписывается своим ключом, а транзакцию «в целом» вообще говоря чем и зачем потом подписывать?
      такая гибкость была заложена в протокол изначально.
    • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Вы можете отправить ABC123 транзакцию, а кто-то может увидеть ее в сети и по тихому изменить, в результате чего ее вид чего будет — ABC124. Если ему повезет, то ABC124 будут включена первой, а исходная ABC123 никогда не будет включена (для предотвращения даблспендинга).

    А как отследится такая ситуация? Т.е. как именно система определит, что это одна транзакция и надо только одну запись включать? А то ведь хеши разные. Или зачем вообще тогда хеш транзакции нужен, если он ничего не значит?
    • +1
      > Т.е. как именно система определит, что это одна транзакция и надо только одну запись включать?

      Майнер не включит транзакцию ABC123 в блок, потому что сперва проверит и увидит, что ее входы были уже потрачены транзакцией ABC124
      Если майнер несмотря на это включит ее в блок — сеть такой блок не примет, так как увидит даблспендинг

      > Или зачем вообще тогда хеш транзакции нужен, если он ничего не значит?

      Для идентификации транзакции. Как иначе делать уникальные идентификаторы в распределенной системе?
      • 0
        > Майнер не включит транзакцию ABC123 в блок, потому что сперва проверит и увидит, что ее входы были уже потрачены транзакцией ABC124

        Вход это же номер кошелька? У меня на кошельке может быть 10 биткоинов, а я перевёл один биткоин, значит ещё 9 осталось.

        > Для идентификации транзакции. Как иначе делать уникальные идентификаторы в распределенной системе?

        Не понимаю простого момента, Раз майнеры понимают, что две транзакции с разными хешами по сути одинаковы, значит есть сочетание полей, которое более уникально идентифицирует транзакцию, чем хеш. Значит хеш должен считаться от тех полей, которыми руководствуются майнеры при верификации транзакции и тогда самой проблемы одинаковых транзакций с разными хешами не будет.
        • +4
          > Вход это же номер кошелька? У меня на кошельке может быть 10 биткоинов, а я перевёл один биткоин, значит ещё 9 осталось.

          Немного не так. Попробуйте самостоятельно почитать, а то мне в двух словах трудно объяснить.
          Допустим я дал вам 10 биткойнов. (какой я щедрый!) До этого у вас биткойнов не было вообще.
          У вас есть 1 неизрасходованный «вход»
          Когда вы из 10 биткоинов хотите заплатить 1 — то в транзакции будет два выхода — один на 1 биткойн, а второй на 9 — так называемая «сдача»
          (пока про комиссии не будем)
          Вообще говоря — сдачу принято на свой новый адрес пересылать, но можно и на исходный.
          То есть после того как вы переслали 1 биткойн — у вас теперь 1 неизрасходованный вход на 9 биткойнов.
          А мой перевод — он уже израсходован.
        • 0
          > Раз майнеры понимают, что две транзакции с разными хешами по сути одинаковы, значит есть сочетание полей, которое более уникально идентифицирует транзакцию, чем хеш.

          Неправильный вывод. Один из этапов каждого майнера — проверить правильность всех инпутов. Если хоть один из инпутов не проходит проверки — транзакция улетает в dev/nul

          Проверять является ли транзакция дубликатом другой транзакции не нужно и гораздо более сложно — ведь какие-то инпуты могут быть валидными, какие-то невалидными — это не точный дубликат, но невалидная транзакция. И вообще — ну что сделает майнер, если обнаружит точный дубликат уже существующей транзакции? Позвонит в ООН? Нет. Он просто выкидывает ее.
          • 0
            Справедливости ради надо сказать, что проверкой занимается любой полноценный узел, а майнер просто считает хэши переданных ему массивов.
      • 0
        del
        Выше спросили
  • +11
    Надо отметить, что информация об этом была доступна на публичной вики более года и странно, что mtgox не знали про это. То ли у них некомпетентные разработчики, не знающие в деталях протокол, который они реализуют (у них свой биткоин-клиент), то ли они намеренно всех обманывают. В любом случае с ними лучше не работать в дальнейшем, имхо.
  • +1
    Официальный ответ Bitcoin Foundation: bitcoinfoundation.org/blog/?p=418
  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      Сумму на один сатоши поменять или распределение траты средств между входными транзакциями. Смысл (а иногда и сумма) не меняется, а хэш транзакции уже другой. И если софт биржи отслеживает транзакцию только по хэшу, он её упустит и вернёт виртуальные деньги на счёт (или админы, не найдя транзакции в блокчейне, вернут). Что и произошло с гоксом, как они утверждают. Но тут они ССЗБ, про такую атаку было известно уже не первый год. Р̶а̶з̶р̶у̶х̶а̶ ̶в̶ ̶г̶о̶л̶о̶в̶а̶х̶ Уязвимость в кривом софте биржи, а не в протоколе биткойн.
      • 0
        Что-то мне не очень понятно: если посторонний человек может изменить сумму транзакции (хотя бы на один сатоши) — то почему это не является недостатком протокола Bitcoin? Сатоши — вроде и немного, но говорят, что Bitcoin — дефляционная валюта, так что при повышении рыночной капитализации экономики Bitcoin можно ожидать только повышения курса, что приведет в конце концов к тому, что и один сатоши станет существенной суммой, наподобие долларового цента.
        • 0
          То, что я описал, делает сам атакующий, имея на руках приватные ключи. Но я ошибся, с гоксом произошло не это.
          Можно, например, изменить подпись так, чтобы она оставалась верной, но содержала где-нибудь лишний бит (это связано с её кодировкой и само по себе проблемой не является). Далее, подписывается не вся транзакция как единый пакет, а результат выполнения «скрипта». Если изменить «скрипт», добавив в него лишние операции, не приводящие к изменению стека данных перед проверкой подписи, содержимое транзакции не изменится (и подпись сойдётся). Это всё приводит лишь к тому, что меняется хэш, но ни отправитель, ни получатель не заметят никаких потерь – перевод будет осуществлён без проблем и с такой модифицированной транзакцией. Ничего никуда не теряется.
          Но, если модифицированная транзакция попадает в блоки раньше оригинальной, софт, который запомнил старый хэш и отслеживает только его, «потеряет» такую транзакцию. Ну дальше я вроде всё правильно написал. Оригинальное ПО вроде эту проблему побороло в той или иной мере, а у гокса своя реализация…
          • 0
            Вот тут есть обуждение, начатое еще в 2011
            bitcointalk.org/index.php?topic=8392.0

            Насколько я понял — один из способов поменять hash — это другим способом записать сигнатуру
            DER-формат мне показался мягко говоря «странным», вполне возможно, что его конкретные имплементации допускают различную форму записи одной и той же сигнатуры. А может сигнатура не только так может быть записана?
            Например, для записи 32-байтового (не битового, а именно байтового!) беззнакового числа используется следующая форма записи:
            1) если старший бит 1 — то число отрицательное (а нам важно что оно беззнаковое!) так что пишем длину=33, потом 00, потом само число
            2) иначе если старший байт ненулевой — пишем длину=32, потом само число
            3) иначе пытаемся сэкономить, записав 32-байтовое число в 31 байте учитывая что старший байт и так нулевой
            В общем, в результате сигнатура имеет не фиксированный размер — от 72 байт и меньше

            Но вполне возможно, что допускаются и «не совсем канонические способы записи».
            Или возможна обратная ситуация — допустим, MTGOX неправильно формировал сигнатуру, например для начинающихся с нулевого байта чисел не отрезал этот байт, а для отрицательных чисел не добавлял 00.
            Злоумышленник-педант-майнер просто корректировал чтобы подпись была корректной.
            (Повторюсь — я тут не копенгаген — это «размышления на заданную тему»)
            • 0
              вот тут еще интересное обсуждение.
              bitcointalk.org/index.php?topic=360347.0
              жаль, что детали оригинальной транзакции не сохранились — можно было бы посмотреть в чем разница между оригинальной и измененной верией
              • 0
                все гораздо проще оказалось.
                bitcoin.stackexchange.com/questions/22051/transaction-malleability-in-the-blockchain
                операция с кодом 0x49 означает «положить последующие 0x49 байт в стек»
                операция 0x4d означает «взять последующее 16-битовое число и столько байт поле него положить в стек»
                в следующих 2 байтах как раз число 0x49 (little-endian)
                байты о которых мы говорим — это и есть подпись остальной части транзакции

                таким образом достаточно было поменять [49] на [4d4900] и хеш менялся, а сама транзакция оставалась валидной
                можно и многими другими способами добиться того же самого
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Интересно, ведь размер базы транзакций непрерывно растёт и довольно быстро. Что с этим делать? Скоро же нужно будет под новый кошелёк покупать отдельный винт.
    • +1
      Под кошелек не надо. Кошелек сам по себе маленький. Если уже есть база на компьютере, то вторая не нужна.
      На самом деле по этому поводу планируется массовый уход на легкие клиенты, у которых нет полноценной базы, и функционал несколько урезан, но в целом позволяет передавать и получать денежку.
      Я вижу здесь другую опасность:
      знаю некоторых людей которые оперируют тысячами битков. Эти ребята так же как и я пользуются вебклиентом от битчаин.
      Я то риски осознаю, но поскольку оперирую небольшими суммами, то риски считаю допустимыми. А так — вот решит битчаин ограбить всех своих пользователей, и что будет с битками? :)

      Да, там как я понимаю есть некоторые меры для защиты кошельков от самого битчаина, но защита организована ими самими, так что несерьезно это. Ну и если завтра все будут плавно переходить на тонкие клиенты, то будет всё больше схем которые сделают кошельки более уязвимыми от третьих лиц. И не говорите что люди не будут делать таких ошибок. Особенно не говорите этого в ЭТОЙ теме.
      • +1
        Забудьте уже про онлайн-кошельки, это пережиток прошлого и случаев, где они действительно необходимы, очень мало.

        Откройте для себя Thin Client Security, и один из популярнейших тонких клиентов, поддерживающий это — Electrum.

        Доступ к монетам сервер не имеет, а используется исключительно для выдачи информации по балансам на кошельке (точнее об указанных адресах) плюс много много других фич, типа генерация всех будущих пар ключей для адресов кошелька на базе одного seed.
        • 0
          Если все будут пользоваться тонкими кошельками, не сделает ли это сеть уязвимой к атаке? Особенно, когда эпоха майнинга подойдет к концу?
          • 0
            По этой причине я бы сформулировал следующее, пользуйтесь electrum но устанавливайте свой сервер (конешел bitcoin + abe + сервер electrum), в этом случае одна установка bitcoin может быть использована вами в нескольких местах (мобильник, компьютер и т.п.) но при этом может находиться на специальном выделенном сервере.
        • +1
          Обратите внимание на мою последнюю фразу. Смысл не в том, что есть более надежные решения. Смысл в том, что будет когда количество пользующихся недостаточно надежными решениями перевалит за критический предел?
          Ну даже и ладно. Если битчайн рухнет, то со всех остальных народ убежит за неделю.
          Но что говорить о тех же серверах «у которых нет доступа к монетам»? Злоумышленник контролирующий сервер который «всего-лишь» сообщает о поступлении средств на счета сможет довольно много денег увести и без того.

          Что касается места на диске, то не всё упирается в диск. Эту базу еще и выкачать надо.
          Если два года назад я выкачал базу за полдня, то когда была пробита тысяча, я на третий день плюнул на выкачивание базы и залил свой кошелек на веб.
      • 0
        Держать биткойны, тем более такое количество, на удаленном сервисе, без каких-либо официальных договоренностей с владельцами — чистое безумие и непонимание самой сути криптовалют. Владельцы сервиса в любой момент могут решить, что накопленных средств достаточно для безбедной старости и им ровно ничего за это не будет. Не говоря уж о том, что любые крупные хранилища привлекают множество желающих их взломать.
    • 0
      размер блока 1 мегабайт (хотя под завязку его никто не наполняет)
      блок раз в 10 минут / 6 в час / 144 в сутки
      при самом плохом раскладе 52 гигабайта в год
      на ближайшие 10 лет мне моего винчестера хватит.
      больше чем на 10 лет я не привык планировать.

      ну, если у вас на компе 100500 форков — то…
  • 0
    Похоже, bitstamp наступила на те же грабли: www.bitstamp.net/article/bitcoin-withdraws-suspended/
    Детального описания проблемы нет, но приостановили вывод, так что, видимо, тот же тип атаки.
    • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        Ну так вы ссылку-то сами читали?
        Он сказал, что атакующие совмещают атаку «двойного вывода» с DDoSом всей биткойн-сети, чтобы сбить с толку учетные системы бирж и увеличить вероятность того, что на фоне этого злоумышленники получат «компенсацию»
        «Атака двойного вывода» — это именно то, что здесь описано, она может быть только адресной, потому что надо запросить возврат у саппорта биржи, который должен вручную запустить повторный вывод средств. А DDOS — чтобы махинации было сложнее распознать. Странно, что bitcointalk заодно не положили, как это частенько бывает.
  • 0
    Кстати кому форки интересны — вот неплохой список криптовалют bitomatics.com/forum/25-spisok-kriptovalyut более или мене внятно расписано что есть что.

    Кстати вероятно что уставший от Doge и MintCoin сейчас позитивно отреагирует на разные Dark и Vertcoin.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.