CREDITSCOM / node

Credits Node is the main module that provide an opportunity to run a node and participate in CREDITS blockchain network.
https://developers.credits.com/
GNU Affero General Public License v3.0
151 stars 16 forks source link

Остановка любого смарт контракта в сети #33

Closed PresidentNavalny closed 5 years ago

PresidentNavalny commented 5 years ago

Describe the bug Есть способ парализовать работу абсолютно любого смарт контракта в сети. Смарт контракт перестает отвечать на запросы любого пользователя (будь то смарт игрового приложения, либо любой другой, неважно). Если брать в пример геймблинг приложение, то игрок будет делать ставку, отправляя смарт контракту монеты Credits, но смарт ему отвечать никак не будет, более того отправленные монеты будут находиться в подвешенном состоянии, их не сможет принять смарт контракт и получить обратно свои монеты пользователю тоже не удастся (монеты зависают в воздухе)

To Reproduce Steps to reproduce the behavior: По правилам это нужно делать в сети тестнет, но там нету этого приложения, поэтому делаем это на примере приложения Dice в сети дапс нет (эта дыра есть и в майннете или любой другой сети Credits доступной на данный момент) И так дапс нет, приложение DICE. Открываем веб кошелек (ну либо с десктопа можно сделать тоже самое) формируем транзакцию, вводим в адрес получателя смарт контракт этого приложения "AtPvLHpqrcrioixZWxCNkAGLRdZuh9mJaqKVtEzhaqLs", в поле сумма можно вбить любую сумму, 0.1-0.000...1 cs, в поле комиссия, меняем стандартную комиссию 0.1CS которую нам предлагает веб кошелек, на 0.0005CS, нажимаем отправить. смарт контракт не сможет принять эти монеты, потому что мы указали слишком маленькую комиссию для перевода. в это время никто не сможет пользоваться приложением, оно просто не будет отвечать никакому пользователю, пока не зафейлится отправка монет с недостаточной комиссией(это время варьируется в зависимости от скорости создания новых блоков, от 1.5 минут до 4 и больше) таким образом можно заблокировать работу всех смарт контрактов в сети. причем злоумышленник получит свои отправленные монеты назад, его расходы это только комиссия за перевод 0.00043cs. данную процедуру можно проделывать сколько угодно раз, хоть со всеми смарт контрактами в сети одновременно в течении целого дня. никто все это время не сможет пользоваться никаким смарт контрактом в сети Credits. можно навечно заблокировать работу любого смарта. по моим подсчетам с помощью этого способа, чтобы заблочить 1 смарт популярного приложения в сети Credits на целый день, злоумышленнику понадобится всего $0.72 довольно бюджетненько) почему $0.72? фейлится транзакция с недостаточной комиссией в течении 1.5 минут и это в самом быстром варианте, когда скорость создания новых блоков примерно 2 блока в секунду. (если скорость создания блоков медленнее, то транзакция будет фейлится дольше). возьмем за основу показатель в 2 минуты. При условии что комиссия в сети cs будет находиться на уровне $0.001, то злоумышленнику понадобится всего $0.03 чтобы заблокировать работу смарт контракта на один час и $0.72 для блокировки на 24 часа, то бишь сутки. после того как я проделал данную процедуру на приложении DICE, то оно поломалось) сначала на кошелек, с которого я делал эту процедуру, перестали приходить выигрыши вообще, хотя в истории транзакций, было видно как будто мне приходили монеты. но на самом деле на баланс они не зачислялись, хотя играя на других аккаунтах такой проблемы не было. потом спустя пару часов, выигрыши стали приходить, но с одним но. теперь после каждой игры в DICE с тебя снимают 0.1 CS. допустим ставишь ты 1 монету на коэффициент 2, если твоя ставка сыграла, то в истории транзакции видно, как смарт контракт отправил тебе 2 монеты. вот только на баланс тебе зачисляется не 2cs, а 1.9cs. я удивлен что никто, из тех кто тестировал это приложение не заметил этого. Как мы видим на скрине, была сделана ставка 1CS на коэффициент 2, ставка сыграла, смарт контракт выплатил мне 2 монеты, но на балансе почему то 5.8996689453125cs, хотя должно быть 5.9996689453125cs. 0.1cs просто испарились, они не зачислились, хотя смарт вроде как нам выплатил нашу положенную сумму, судя по истории транзакций. в случае проигрыша тоже самое, с тебя снимают лишние 0.1cs. это происходит абсолютно на любом аккаунте. Тем же самым способом можно парализовать передачу любого токена в сети, хоть всех сразу. отправляем на смарт контракт токена 0.000...1cs, выставляем комиссию 0.0005cs и после этого отправка этого токена, в отношении которого мы совершили данное действие будет невозможна. все транзакции с этим токеном хоть 10, хоть 20, хоть 50 штук будут висеть в статусе пендинг, пока не зафейлится передача монет Credits с недостаточной комиссией. При желании как я уже сказал, можно навечно парализовать передачу всех токенов и работу всех приложений в сети Credits. все что для этого нужно, написать бота(ну либо делать все это вручную), который каждые 1.5-2 минуты будет отправлять на смарт контракты токенов или любых приложений монеты Сredits с недостаточной комиссией. стоимость такой атаки на 1 смарт контракт в день будет составлять всего $0.72.

Апдейт: Баг с исчезающими 0.1cs как я понял уже пофиксили, по крайней мере сейчас мне не удается его повторить. 1 2