SmartHoldem, ARK, LSK критическая уязвимость сети
Всем снова привет!
С вами снова 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 етап
- Создаем 2 или больше адресов и бросаем по 1000 или больше смарта (чем больше количество адресов тем меньше кидаем)
- Генерируем несколько массивов (например по 10000 адресов). Количество массивов должно отвечать количеству адресов.
- Создаем несколько VPS. Количество VPS должно отвечать количеству адресов.
- Пишем скрипт (суть скрипта это сгенерировать 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
Congratulations @rolik! You received a personal award!
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!