A medida que los protocolos DeFi continúan calentándose dentro del ecosistema Ethereum, CipherTrace está viendo más y más exploits y vectores de ataque salir a la luz. La semana pasada, el 28 de diciembre de 2020, se explotó el contrato de minería de escudo de Cover Protocol, Blacksmith. Los piratas informáticos utilizaron un error en el contrato de minería para acuñar una cantidad infinita de tokens COVER y sacar más de $ 4.4 millones del proyecto.
Protocolo de portada liberado su Post-Mortem ayer indicando que, desconocido para los desarrolladores, el error había estado presente desde el despliegue inicial del contrato de Blacksmith, destacando la importancia de auditorías de seguridad exhaustivas y pentesting contratos inteligentes¿Qué son los contratos inteligentes? Un contrato inteligente es un profesional de la informática ... Más.
Una cronología de acuñación infinita
La cronología del atacante inicial
- El nuevo fondo común de liquidez de Balancer era adicional al contrato de Blacksmith.sol.
- Agresor XNUMX% 1,326,879.99 tokens BPT en el contrato Blacksmith.sol.
- El mismo atacante entonces ejecuta el exploit, retirando fondos del contrato.
- El atacante pudo continue acuñando recompensas y retirando fondos por un valor aproximado de 4.4 millones de dólares.
En un interesante giro de los acontecimientos, los supuestos "piratas informáticos blancos" vinculados a Grap Finance también explotaron el error para generar aproximadamente $ 4 millones en tokens COVER. Grap Finance finalmente devolvió los fondos a Cover Protocol.
Cronología de la cuenta de propiedad externa (EOA) de Grap Finance Deployer
- El nuevo fondo común de liquidez era aprobado para minería de liquidez.
- EOA de Grap Finance Deployer depositado 15,255.55 BPT (DAI / Basis) en el grupo en Cover a través del contrato Blacksmith.sol.
- Aproximadamente cuatro minutos después, los fondos fueron retirado en Cover dejando 1 Wei en el saldo de EOA de Grap Finance Deployer.
- Otro usuario externo se retiró la mayor parte de su saldo del contrato Blacksmith.sol alrededor de la misma época que llevó a Grap Finance con toda la liquidez para el grupo DAI / Basis en el contrato Blacksmith.sol.
- Implementador de finanzas de Grap depositado devuelva 15,255.55 BPT (DAI / Basis) a la piscina.
- Luego, Grap Finance Deployer reclamaciones las recompensas y, debido a la hazaña, mentas 40,796,131,214,802,500,000.21 CUBIERTA.
- Después de quemar algunos tokens acuñados, Grap Finance Deployer envía Volver Ether to Cover indicando "La próxima vez, ocúpate de tu propia mierda".
Cómo acuñar tokens infinitos: un análisis técnico
Antecedentes
Este exploit nos lleva de vuelta a los fundamentos del lenguaje de programación Solidity, que se utiliza para implementar contratos inteligentes dentro de Ethereum. Una vez que se compilen estos contratos, la Máquina Virtual Ethereum (EVM) podrá comprender las instrucciones (es decir, los códigos de operación) que se utilizan para ejecutar diversas funciones y manipular la memoria y el almacenamiento. El EVM tiene tres áreas diferentes donde puede almacenar datos: la memoria, el almacenamiento y la pila. Comprender estas áreas es importante para comprender cómo se aprovechó el error.
Similar a la memoria de acceso aleatorio (RAM) en un dispositivo informático, el "memoriaLa palabra clave ”dentro de Solidity asigna memoria para una variable específica. En este caso, esa variable tiene como ámbito una función específica. La memoria se borra una vez que se ha ejecutado la función, pero podría permanecer si el contenido de esa memoria se almacena antes de que la función regrese.
Los "STORAGELa palabra clave ”dentro de Solidity permite que las variables actúen como un puntero en el almacenamiento de datos en mapeos o estructuras de datos. Los datos de almacenamiento son persistentes entre las llamadas a funciones y las transacciones. Bajo el capó, el almacenamiento es esencialmente un almacén de valores clave que asigna palabras de 256 bits a palabras de 256 bits.
Tenga en cuenta que el EVM no es una máquina de registro sino una máquina de pila; por lo tanto, todos los cálculos se realizan en un área de datos llamada la pila. La pila tiene una capacidad máxima de 1024 elementos, pero solo se puede acceder fácilmente a los 16 elementos superiores, que se pueden usar para intercambiar el elemento superior con uno de los 16 elementos debajo y más.
El bicho
Los piratas informáticos explotaron Blacksmith.sol de Cover Protocol, un contrato de minería de escudos que permite que los interesados sean recompensados en los tokens del proyecto o grupo específico, como los tokens CLAIM y NOCLAIM, dentro del Cover Protocol.
Para comprender mejor el error, primero veamos al público quinielas variable que es un mapeo (es decir, almacenamiento de datos):
At línea 118, vemos que el contrato almacena en caché los datos del grupo en la memoria a través de la palabra clave "memoria".
Entonces en línea 121, el contrato actualiza el grupo en almacenamiento como el updatePool (dirección _lpToken) función utiliza una Piscina de almacenamiento variable.
Sin embargo, si miras más abajo en el depósito (dirección _lpToken, uint256 _amount) función, utiliza la misma alberca variable de la línea 118 que se almacenó en la memoria caché dentro de la función para los cálculos de pool.accRecompensasPorToken. En este punto, el alberca La variable fue copiada de la quinielas mapeo y se guardó en la memoria.
Como resultado, cualquier cambio realizado en el alberca variable dentro de la depósito (dirección _lpToken, uint256 _amount) La función no cambiará la quinielas mapeo en el almacenamiento en cadena del contrato debido al hecho de que las variables que usan la palabra clave "memoria" solo tienen un alcance dentro de la función misma. A partir de ahí, el contrato actualiza el pool.accRecompensasPorToken en la pestaña updatePool (dirección _lpToken) función, que utiliza almacenamiento. Así que ahora, dentro del updatePool (dirección _lpToken) funciona el pool.accRecompensasPorToken que se actualiza aumenta enormemente, ya que técnicamente era un grupo nuevo y no estaba asociado al alberca en memoria.
Tras esta vulnerabilidad y el uso indebido entre la memoria y el almacenamiento, el minero.recompensaCancelar en la pestaña depósito (dirección _lpToken, uint256 _amount) la función está mal calculada, así como el uso de la incorrecta pool.accRecompensasPorToken, ya que todavía estamos dentro de la función de depósito que está manejando una instancia en memoria caché de alberca.
Además de la función de depósito, cualquiera, como Grap Finance, puede obtener una cantidad increíble de tokens acuñados cuando ejecutan la ClaimRewards (dirección _lpToken) función. Esta función, que se usa para agarrar sus recompensas, termina llamando _claimCoverRewards (grupo de memoria de grupo, minero de memoria de minero) que hace referencia al minero.recompensaCancelar que destacamos arriba. Como esa variable es mucho menor que la real pool.accRecompensasPorToken, el contrato da como resultado la acuñación de una gran cantidad de tokens.
Puntos clave
CipherTrace espera que estos antecedentes en el error explotado saquen a la luz la importancia de auditorías de seguridad exhaustivas y pentesting de contratos inteligentes en cualquier blockchainUna cadena de bloques: la tecnología subyacente a bitcoin y otras c… Más uno elige desplegar. Si bien Grap Finance devolvió los fondos que recibieron a través del exploit, el pirata informático original aún pudo obtener más de $ 4 millones del protocolo DeFi, y el valor del token de COVER se ha desplomado desde entonces en casi un 99%.
Fuente: https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/