Так, по крайней мере 80% от сети Bitcoin теперь защищена от этой атаки, я получил разрешение раскрыть его:
Реализация хеша Merkle, что Bitcoin использует для вычисления корня Меркла в заголовке блока испорчена в этом можно легко построить несколько списков хэш, которые сопоставляются с тем же корнем Merkle. Например, merkle_hash ([а, b, c]) и merkle_hash ([а, б, в, с]) дают одинаковый результат. Это происходит потому, что на каждой итерации хэш-функция Merkle подушечки ее промежуточный список хэшей с последним хэша, если список нечетной длины, для того, чтобы сделать его четной длины.
И так, корень функции Меркл может быть эффективно preimaged путем изменения ввода таким образом, что один из промежуточных списков четной длины с последних двух элементов равны (где первоначально было нечетной длины с последнего элемента равна ранее упомянутых двух ). Как позже было отмечено, это распространяется на любую длину входа, который не является степень два: merkle_hash ([а, б, в, г, д, е]) == merkle_hash ([а, б, в, г, д, е, е, е]). Обратите внимание, что для поддержания того же корневого хеша, единственной гибкости, которая существует дублирование элементов.
В результате, два блок может быть легко создан, которые имеют один и тот же блок хэш, хотя один может быть действительными, а другой инвалидом, дублируя одну или несколько сделок, таким образом, что поддерживает корневой хэш Меркла. Дублирование любой сделки сделает блок недействительным, поскольку блок двойного тратит определенное прошлое выхода транзакции.
Неисправленная установка Bitcoin может быть постоянно вклиниваются на текущем высоком блоке, используя это и тот факт, что Bitcoin кэширует бесхозных блоки в базе данных диска спинок. Для этого злоумышленник должен отправить его действительный блок (который в конечном итоге превратить его в blockchain) сделал недействительным путем дублирования одной из операций таким образом, что сохраняет корень Меркла. Хакер даже не нужно добывать свой собственный блок - вместо этого, они могут слушать для блока, то мутировать его таким образом, и передать его на своих сверстников.
После того, как жертва получает этот недопустимый блок, они будут кэшировать на диске, попытаться обработать его, и отвергать его недействительным. Re-запрос
блок не будет даже попытки, так как Bitcoin считает, что у него уже есть блок, так как он имеет с тем же хэш. Bitcoin в конечном итоге выводит "ПРЕДУПРЕЖДЕНИЕ: Отображаемые сделки не могут быть правильными! Вы, возможно, потребуется обновить или другие узлы, возможно, потребуется обновить." предупреждение, когда blockchain простирается дальше за пределы принятого недействительных блока.
Проблема была решена Гэвин Андресен в Bitcoin совершить be8651d [1], отвергая блоки с повторяющимися сделок в CheckBlock, предотвращая их кэширования на всех.
Ура,
Форрест Войт
http://forre.st/
[1]: https://github.com/bitcoin/bitcoin/commit/be8651dde7b59e50e8c443da71c706667803d06d