• XSS.stack #1 – первый литературный журнал от юзеров форума

Уязвимость контракта BloggerCoin

lohatnikov

RAID-массив
Забанен
Регистрация
12.05.2021
Сообщения
89
Реакции
14
Пожалуйста, обратите внимание, что пользователь заблокирован
Вот пример когда люди зажали денег на нормального разраба и привлекли какого то школьника.
Полный контракт здесь - https://bscscan.com/address/0x3928a3dd66d142f312e638deee055540fe332d1a#code

Посмотрите внимательно. ничего не замечаете?

Код:
function transferFrom(address from, address to, uint value) public returns(bool) {
        require(balanceOf(from) >= value, 'balance too low');
        require(allowance[from][msg.sender] >= value, 'allowance too low');
        balances[to] += value;
        balances[from] -= value;
        emit Transfer(from, to, value);
        return true;   
}

function approve(address spender, uint value) public returns (bool) {
        allowance[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;   
 }

Не видите суслика а он есть)

Ну немного теории для тех кто не знал.
Переместить токены можно тремя способами:
1. transfer - сразу напрямую перемещаешь токены
2. approve + transferFrom - две транзакции. одной ты разрешаешь определенное количество токенов переместить другому адресу. и тот вызовом TransferFrom перемещает токены.
3. через permit (но он тут даже не реализован, так что не суть)

Так вот например, разрешил ты 1000 токенов переместить через approve какому нибудь dex например.
Тот переместил 1000, а потом снова переместил 1000 и снова переместил 1000....

Потому что забыли
Код:
allowance[from][msg.sender] -= value;
добавить в TransferFrom!

Да, сложно это эксплуатировать. ведь нам надо обязательно approve от жертвы получить и желательно на полный максимум. но это будет вечный approve, навсегда.

И зачем вообще лезут писать эти контракты если ничего не понимают.

Вообще, есть замечательные реализации от openzeppelin - https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol

Почему не взять готовое, газа сэкономить на 0.00001$?

Короче горит не могу. Наступило время когда клепают просто токены бесполезные без какого-либо продукта. Да даже просто токены уже не могут сделать нормально. Зато шуму то сколько BloggerCoin. Смех один.
 
А смысл от этого (того что ты нашел)?

Всякие сервисы типа PancakeSwap все равно запрашивают approval на "бесконечную" сумму (ffff...ffff), и этот approval так и остается висеть вечно (пока владелец сам не закроет его). Но мало кто проверяет approval со своего адреса, и поэтому они так и остаются вечно открытыми.

Вот пример:

Код:
Function: approve(address spender, uint256 value)

MethodID: 0x095ea7b3
[0]:  00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e
[1]:  ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

Так что approval выставляется на сумму не то что превышающую баланс, но превышающую количество всех токенов, там approval выставляется со значением 2^256. Его что уменьшай, что не уменьшай - толку не будет.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх