Оскільки протоколи DeFi продовжують зростати в екосистемі Ethereum, CipherTrace бачить все більше і більше експлойтів і векторів атак. Минулого тижня, 28 грудня 2020 року, було використано контракт на видобуток щитів Cover Protocol, Blacksmith. Хакери використали помилку в контракті на майнінг, щоб викарбувати нескінченну кількість токенів COVER і витягти з проекту понад 4.4 мільйона доларів.
Протокол обкладинки випущений їхній Post Mortem вчора вказував, що, невідомо розробникам, помилка була присутня з моменту початкового розгортання контракту Blacksmith, підкреслюючи важливість ретельного аудиту безпеки та пентестування розумні контрактиЩо таке розумні контракти? Розумний контракт - це комп’ютерний професіонал… більше.
Хронологія нескінченного карбування
Хронологія початкового нападника
- Пул ліквідності New Balancer був доданий до контракту Blacksmith.sol.
- Атакуючий депозити 1,326,879.99 XNUMX XNUMX токенів BPT у контракті Blacksmith.sol.
- Тоді той самий нападник виконує експлойт шляхом вилучення коштів з контракту.
- Нападник зміг продовжувати карбування винагород та виведення коштів на суму приблизно 4.4 млн доларів.
У цікавому повороті подій передбачувані «білі хакери», пов’язані з Grap Finance, також скористалися помилкою, щоб видобути токени COVER на суму приблизно 4 мільйони доларів. Grap Finance зрештою повернула кошти Cover Protocol.
Графік графіка зовнішнього облікового запису Grap Finance Deployer (EOA).
- Був новий пул ліквідності затверджений для видобутку ліквідності.
- Grap Finance Deployer EOA депонований 15,255.55 XNUMX BPT (DAI/Basis) у пул на Cover через контракт Blacksmith.sol.
- Приблизно через чотири хвилини кошти були вилучено на покриття, залишаючи 1 Вей на балансі EOA Grap Finance Deployer.
- Ще один зовнішній користувач зняв більша частина їхнього балансу з контракту Blacksmith.sol приблизно в той самий час, що привело Grap Finance з усією ліквідністю для пулу DAI/Basis за контрактом Blacksmith.sol.
- Grap Finance Deployer депонований назад 15,255.55 XNUMX BPT (DAI/Basis) у пул.
- Потім Grap Finance Deployer претензій винагороди і, завдяки подвигу, карбує 40,796,131,214,802,500,000.21 COVER.
- Після деякого спалювання карбованих токенів, Grap Finance Deployer посилає зворотний ефір до обкладинки «Наступного разу подбай про своє лайно».
Як карбувати нескінченні токени — технічний аналіз
фон
Цей експлойт повертає нас до основ мови програмування Solidity, яка використовується для реалізації смарт-контрактів в Ethereum. Після того, як ці контракти будуть складені, віртуальна машина Ethereum (EVM) зможе розуміти інструкції (тобто коди операцій), які використовуються для виконання різних функцій і маніпулювання пам’яттю та сховищем. EVM має три різні області, де він може зберігати дані: пам'ять, сховище та стек. Розуміння цих областей важливо для розуміння того, як була використана помилка.
Подібно до оперативної пам’яті (ОЗУ) на комп’ютерному пристрої, «пам'ять” ключове слово в Solidity виділяє пам’ять для певної змінної. У цьому випадку ця змінна має область дії певної функції. Пам’ять очищається після виконання функції, але може залишитися, якщо вміст цієї пам’яті буде поміщено в сховище до повернення функції.
"зберігання” ключове слово в Solidity дозволяє змінним діяти як вказівник на зберігання даних у відображеннях або структурах даних. Дані зберігання зберігаються між викликами функцій і транзакціями. Під капотом сховище — це, по суті, сховище ключ-значення, яке відображає 256-бітові слова на 256-бітові слова.
Зауважте, що EVM - це не реєстрова машина, а машина стека, тому всі обчислення виконуються в області даних, що називається стек. Максимальна місткість стека — 1024 елементи, але легко доступні лише 16 верхніх елементів, які можна використовувати для заміни найвищого елемента на один із 16 елементів під ним тощо.
Буг
Хакери скористалися Blacksmith.sol від Cover Protocol — контрактом на видобуток щитів, який дозволяє стейкерам отримувати винагороду токенами конкретного проекту або пулу, такими як токени CLAIM і NOCLAIM, в рамках Cover Protocol.
Щоб краще зрозуміти помилку, спочатку погляньмо на громадськість басейни змінна, яка є відображенням (тобто зберіганням даних):
At лінія 118, ми бачимо, що контракт кешує дані пулу в пам’яті за допомогою ключового слова “memory”.
Потім далі лінія 121, контракт оновлює пул у сховищі як updatePool(адреса _lpToken) функція використовує a Басейн для зберігання речей змінна.
Однак, якщо ви подивитеся далі вниз у депозит (адреса _lpToken, uint256 _сума) функція, вона використовує те ж саме басейн змінна з рядка 118, яка була кешована в пам’яті в межах функції для обчислень для pool.accRewardsPerToken. У цей момент, басейн змінна була скопійована з басейни відображення та було збережено в пам'яті.
В результаті будь-які зміни, внесені до басейн змінна всередині депозит (адреса _lpToken, uint256 _сума) функція не змінить басейни відображення в ланцюжковому сховищі контракту через той факт, що змінні, які використовують ключове слово «пам'ять», мають область дії лише всередині самої функції. Звідти договір оновлює pool.accRewardsPerToken в updatePool(адреса _lpToken) функція, яка використовує сховище. Тож тепер, у межах updatePool(адреса _lpToken) функціонують pool.accRewardsPerToken що оновлюється значно збільшується, оскільки технічно це був новий пул і не пов’язаний з басейн в пам'ять.
Після цієї вразливості та неправильного використання пам’яті та пам’яті, файл miner.rewardWriteoff в депозит (адреса _lpToken, uint256 _сума) функція неправильно обчислена, а також використана неправильна pool.accRewardsPerToken, оскільки ми все ще знаходимося у функції депозиту, яка обробляє кешований екземпляр пам’яті басейн.
На додаток до функції депозиту, будь-хто, наприклад Grap Finance, може отримати шалену кількість викарбуваних токенів, коли вони виконують нагороди (адреса _lpToken) функція. Ця функція, яка використовується для отримання нагород, закінчується викликом _claimCoverRewards(пул пам'яті, майнер пам'яті майнер) який посилається на miner.rewardWriteoff що ми виділили вище. Оскільки ця змінна набагато менша за фактичну pool.accRewardsPerToken, контракт призводить до карбування великої кількості токенів.
Ключові винесення
CipherTrace сподівається, що ця історія використаної помилки висвітлює важливість ретельного аудиту безпеки та пентестування смарт-контрактів на будь-якому з них. blockchainБлокчейн - технологія, що лежить в основі біткойнів та інших систем… більше один вибирає розгорнути до. Хоча Grap Finance повернула кошти, отримані за допомогою експлойту, оригінальний хакер все ще міг отримати понад 4 мільйони доларів від протоколу DeFi, а вартість токена COVER з тих пір впала майже на 99%.
Джерело: https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/