SmartHoldem, ARK, LSK критическая уязвимость сети

in #smartholdem6 years ago

Всем снова привет!
С вами снова Rolik и сегодня я буду рассказывать об уязвимости которую я использовал здесь и которая есть сейчас на всех платформах.

Имхо Перед чтением этой статьи рекомендую прочитать предыдущий пост: https://steemit.com/smartholdem/@rolik/smartholdem-razoblachenie-ili-kak-ya-stal-khakerom

Имхо (2) Я тоже человек и могу ошибаться, поэтому если вы нашли техническую неточность прошу не судить меня строго.

Маленькое вступление

Что же общего в этих 3 монетах ?)
Во-первых SmartHoldem (в дальнейшем cмарт) это форк Ark, Ark это форк Lisk, Lisk первоисточник написанный на языке JavaScript (не путаем с Java). И так насколько всем известно js это асинхронный язык программирования, и во время дискуссий насчет "JavaScript дно или нет" многие фанаты JavaScriptа (в народе просто джавастриптизёры) преподносят этот момент как вершину эволюции, говоря что другие языки ничтожны, потому что они синхронные.
Лично я не считаю это плюсом, потому что намного легче переписать синхронный C# код в асинхронный, чем js в синхронный код. У многих на это возникнет вопрос что же такое синхронный и асинхронный код. Синхронный код это код который выполняется по очереди, то есть так как он написан к примеру:

Взять_телефон();
Открыть_телеграм();
Отправить_сообщение();
Закрыть_телеграм();
Закрыть_телефон();

Это псевдокод который я придумал к примеру. (Не пишите что это даже не псевдокод, а вы сениор девелопер и знаете как лучше, потому что этот пример не для сениора, а для людей далеких от программирования которые не знают что такое асинхронный и синхронный код, в отличии от сениора =) )

Вот так выполняется синхронный код :

Взял телефон 
Открыл телеграм 
Отправил Сообщение
Закрыл телеграм
Закрыл телефон

А вот так выполняется асинхронный код :

Открыл телеграм 
Взял телефон 
Отправил Сообщение
Закрыл телефон
Закрыл телеграм

Конечно же это очень малая часть полного объяснения что это такое, но надеюсь суть вы уловили. Ну вот все 3 бч написаны на асинхронном js в котором они пытаются сделать его синхронным. Как по мне писать блокчейн на js нелогично, потому что блокчейн это суровая синхронность, и как результат - баг.

Баг и его описание

Суть бага в том что руками можно наделать форков и тем самым убить сеть. Когда делается транзакция в одном из 3 блокчейнов она отправляется на ноду она ее добавляет в mempool и потом ее обрабатывает нода что подписывает.
Вот этот момент и есть критическим. Во время первой атаки я выяснил что могу убивать блокчейч тем что буду постить по 1000 транзакций в 10 секунд и полностью забивать mempool, в результате чего на нодах выпадали разные exception что у них не хватает памяти чтобы обрабатывать транзакции и они начали пропускать блоки.
Во время второй атаки симптомы были те же, и тут я уже решил запустить тот же скрипт но с нескольких серверов одновременно. Здесь я заметил те же симптомы, но теперь я создал несколько форков которые долго восстанавливались. Во время атаки я отправлял деньги на разные адреса с одного адреса, чтобы усложнить обработку транзакций. Поэтому эти лже тесты команды Технолога, когда они пытались заспамить отправляя с одного адреса на другой разные суммы, они были не эффективными. Потом я научился делать форки, и это я опишу ниже.

Сам скрипт

Сам скрипт довольно простой, как можно понять с моих постов я не гуру в программировании, а только учусь поэтому это еще больше пугает. И так атака происходит в два этапа:

1 етап

  1. Создаем 2 или больше адресов и бросаем по 1000 или больше смарта (чем больше количество адресов тем меньше кидаем)
  2. Генерируем несколько массивов (например по 10000 адресов). Количество массивов должно отвечать количеству адресов.
  3. Создаем несколько VPS. Количество VPS должно отвечать количеству адресов.
  4. Пишем скрипт (суть скрипта это сгенерировать 1000 транзакций на адреса из массива отправляя на них минимальное количество монет и постоянно постить) и так с разных адресов, разных VPS и на разный список нод.

2 етап

Обычно после первого этапа остается где то 20-30 нод, что дальше живут, лагают но живут и делают сеть работоспособной. Далее их необходимо добить, чтобы это сделать повторяем первый этап, но с изменениями - теперь долбим по одной ноде пока она не начнет выдавать ошибки и так ее разбиваем. Наша конечная цель это сделать много форков, чтобы каждый имел меньше 16 нод (это консенсус, в каждом бч он разный). Также можно сделать 3 этап и тупо откатить сеть или сделать атаку 51%.

Что же происходит с сетью ?

Говоря языком сленга происходит просто дичь, потому сеть умирает, когда другие сети на это реагируют нормально. К примеру если я сейчас начну сейчас спамить также сеть битка, то я просто забью mempool и потеряю деньги, если сделать подобное на шарах то там даже обычные пользователи не почувствуют проблемы. Основная проблема в рассинхроне, а именно что ноды не могут обратно засинхронится, и получаются форки. А теперь вишенка на торте, в чатах я слышал идею поднять комсу, чтобы была атака дорогой, и даже девы Ark мне это говорили
По идее это всё класcно, но я трачу деньги только в начале атаки и суммы выходят копеечные, а потом как я заметил ноды уже не проверяют есть ли у меня баланс на адресе и более того они пропускаю очень много блоков и по сути когда я сделал 10000 транз и убил ними сеть, она сняла комисию с 10.

Фикс

Фикса нет и неизвестно будет ли вообще потому что мне кажется что проблема в самом js (возможно в криворуких кодерах). Но проблема явно глобальная, потому что они не придумали ничего лучше как ограничить mempool, то есть сейчас mempool не может хранить больше 100 транз (это к примеру, точное число не скажу), все что больше сеть тупо отклоняет. И сделали они чтобы не было большого расхождения блоков, потому что в смарте если сделать 100 блоков расхождение то ноду уже будет колбасить.

P.S Всем спс за поддержку, а особенно @mirotvorec, @mkbeh за то что подсказали в каком направлении копать.
Это последний пост о смарте дальше будут позитивные посты о моих идеях и проектах.
Всем удачи и битка по 100к (явно не рублей).

P.S пост примитивный как и баг но все же я обещал =) Сори но я не знаю как более подробнее ее описать =) В любому случаи вы можете потестить свои силы в основной сети битка.

Донат на след посты и проекты :
Btc : 3N5SBz8a5iumNxVKWTFZUSh4BTWJgU2KP8
Eth : 0xbf5f578cd3a533ef917705f3440a5aa8865969e2
Bitshares : btsrolik20001

Sort:  

Congratulations @rolik! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 3 years!

You can view your badges on your Steem Board and compare to others on the Steem Ranking

Vote for @Steemitboard as a witness to get one more award and increased upvotes!

Coin Marketplace

STEEM 0.20
TRX 0.25
JST 0.039
BTC 97356.48
ETH 3462.13
USDT 1.00
SBD 3.26