Back to Blog

Cuando "SafeMint" Se Vuelve Inseguro: Lecciones del Incidente de Seguridad de HypeBears

Code Auditing
February 3, 2022
2 min read

En la mañana del 3 de febrero (zona horaria +8), nuestro sistema reportó una transacción de ataque 0xfa97c3476aa8aeac662dae0cc3f0d3da48472ff4e7c55d0e305901ec37a2f704 hacia el contrato NFT de HypeBears. Tras la investigación, descubrimos que se trata de un ataque de reentrada causado por la función _safeMint de ERC721.

La causa raíz

El proyecto tiene una limitación en la cantidad de NFTs que una cuenta puede acuñar. Básicamente, tiene un mapa addressMinted que registra si una cuenta ha acuñado los NFTs.

Al acuñar NFTs, el código utiliza la función _safeMint de la implementación de referencia de OZ. Esta función es safe (segura) porque verifica si el receptor puede recibir tokens ERC721, lo que puede prevenir el caso en que un NFT sea acuñado hacia un contrato que no pueda manejar tokens ERC721. Según la documentación:

Si to hace referencia a un contrato inteligente, debe implementar IERC721Receiver.onERC721Received, que es llamado durante una transferencia segura. El siguiente código muestra la implementación de OZ de la función _safeMint.

Sin embargo, esta llamada a función externa crea una brecha de seguridad. Específicamente, el atacante puede realizar una llamada reentrante dentro del callback onERC721Received. Por ejemplo, en el contrato vulnerable de HypeBears, el atacante puede invocar nuevamente la función mintNFT en el callback onERC721Received (ya que addressMinted no ha sido actualizado).

El ataque

La siguiente captura de pantalla muestra la transacción del ataque.

Lecciones

El riesgo ocasionado por SafeMint ha sido discutido por investigadores de seguridad enlace1 enlace2. Sin embargo, aún podemos ver el código vulnerable y el ataque en la práctica. Como se muestra con safeTransfer en el incidente de seguridad de QBridge, usar una función segura no garantiza un contrato seguro 😃.

Best Security Auditor for Web3

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

BlockSec Audit