Share This Post

События

Предсказание случайных чисел в умных контрактах Ethereum

Предсказание случайных чисел в умных контрактах Ethereum

На Хабрахабр выложили интересное расследование, выясняющее безопасность генератора псевдослучайных чисел, используемых в приложениях для азартных игр:

Ethereum приобрёл огромную популярность как платформа для первичного размещения монет (ICO). Однако она используется не только для токенов ERC20. Рулетки, лотереи и карточные игры — всё это можно реализовать на блокчейне Ethereum. Как любая реализация, блокчейн Ethereum не поддаётся подделке, он децентрализован и прозрачен. Ethereum допускает выполнение тьюринг-полных программ, которые обычно пишут на языке программирования Solidity. По словам основателей платформы, это превращает систему во «всемирный суперкомпьютер». Перечисленные характеристики полезны в приложениях для азартных игр, где особенно важно доверие пользователей.

Блокчейн Ethereum является детерминированным и поэтому представляет определённые сложности при написании генератора псевдослучайных чисел (ГПСЧ) — неотъемлемой части любого приложения для азартных игр. Мы решили исследовать смарт-контракты, чтобы оценить безопасность ГПСЧ на Solidity и подчеркнуть характерные ошибки проектирования, которые ведут к появлению уязвимостей и возможности предсказания будущего состояния ГПСЧ.

Наше исследование проводилось в несколько этапов:

  1. На etherscan.io и GitHub собрана информация о 3649 смарт-контрактах.
  2. Контракты импортировались в свободную поисковую систему Elasticsearch.
  3. С помощью веб-интерфейса Kibana для функционального поиска и фильтрации найдены 72 уникальные реализации ГПСЧ.
  4. После ручной оценки 43 смарт-контракта признаны уязвимыми.

Уязвимые приложения

Анализ выявил четыре категории уязвимых ГПСЧ:

  • ГПСЧ с использованием переменных блока как источника энтропии.
  • ГПСЧ на основе хэша какого-то предыдущего блока.
  • ГПСЧ на основе хэша предыдущего блока в сочетании с якобы секретным начальным числом (seed).
  • ГПСЧ, подверженные уязвимости с опережением транзакции (front-running).

Посмотрим на примеры уязвимого кода в каждой категории.

Вот некоторые переменные блока, которые ошибочно принимают за источник энтропии:

block.coinbase — адрес майнера, который нашёл текущий блок.
block.difficulty — относительный показатель сложности при майнинге текущего блока.
block.gaslimit — максимальное потребление газа для транзакций в блоке.
block.number — высота текущего блока.
block.timestamp — отметка времени, когда найден блок.

Прежде всего, майнеры могут манипулировать всеми переменными блока, так что по одной этой причине их нельзя использовать как источник энтропии. Что ещё более важно, переменные блока очевидно одинаковы в пределах блока. Так что если контракт злоумышленника обращается к контракту жертвы через внутреннее сообщение, то одинаковый ГПСЧ в обоих контрактах выдаст одинаковый результат.

Пример 1 (0x80ddae5251047d6ceb29765f38fed1c0013004b7):

// Won if block number is even
// (note: this is a terrible source of randomness, please don’t use this with real money)
bool won = (block.number % 2) == 0;

Пример 2 (0xa11e4ed59dc94e69612f3111942626ed513cb172):

// Compute some *almost random* value for selecting winner from current transaction.
var random = uint(sha3(block.timestamp)) % 2;

Остальные примеры, (а также статью полностью) можно прочитать на habrahabr.ru

Share This Post

Оставить комментарий

Ваш электронный адрес не будет опубликован. Обязательные поля помечены *

Вы можете использовать теги и атрибуты HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>