Резюме
Уайтхэт Томмазо Пиффери представил уязвимость в Redacted Cartel через Immunefi 11 января. Уязвимость была оценена как критическая, поскольку она позволила бы злоумышленнику присвоить себе права пользователя, что позволило бы злоумышленнику украсть средства этого пользователя. Фонды, находящиеся под угрозой, составляли чуть менее 6 миллионов долларов. Redacted исправил ошибку и заплатил белому хакеру 560 000 долларов за находку.Стандарт токенов ERC-20 является наиболее распространенным стандартом в экосистеме Ethereum. Многие пользователи Ethereum уже знают, что делает токен ERC-20 и какие у него функции.
Цель ERC-20 approve ( spender, amount ) функции состоит в том, чтобы позволить любому адресу тратить токены от имени владельца токена. Например, Алиса разрешает Бобу потратить 20 токенов Алисы из ее кошелька. У Боба 20 токенов, и он переводит жетоны через функцию transferFrom(sender, recipient, amount), которая делает именно то, что следует из названия.
OpenZeppelin создал основу для широко используемых стандартов, таких как ERC-20 или ERC-721. Фреймворк содержит проверенные в бою реализации, поэтому разработчикам не нужно повторно реализовывать различные EIP.
Уязвимость здесь заключалась в ошибочной реализации стандартных функций ERC-20 в токене wxBTRFLY REDACTED, который представляет собой обернутую версию xBTRFLY. Это тоже было внутри функции transferFrom но дело было в другом. Это позволяло злоумышленнику взять чужие токены и передать их злоумышленнику, чтобы он мог украсть средства у пользователя.
Анализ уязвимостей
Проблема заключается в выделенном участке кода .
Функция _approve принимает в качестве аргументов следующие параметры:
- address owner,
- address spender,
- uint256 amount
Вместо чтения и записи разрешения/утверждения от отправителя оператору ( msg.sender ), функция считывает разрешение/утверждение от отправителя получателю и записывает отправителя оператору ( msg.sender )! Это означает, что при каждом вызове transferFrom в конце мы получаем одобрение получателя за вычетом отправленной суммы. Это может быть использовано таким образом, что хакер может украсть деньги у пользователей и отправить их на наш адрес!
Пошаговое руководство по атаке:
- У Алисы есть 1000 wxBTRFLY, и она подтверждает свой контракт на расходование 1000 wxBTRFLY от ее имени.
- Боб вызывает функцию wxBTRFLY.transferFrom(Alice, aliceContract, 0). Таким образом, перевод не происходит, но из-за ошибки с доплатой Боб получает надбавку за деньги Алисы, равную 1000 wxBTRFLY.
- Боб еще раз вызывает функцию wxBTRFLY.transferFrom (Alice, bob, 1000) и крадет все средства у Алисы
Исправление уязвимости
В новой версии токена удалены FrozenToken контракт, который содержал уязвимые transferFrom функции. Теперь wxBTRFLY опирается на реализацию ERC-20 от OpenZeppelin.Перевод отсюды.