Resumen: Los ataques de reentrada son esencialmente similares a las llamadas recursivas en la programación, pueden ocurrir cuando un contrato envía Ethereum a una dirección desconocida, amenazando la seguridad de los contratos inteligentes de Ethereum. Sabiendo que Chuangyu Blockchain Security Lab comienza con cuatro aspectos del método de transferencia, la función de respaldo, el código de vulnerabilidad y el análisis del código fuente, un análisis en profundidad de la causa del ataque y una explicación detallada del incidente DAO. El concepto de contrato inteligente (inglés: Smart contract) fue propuesto por primera vez por Nick Szabo en 1995. Es un protocolo informático diseñado para difundir, verificar o ejecutar contratos de manera informatizada, transacciones de confianza, que son rastreables e irreversibles. Sin embargo, los contratos inteligentes no son seguros. La vulnerabilidad de ataque Re-Entrance es uno de los métodos de ataque en Ethereum. Ya en 2016, el evento DAO provocó una bifurcación dura de Ethereum. En Ethereum, los contratos inteligentes pueden llamar al código de otros contratos externos. Dado que los contratos inteligentes pueden llamar a contratos externos o enviar ether, estas operaciones requieren contratos para enviar llamadas externas, por lo que los atacantes pueden usar estas llamadas externas para provocar ataques. contrato para ser re-ejecutado en cualquier posición, pasando por alto las restricciones en el código original, por lo que se producen ataques de reingreso. Los ataques de reentrada son esencialmente similares a las llamadas recursivas en la programación, por lo que pueden ocurrir cuando un contrato envía ether a una dirección desconocida. En pocas palabras, hay dos condiciones para una vulnerabilidad de ataque de reentrada: se llama a un contrato externo y el contrato es inseguro. La llamada de función del contrato externo es anterior a la modificación de la variable de estado. Aquí hay un ejemplo de fragmento de código simple : Arriba El fragmento de código es la operación de retiro más simple. A continuación, analizaremos en detalle las razones del ataque de reentrada. Antes de analizar formalmente los ataques de reingreso, presentemos algunos conocimientos clave. El método de transferencia se enviará durante la operación de transferencia debido a los ataques de reingreso, y los métodos de transferencia comúnmente utilizados en Solidity son <address>.transfer(), <address>.send() y <address>.gas ().call.vale()(), los siguientes tres métodos de transferencia se describen a continuación: <address>.transfer(): solo se enviarán 2300 gas para llamar, y cuando el envío falla, se realizará la operación de reversión a través del tiro, evitando así el ataque de reentrada. <dirección>.send(): Solo se enviarán 2300 gas para llamar, y se devolverá el valor booleano falso cuando falle el envío, evitando así ataques de reentrada. <address>.gas().call.vale()(): todo el gas se enviará al llamar, y el valor booleano falso se devolverá cuando falle el envío, lo que no puede prevenir eficazmente los ataques de reingreso. Función de reserva A continuación, expliquemos la función de reserva de reserva. Función de respaldo (función de respaldo): La función de respaldo es una y solo una función sin un nombre en cada contrato, y esta función no tiene parámetros ni valor de retorno, como se muestra a continuación: function() public payable{ El volumen de transacciones de Bitcoin P2P de Nigeria ha aumentó en más del 15 % desde la prohibición del cifrado Un aumento interanual de más del 15 %. Actualmente, el volumen de negociación semanal de Bitcoin se está desacelerando ligeramente, probablemente debido a la caída del mercado. Se informa que en Nigeria, la cantidad total de transacciones que utilizan plataformas P2P supera los 400 millones de dólares estadounidenses. (Beincrypto) [2022/2/7 9:35:38] La función de reserva se ejecuta en las siguientes situaciones: al llamar al contrato, no coincide ninguna función; no se transmiten datos; el contrato inteligente recibe Ether (para aceptar Ethereum, la función de respaldo debe marcarse como pagadera). El código debajo del código de vulnerabilidad tiene un ataque de reingreso. Implementa un contrato similar a una billetera pública. Todos los usuarios pueden usar deposit() para depositar en el contrato de reingreso, o usar retirar() para retirarse del contrato de reingreso. Por supuesto, todos también pueden usar balanceof() para consultar el saldo de ellos mismos o de otros en el contrato. Primero use una cuenta (0x5B38Da6a701c568545dCfcB03FcB875f56beddC4) para actuar como víctima y haga clic en el botón Implementar para implementar el contrato en el IDE de Remix. Después de implementar con éxito el contrato, complete 5 en el cuadro de configuración de VALOR, cambie la unidad a éter y haga clic en depositar para depositar 5 éteres. Haga clic en monedero para ver el saldo del contrato y descubra que el saldo es de 5 ether, lo que indica que nuestro depósito se realizó correctamente. El siguiente código es un ataque contra el contrato vulnerable anterior: use otra cuenta (0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2) para actuar como atacante, copie la dirección del contrato vulnerable en el cuadro de configuración Implementar y haga clic en Implementar para implementar el contrato de ataque anterior. Después de que la implementación sea exitosa, primero llame a la función wallet() para verificar que el saldo del contrato de ataque sea 0. El atacante primero deposita 1 éter en el contrato vulnerable, aquí establece el VALOR en 1 éter y luego hace clic en el depósito del contrato de ataque para realizar un depósito. Vuelva a llamar a la función de billetera del contrato para verificar el saldo del contrato vulnerable y descubra que se ha convertido en 6 ether. El atacante (0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2) llama a la función de ataque del contrato de ataque para simular el ataque y luego llama a la función de billetera del contrato atacado para verificar el saldo del contrato y descubre que ha vuelto a cero. al contrato de ataque para verificar el saldo, y descubre que 6 ether en el contrato atacado Todos los fondos se han retirado al contrato del atacante, lo que provocó un ataque de reingreso. Análisis del código fuente Lo anterior explica cómo llevar a cabo ataques de reentrada y las causas de las vulnerabilidades.Aquí ordenamos el código fuente de las vulnerabilidades y los pasos del ataque, y enumeramos los códigos clave. El 17 de junio de 2016, el proyecto TheDAO sufrió un ataque de reingreso, lo que resultó en la separación de más de 3 millones de Ethereum del grupo de activos de TheDAO, y el atacante usó la función splitDAO() en el contrato inteligente de TheDAO para reutilizar su propio transporte de activos de DAO. realizar ataques de reingreso, separando constantemente los activos DAO del conjunto de activos del proyecto TheDAO y transfiriéndolos a sus propias cuentas. El siguiente código es parte del código en la función splitDAO(), el código fuente está en TokenCreation.sol, transferirá tokens del DAO principal al DAO secundario. La matriz de saldos uint fundToBeMoved = (balances[msg.sender] * p.splitData.splitBalance) / p.splitData.totalSupply determina la cantidad de tokens que se moverán. El siguiente código es para la operación de recompensa de retiro, cada vez que el atacante llama a esta función, p.splitData es el mismo (es un atributo de p, es decir, un valor fijo), y p.splitData.totalSupply y saldos El valor de [msg.sender] ocurrió después de la operación de transferencia debido al orden de las funciones y no se actualizó. payOut[_account] += recompensa La variable de estado actualizada se coloca después de la llamada a la función payOut en el código en cuestión. Emita una llamada .call.value a _recipient, transfiera _amount Wei y la llamada .call.value utilizará todo el gas restante actual de forma predeterminada. A través del análisis anterior del ataque de reentrada, podemos encontrar que el punto clave de la vulnerabilidad del ataque de reentrada es usar funciones como el respaldo para volver a llamar a sí mismo para hacer que las llamadas recursivas realicen operaciones de transferencia circular. Por lo tanto, existen las siguientes soluciones para la vulnerabilidad de ataque de reentrada. Use otras funciones de transferencia para usar la función transfer() incorporada de Solidity cuando envíe transferencias de Ethereum a direcciones externas, porque transfer() solo enviará 2300 gas para llamar cuando transfiera dinero, que no será suficiente para llamar a otro contrato, use transfer( ) reescribe el retiro () del contrato original de la siguiente manera: Modifica primero la variable de estado De esta manera se asegura que la modificación de la variable de estado sea anterior a la operación de transferencia, es decir, el modo de controles-efectos-interacciones (controles- efectos-interacciones) recomendado oficialmente por Solidity. Use un mutex Un mutex es para agregar una variable de estado que bloquea el contrato durante la ejecución del código para evitar ataques de reingreso.
Tags:
En el primer trimestre de 2021, 129 nuevas empresas centradas en una tecnología digital llamada blockchain recaudaron unos 2600 millones de dólares.
En nuestra vida diaria, uno de los sentidos comunes más básicos es que la información de la cuenta de la tarjeta bancaria pertenece a la privacidad de empresas o individuos.
Después de la caída del 19 de mayo, el criptomercado global no se ha recuperado por completo. La prohibición de la industria minera en Mongolia Interior, las repetidas acusaciones del CEO de Tesla, Musk.
Resumen: Los ataques de reentrada son esencialmente similares a las llamadas recursivas en la programación, pueden ocurrir cuando un contrato envía Ethereum a una dirección desconocida.
En la tarde del 19 de mayo, hora de Beijing, el mercado de criptomonedas marcó el comienzo de una fuerte caída. Bitcoin una vez cayó por debajo de los $31 000.
¿Por qué a nadie le importa Musk? Esta es la frase que los inversores estadounidenses de Bitcoin han dicho más recientemente. Hace unas semanas, el "creyente" de Bitcoin, Musk.
Título ▌V God: PoS es la solución al consumo de energía de EthereumJinse Finance informó que Vitalik cree que Ethereum está a punto de hacer la transición al mecanismo de consenso de prueba de participación.