Частная Дата выпуска: 08-JAN-2013
Открытая Дата выпуска: 14-FEB-2013
системы Затронутые
- Satoshi Bitcoin Client (Bitcoin-Qt, bitcoind)
- Все клиенты Bitcoin, которые имитируют поведение, связанное с операцией проверки клиентских версий Сатосите до 0.8.0
Затронутые Версии
- Bitcoin версия 0.7.2 выпущена 2012-12-14
- Bitcoin версия 0.7.1 выпущена 2012-10-19
- Bitcoin версия 0.7.0 выпущена 2012-09-17
- Bitcoin версия 0.6.3 выпущена 2012-06-25
- Bitcoin версия 0.6.2 выпущена 2012-05-08
- Bitcoin версия 0.6.1 выпущена 2012-05-04
- Bitcoin версия 0.6.0 выпущена 2012-03-30
- Bitcoin версия 0.5.3.1 выпустила 2012-03-16
- Bitcoin версия 0.5.3 выпущена 2012-03-14
- Bitcoin версия 0.5.2 выпущена 2012-01-09
- Bitcoin версия 0.5.1 выпущена 2011-12-15
- Bitcoin версия 0.5.0 выпущена 2011-11-21
- Bitcoin версия 0.4.0 выпущена 2011-09-23
- Bitcoin версия 0.3.24 выпустила 2011-07-08
- Bitcoin версия 0.3.23 выпустила 2011-06-14
- Bitcoin версия 0.3.22 выпустила 2011-06-05
- Bitcoin версия 0.3.21 выпустила 2011-04-27
обзор
Обработка транзакций имеет два этапа в Satoshi Bitcoin клиента. На первом этапе, входы транзакций извлекаются.
Это делается путем приведения в ОЗУ транзакции, которые содержат выходы, перешедшие входы.
На втором этапе, предыдущие выходы проверяются, чтобы быть израсходованными и соответствующие сценарии оцениваются.
Так как двойной проводит не считается попытка DoS по правилам протокола, транзакция, которая относится к предыдущим затраченным выходам будут проходить первый этап обработки, не будучи отброшено. Поэтому злоумышленник может построить операции, которые, прежде чем отбрасывается на второй стадии обработки, требуют применения жертвы искать и читать слишком много частей блока цепи, которые могут быть разбросаны думали файлы для хранения, задержки любой другой обработки.
Детали
Мы предполагаем, что весь блок цепь не помещается в оперативной памяти, так что каждая операция выборки требует HD поиска и чтения. Среднем 7200 оборотов в минуту жесткий диск
может случайным образом искать / читать блок 1Kb в не кэшируются 2 Гб файла в 12 мс. Каждый prevout сделки потребляет 44 байт, с пустым sigscripts.
Злоумышленник создает транзакцию со многими входами один выходной. Таким образом, остальные части сделки (выходные сценарии, заголовки) амортизируются и становятся ненужным для этого анализа.
Для подключения к Интернету 50 кбайт пропускной способности / сек, отправка 45 байт требуется менее 1 мс.
Постоянно посылая это специально созданные транзакции злоумышленник может заблокировать любой Bitcoin пэра от выполнения других задач.
Кроме того, злоумышленник может заблокировать 10 коллегов в то же время, так как соотношение 1:10 в необходимых ресурсах.
Обратите внимание, что злоумышленник не нужно подписывать входы и не иметь полный блок-цепь для выполнения атаки. Он требует только хэш всех предыдущих сделок, которые в настоящее время требуют только 10876856 * 32 = 332 мегабайтов памяти.
Версия 0.8.0 от клиента магазинов Сатоси только неизрасходованные prevouts в памяти и может обрабатывать аборт сразу после отработанной prevout называется транзакцией.
Возможные сценарии атаки
1. Из-за небольших ресурсов, необходимых для монтажа атаки, оно может быть выполнено с помощью ботнетов массированно атаковать сеть Bitcoin.
2. Атака может быть использована против шахтеров, чтобы предотвратить их от отправки блоков. Тем не менее, в настоящее время крупных шахтеры онов подключены к там собственной передней линии узлов Bitcoin для Превен таких атак.
3. Используя множество узлов сразу, злоумышленник может попытаться создать барьер, который разделяет сеть в несвязанных компонентах, для того, чтобы нести еще один вид атаки.
вариации не-а-проблема
1. Действительная сделка 1M может быть построена для ссылки на более 22k уникальных входных сделок. В теории, что сделка будет занять более 5 минут, чтобы проверить. Тем не менее, атака непрактична по двум причинам:
а. Атакующий должен иметь те 22k сделки.
б. Эти 22K операции должны быть рассеиватель думал blockchain принуждать, ищущую активность HD. Если бы они были созданы в течение ограниченного периода времени, они в конечном итоге ограничивается в ограниченной части файла блока цепи. Результатом будет то, что кэш жесткого диска поможет уменьшить задержку чтения и поэтому атаки эффективность будет снижена. Тем не менее, версия 0.8.0 клиента Satoshi считает сделки больше, что 100K быть нестандартным, поэтому уязвимость еще больше снижается.
Предлагаемое решение для 0.6 / 0.7 версии
Клиентское приложение может проверить, что prevouts не проводится каждый раз, когда они извлекаются, и прервать, если отработанный prevout найден.
BOOL CTransaction :: FetchInputs (CTxDB& txdb, Const карта
BOOL fBlock, BOOL fMiner, MapPrevTx& inputsRet, BOOL& fInvalid)
{
..
для (беззнаковое INT I = 0; я < vin.size (); я ++)
{
// Читаем txPrev
CTransaction& txPrev = inputsRet [prevout.hash] .second;
....
// НОВЫЙ КОД НАЧИНАЕТСЯ
если (prevout.n >= TxPrev.vout.size () || prevout.n >= Txindex.vSpent.size ())
{
fInvalid = TRUE;
вернуть DoS (100, ошибка (" .....
}
если (! txindex.vSpent [prevout.n] .IsNull ())
вернуться ложным;
// НОВЫЕ ЗАВЕРШ КОД
}
}
Раскрытие Timeline
2013-01-09 - Уязвимость сообщили Gavin Andressen и других основных разработчиков.
2013-01-09 - Gavin Andressen aknowledges отчета и подтверждает версию 0.8 не будет уязвимы, допускает раскрытие после 0.8.0 релиза-кандидата 1 доступно.
2013-02-09 - Bitcoin версия 0.8.0 релиз кандидат 1 доступен, фиксируя уязвимость
2013-02-14 - раскрытие уязвимостей
кредит
Эта уязвимость была обнаружена Sergio Демьяна Лернера, от Certimix.com
Этот отчет был написан SDL.
Отказ от ответственности: я не проверял атаку эксплойт, но это, кажется реальным и практичным.