Back to Blog

Когда «SafeMint» становится небезопасным: уроки инцидента с HypeBears

Code Auditing
3 февраля 2022 г.
2 min read

Утром 3 февраля (часовой пояс +8) наша система зафиксировала транзакцию атаки 0xfa97c3476aa8aeac662dae0cc3f0d3da48472ff4e7c55d0e305901ec37a2f704, направленную на NFT-контракт HypeBears. После расследования мы выяснили, что это была атака типа re-entrancy (повторный вход), вызванная функцией _safeMint стандарта ERC721.

Первопричина

В проекте установлено ограничение на количество NFT, которое может минтить один аккаунт. По сути, используется карта addressMinted, которая фиксирует, выпустил ли аккаунт NFT.

При минтинге NFT код использует функцию _safeMint из эталонной реализации OpenZeppelin. Эта функция называется «безопасной» (safe), так как она проверяет, может ли получатель принимать токены ERC721. Это предотвращает ситуацию, когда NFT отправляется на контракт, не способный обрабатывать токены ERC721. Согласно документации:

Если параметр to указывает на смарт-контракт, он должен реализовывать интерфейс IERC721Receiver.onERC721Received, который вызывается при безопасном переводе. Следующий код демонстрирует реализацию функции _safeMint от OZ.

Однако этот вызов внешней функции создает лазейку в безопасности. В частности, злоумышленник может выполнить повторный вызов внутри обратного вызова (callback) onERC721Received. Например, в уязвимом контракте HypeBears злоумышленник может снова вызвать функцию mintNFT внутри обратного вызова onERC721Received (поскольку запись addressMinted еще не обновлена).

Атака

На снимке экрана ниже показана транзакция атаки.

Уроки

Риски, связанные с использованием SafeMint, обсуждались исследователями безопасности link1 link2. Тем не менее, мы до сих пор встречаем уязвимый код и атаки в реальности. Как было показано в случае с safeTransfer во время инцидента безопасности QBridge, использование «безопасной» (safe) функции не гарантирует «безопасность» (safe) контракта 😃.

Sign up for the latest updates
Взлом Bitget на $387,5 млн вне блокчейна: не только ключи и контракты
Security Insights

Взлом Bitget на $387,5 млн вне блокчейна: не только ключи и контракты

24.09.2026 хакеры взломали сторонний продукт, похитили учётные данные и подделали выводы. Похищено ~$387,5 млн со счетов Bitget (Ethereum, EVM, XRP Ledger, Zcash, TRON); ключи целы. Обзор инцидента, конвертации активов, мер защиты и blockchain-пентеста.

Потеряно ~11,3 млн $: Multicall Router, Nostra | BlockSec Weekly
Security Insights

Потеряно ~11,3 млн $: Multicall Router, Nostra | BlockSec Weekly

Отчёт (14–20.09.2026): 2 инцидента, ~$11.3M потерь на Ethereum и Starknet. Мультиколл-роутер обманул Safe, выведя ~2900 aEthrsETH в пул Uniswap v4. Оракул Nostra оценил NSTR в ~$49.52, дав ~$3.5M займов под завышенный залог.

Потеряно ~320 млн $: взломы Liquid Network и Symbiosis | BlockSec
Security Insights

Потеряно ~320 млн $: взломы Liquid Network и Symbiosis | BlockSec

Отчёт за 2026/09/07–2026/09/13: два инцидента, ~$320М убытков. Эксплойт Liquid Network (кэш rangeproof без разделителей полей) дал 4000 незалогового L-BTC. На Bitcoin-маршруте Symbiosis отрицательная комиссия позволила выпустить триллионы syBTC — убыток ~9.97 BTC (~$770K).

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit
Когда «SafeMint» становится небезопасным: уроки инцидента с HypeBears