Una herramienta para detectar contratos inteligentes metamórficos PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Una herramienta para detectar contratos inteligentes metamórficos

Una suposición crítica de seguridad de Ethereum es que el código de contrato inteligente es inmutable y, por lo tanto, no se puede cambiar una vez que se implementa en la cadena de bloques. En la práctica, algunos contratos inteligentes podemos cambio, incluso después de haber sido implementados. Con algunos trucos ingeniosos, puede crear contratos inteligentes metamórficos que “metamorfosis” en otra cosa, y al comprender qué los hace posibles, puede detectarlos.

Los contratos inteligentes metamórficos son mutables, lo que significa que los desarrolladores pueden cambiar el código dentro de ellos. Estos contratos inteligentes representan un grave riesgo para los usuarios de web3 que confían en el código que esperan ejecutar con absoluta consistencia, especialmente porque los malos actores pueden explotar esta capacidad de cambio de forma. Imagine a un atacante que usa la técnica para "enredar" a las personas que están apostando tokens en un contrato inteligente que no se dan cuenta de que es metamórfico. Los ataques basados ​​en esta y otras premisas similares podrían equipar a los estafadores para aprovecharse de las personas y, en general, socavar la confianza en la promesa total de los sistemas descentralizados.

Para analizar si un contrato inteligente contiene propiedades metamórficas, Construí un simple Detector de contratos metamórficos (inspirado y basado en el trabajo original de Jason carver, 0agey otros). Cualquiera puede usar la herramienta para verificar si un contrato determinado exhibe señales de alerta que podrían indicar el potencial de metamorfismo. El método no es infalible: el hecho de que un contrato inteligente muestre una bandera no significa que sea necesariamente metamórfico; y solo porque no es así, no significa que sea seguro. El verificador simplemente ofrece una evaluación inicial rápida de que un contrato podría ser metamórfico basado en posibles indicadores. 

Los usuarios de Web3 deben familiarizarse con las amenazas que plantean los contratos metamórficos para que puedan estar atentos y evitar posibles ataques. Los indexadores de billeteras y blockchain pueden ayudar al advertir a los usuarios antes de que interactúen con un contrato inteligente que puede contener propiedades metamórficas. Esta herramienta está destinada a ayudar tanto a educar a las personas sobre esta amenaza potencial... como a defenderse de ella.

Detección de contratos inteligentes metamórficos

El Detector de contratos metamórficos Construí análisis de seis propiedades que pueden indicar si un contrato inteligente es metamórfico.

    1. ¿Se utilizó un código metamórfico conocido para implementar el contrato? Si el código de bytes metamórfico conocido, el código legible por máquina virtual de nivel inferior en el que se convierten los contratos inteligentes de Ethereum, generalmente escritos en Solidity, después de compilarse, aparece en una transacción para la implementación de un contrato inteligente determinado, eso es una señal de alerta importante. En las secciones siguientes, analizaremos uno de esos ejemplos de código de bytes metamórfico desarrollado por 0age. Una advertencia importante: existen potencialmente innumerables variaciones del código de bytes metamórfico, lo que dificulta la detección de todas las variedades. Sin embargo, al buscar instancias conocidas, el detector elimina la fruta madura para los atacantes que simplemente copian y pegan ejemplos existentes.
    2. ¿Puede el código del contrato inteligente autodestruirse? Para reemplazar el código en un contrato, un paso clave en la creación de un contrato metamórfico, un desarrollador primero debe eliminar el código preexistente. La única manera de hacer esto es usando el Código de operación de AUTODESTRUCCIÓN, un comando que hace exactamente lo que parece: borra todo el código y el almacenamiento en una dirección de contrato determinada. La presencia de código autodestructivo en un contrato no prueba que sea metamórfico; sin embargo, ofrece una pista de que el contrato podría sea ​​metamórfico y vale la pena saber, de todos modos, si los contratos en los que confía pueden destruirse a sí mismos.
    3. ¿El contrato inteligente llama en código desde otro lugar? Si el contrato inteligente en cuestión no puede autodestruirse directamente, aún puede borrarse usando el código de operación DELEGATECALL. Este código de operación permite que un contrato inteligente cargue y ejecute dinámicamente código que vive dentro de otro contrato inteligente. Incluso si el contrato inteligente no contiene el código de operación SELFDESTRUCT, puede usar DELEGATECALL para cargar el código de autodestrucción desde otro lugar. Si bien la funcionalidad DELEGATECALL no indica directamente si un contrato inteligente es metamórfico, es una posible pista, y un posible problema de seguridad, que vale la pena señalar. Tenga en cuenta que este indicador tiene el potencial de generar muchos falsos positivos. 
    4. ¿Otro contrato implementó este contrato? Se pueden implementar contratos metamórficos , solamente por otros contratos inteligentes. Esto se debe a que los contratos metamórficos están habilitados por otro código de operación, que solo pueden usar otros contratos inteligentes, llamado CREATE2. (Discutiremos CREATE2, cómo funciona y por qué es importante, más en una sección posterior). Este rasgo es uno de los indicadores menos conspicuos de un posible metamorfismo; es una precondición necesaria pero insuficiente. Es probable que el análisis de este rasgo genere muchos falsos positivos, pero es información valiosa para saber, ya que puede generar sospechas y proporcionar una razón para examinar más a fondo un contrato, especialmente si el contrato inteligente contiene el código de operación que se describe a continuación.
    5. ¿El contrato de implementación contiene el código de operación CREATE2? Como se mencionó anteriormente, la implementación a través de CREATE2 es una condición previa esencial para el metamorfismo. Si un contrato de implementación contiene el código de operación CREATE2, eso puede indicar que usó CREATE2 para implementar el contrato en cuestión. Si el implementador realmente usó CREATE2 para implementar dicho contrato, aunque eso no significa que el contrato sea necesariamente metamórfico, sí significa que podría ser metamórfico y puede ser conveniente proceder con cautela e investigar más a fondo. Nuevamente, tenga cuidado con los falsos positivos: CREAR2 tiene mucho usos legítimos, incluido el refuerzo Soluciones de escalado de “capa 2” y facilitando la creación de carteras de contratos inteligentes que pueden mejorar web3 incorporación de usuarios y opciones clave de recuperación.
    6. ¿Cambió el código? Esta es la indicación más obvia, pero solo aparecerá después de que un contrato metamórfico ya se haya transformado. Si el hash del código del contrato inteligente, un identificador criptográfico único, es diferente de lo que era cuando se implementó inicialmente el contrato, es probable que el código se eliminó, reemplazó o modificó. Si los valores hash ya no coinciden, algo en el código ha cambiado y el contrato podría ser metamórfico. Esta bandera es el indicador más seguro de metamorfismo, pero no ayudará a predecir o adelantarse a la transformación ya que solo comprueba que ya ocurrió.

Además de crear una herramienta de línea de comandos simple para el detector de contratos metamórficos, construí algunos contratos inteligentes de ejemplo que demuestran un escenario de estafa de estafas de contratos metamórficos, que describo en la siguiente sección. Todo el código está disponible en este Repositorio GitHub

Cómo un actor malicioso puede usar contratos metamórficos para robar los fondos de las personas

Así es como alguien podría usar un contrato inteligente metamórfico como parte de una estafa. 

La primera es la fase de configuración. El atacante implementa un contrato inteligente en una dirección específica en la cadena de bloques utilizando dos herramientas: el código de bytes metamórfico y el código de operación CREATE2. (Más adelante ampliaremos estos dos conceptos). El código de bytes metamórfico hace lo que sugiere su nombre y se "transforma". Aquí, se transforma en un contrato de participación donde los usuarios pueden apostar tokens ERC-20. (Nuevamente, discutiremos los detalles de este truco de transformación más adelante. ¡Prometido!)

Luego viene el cebo y el interruptor. Los usuarios desprevenidos apuestan sus tokens en este contrato, atraídos por la posibilidad de obtener un rendimiento o algún otro beneficio. Luego, el atacante elimina todo el código de replanteo y el "estado" (almacenamiento o memoria de blockchain) en esta dirección de contrato inteligente utilizando el Código de operación de AUTODESTRUCCIÓN discutido en la sección anterior. (Cabe señalar que los tokens, que existen como parte de un contrato ERC-20 separado, persisten, no se ven afectados por el contrato autodestruido).

Por último, el tirón de la alfombra. El atacante reutiliza el mismo código de bytes metamórfico utilizado en la fase de configuración para "reimplementar" un nuevo contrato. Este nuevo contrato se despliega en la misma dirección recientemente desocupada por el contrato de autodestrucción. Esta vez, sin embargo, el código de bytes se “transforma” (nuevamente, explicaremos cómo más adelante) en un contrato malicioso que puede robar todos los tokens apostados en la dirección del contrato. Estafa completa. 

Los riesgos que plantean los contratos inteligentes metamórficos ya son claramente evidentes. Pero es posible que todavía te preguntes, ¿cómo funciona realmente este truco del metamorfismo? Para comprender eso, debe investigar más a fondo, hasta el nivel del código de bytes. 

Cómo CREATE2 abre la posibilidad del metamorfismo 

CREAR2 es una actualización de código de operación, introducido a Ethereum en febrero de 2019, que ofrece una nueva forma de implementar contratos inteligentes. 

CREATE2 brinda a los desarrolladores más control sobre la implementación de sus contratos inteligentes que antes. El código de operación CREATE original dificulta que los desarrolladores controlen la dirección de destino de un contrato inteligente que se implementará. Con CREATE2, las personas pueden controlar y conocer la dirección de un contrato inteligente en particular por adelantado, antes de implementarlo en la cadena de bloques. Este conocimiento previo, además de algunos trucos inteligentes, es lo que permite a las personas crear contratos inteligentes metamórficos. 

¿Cómo puede CREATE2 predecir el futuro? El cálculo del código de operación es determinista: mientras las entradas no cambien, la dirección determinada por CREATE2 no cambiará. (Incluso el cambio más pequeño hará que la implementación se realice en otro lugar).

Más granularmente, CREATE2 es una función que combina y combina algunos elementos. Primero, incorpora la dirección del implementador (o remitente): el contrato inteligente iniciador que actúa como padre del que se creará. A continuación, agrega un número arbitrario proporcionado por el remitente (o "sal"), lo que permite al desarrollador implementar el mismo código en diferentes direcciones (cambiando el salt) y evita sobrescribir contratos idénticos existentes. Finalmente, utiliza el hash keccak256 de algún código de bytes de inicialización ("init") de contrato inteligente, que es la semilla que se convierte en un nuevo contrato inteligente. Esta combinación de hash determina una dirección de Ethereum y luego implementa el código de bytes dado en esa dirección. Mientras el código de bytes sigue siendo exactamente el mismo, CREATE2 siempre implementará el código de bytes dado en la misma dirección en la cadena de bloques.

Así es como se ve la fórmula CREATE2. (Nota: notará otro elemento, un "0xFF", en el ejemplo a continuación. Esta es solo una constante que CREATE2 usa para prevenir colisiones con el código de operación CREATE anterior).

Ahora que tenemos una forma de implementar código en una dirección determinista, ¿cómo es posible el cambio el código en esa misma dirección? Al principio, esto puede parecer imposible. Si desea implementar código nuevo mediante CREATE2, el código de bytes debe cambiar y, por lo tanto, CREATE2 se implementará en una dirección diferente. Pero, ¿qué pasaría si un desarrollador construyera el código de bytes de tal manera que pudiera "transformarse" en un código diferente cuando CREATE2 implemente un contrato inteligente?

Cómo funciona realmente un contrato metamórfico

La receta para convertir un contrato inteligente en un contrato metamórfico requiere tres contratos inteligentes en total, cada uno con una función única.

Uno de estos componentes necesarios es Metamorphic Contract Factory, el cerebro de la operación. Esta "Fábrica" ​​es responsable de implementar el Contrato metamórfico, así como otro contrato inteligente llamado Contrato de implementación, llamado así porque su código eventualmente se implementa dentro del Contrato metamórfico. Una coreografía sutil entre estos tres contratos da como resultado un metamorfismo, como se muestra en el siguiente diagrama.

Una herramienta para detectar contratos inteligentes metamórficos PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Analicemos cada paso, 1-7, en detalle para iluminar las operaciones en el trabajo.

Paso 1: un desarrollador pone todo en movimiento

Un codificador diseña un código de contrato inteligente, el código de bytes del contrato de implementación, que eventualmente terminará en el contrato metamórfico. El desarrollador envía este código a Metamorphic Contract Factory, un contrato inteligente cuyo objetivo principal es implementar otros contratos inteligentes. Esta acción pone en marcha todo el proceso de creación del Contrato Metamórfico.

Todo lo que sigue es el resultado de este paso inicial. Por cierto, Los pasos del 1 al 6 ocurren en una transacción atómica en la cadena de bloques, lo que significa que casi todos a la vez. Estos pasos se pueden repetir una y otra vez, hasta el infinito, para reemplazar el código dentro del contrato metamórfico y mantenerlo transformándose continuamente.

Paso 2: la fábrica implementa el contrato de implementación

El primer contrato que implementa Factory es el contrato de implementación, que contiene el código de implementación. (Creativo, lo sabemos). Piense en el Contrato de Implementación como un muelle de carga, o punto de ruta, que contiene algún código antes de que se envíe a su destino final, que estará, en este caso, dentro del Contrato Metamórfico. 

Paso 3: La fábrica almacena la dirección del contrato de implementación

Después de su implementación en la cadena de bloques, el Contrato de Implementación existirá necesariamente en alguna dirección de la cadena de bloques. La Fábrica almacena esta dirección de contrato en su propia memoria (para ser utilizada más adelante, en el Paso 5). 

Paso 4: Factory implementa Metamorphic Contract

The Factory implementa el contrato metamórfico utilizando CREATE2 y el código de bytes metamórfico. Puede encontrar un tutorial técnico detallado sobre cómo funciona el código de bytes metamórfico esta página, pero baste decir que cuando se ejecuta el código de bytes metamórfico, copia el código de alguna otra ubicación en la cadena, en este caso, del Contrato de implementación, en el Contrato metamórfico. Como mencionamos en la última sección, dado que CREATE2 es determinista (siempre y cuando se usen el mismo remitente, sal y código de bytes), la dirección del contrato metamórfico permanece igual sin importar cuántas veces se repitan estos pasos.

A continuación se muestra un ejemplo de cómo se ve el código de bytes metamórfico, desde el repositorio metamórfico por 0edad. Este es solo un ejemplo de código de bytes metamórfico: existen potencialmente innumerables variaciones, lo que complica enormemente la detección de contratos metamórficos.

Una herramienta para detectar contratos inteligentes metamórficos PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Paso 5: el código de bytes metamórfico consulta a Factory para la dirección del contrato de implementación

El código de bytes metamórfico solicita a Factory la dirección del contrato de implementación (tal como se almacenó en el paso 3). No importa si la dirección del contrato de implementación cambia siempre que el código de bytes metamórfico que solicita la dirección permanezca igual. De hecho, si el desarrollador luego implementa un nuevo contrato de implementación, como uno malicioso diseñado para robar tokens, necesariamente se implementará en una dirección de blockchain diferente, según el paso 2. Esto no tiene impacto en la creación del contrato metamórfico.

Paso 6: El código del contrato de implementación se copia en el contrato metamórfico

Usando la dirección de cadena de bloques aprendida en el Paso 5, el código de bytes metamórfico localiza el código en el Contrato de implementación y copia ese código en el almacenamiento local del Contrato metamórfico. Así es como cambia de forma el Contrato Metamórfico: copiando el código del Contrato de Implementación. 

Paso 7: Enjuague y repita

Un desarrollador puede repetir los pasos del 1 al 6 una y otra vez y reemplazar el código en el contrato metamórfico con lo que quiera a través de un nuevo contrato de implementación. Todo lo que se necesita es usar el código de operación SELFDESTRUCT, o, más tortuosamente, los códigos de operación DELEGATECALL que finalmente resultan en una AUTODESTRUCCIÓN, para eliminar el código preexistente en el Contrato metamórfico. Al repetir el ciclo con el nuevo bytecode del Contrato de Implementación, el Contrato Metamórfico, como magia, ¡transfórmate!

Usando esta técnica para crear contratos metamórficos, un desarrollador inteligente puede cambiar constantemente el terreno bajo los pies de los usuarios de web3. Considere, por ejemplo, el escenario de la estafa nuevamente. Un desarrollador podría implementar primero el contrato de implementación con un código de participación de tokens que, a través de la ruta tortuosa que se muestra en el gráfico y se explica en los pasos anteriores, termina en el contrato metamórfico. El estafador podría luego autodestruir este código y reemplazarlo implementando un nuevo Contrato de Implementación que contenga token-robando código. 

Cualquier cosa que se implemente en el Contrato de Implementación finalmente terminará en el Contrato Metamórfico. Esa es la esencia del truco. 

***

Los contratos inteligentes metamórficos rompen el contrato social web3 implícito de que lo que ves es lo que obtienes. Similar a la forma en que el juego de conchas usa tres vasos en movimiento para esconder una pelota, la interacción de los tres contratos en la creación de un contrato metamórfico hace que sea difícil seguir la verdadera función del contrato. El juego de trileros es una comparación particularmente acertada porque los estafadores de confianza a menudo usan la prestidigitación y la mala dirección para asegurarse de ganar. En la versión web3, los escritores de contratos metamórficos pueden hacer que la "bola", es decir, el código de implementación, desaparezca (léase: autodestruirse), y pueden reemplazarla con lo que quieran.

La existencia de contratos metamórficos significa que es posible que los usuarios de web3 celebren contratos que pueden cambiar a voluntad, por eso es tan importante comprender esta amenaza y defenderse de ella. Mi detector de contratos metamórficos ofrece solo un primer paso hacia la identificación de contratos metamórficos por el juego de manos que emplean. Hay varias formas de mejorar el detector en el futuro. Por ejemplo, al verificar recursivamente la Fábrica (o el contrato de implementación) que creó el Contrato Metamórfico, uno podría ver si la Fábrica es en sí misma metamórfica. Esta característica sería una adición útil a una versión 2 mejorada del Detector.

Vale la pena reiterar una vez más: esta herramienta Detector no es infalible. Las banderas que atrapa no son todos signos reveladores de potencial metamórfico, pero ofrecen pistas. Identificar estas banderas es solo el comienzo de una investigación más exhaustiva. Es por eso que ampliamos el Detector para buscar indicadores que fácilmente podrían generar falsos positivos, como la presencia de códigos de operación CREATE2 o DELEGATECALL. Si tiene sugerencias para mejorar la herramienta o desea ampliar o ampliar este trabajo inicial, póngase en contacto conmigo en .

Analice contratos inteligentes para rasgos metamórficos utilizando la herramienta Detector y visite en el Repositorio GitHub

Editor: Robert Hackett @rhhackett

***

Agradecimientos: Quiero agradecer ENORMEMENTE a Robert Hackett, Eddy Lazzarin, Sam Ragsdale, Riyaz Faizullabhoy, Noah Citron, Mason Hall y Daejun Park por sus valiosos comentarios y consejos para hacer que esta publicación y esta herramienta cobren vida. 

***

Las opiniones expresadas aquí son las del personal individual de AH Capital Management, LLC ("a16z") citado y no son las opiniones de a16z o sus afiliados. Cierta información contenida aquí se ha obtenido de fuentes de terceros, incluso de compañías de cartera de fondos administrados por a16z. Si bien se tomó de fuentes que se consideran confiables, a16z no ha verificado de forma independiente dicha información y no hace declaraciones sobre la precisión duradera de la información o su idoneidad para una situación determinada. Además, este contenido puede incluir anuncios de terceros; a16z no ha revisado dichos anuncios y no respalda ningún contenido publicitario incluido en ellos.

Este contenido se proporciona solo con fines informativos y no debe considerarse como asesoramiento legal, comercial, de inversión o fiscal. Debe consultar a sus propios asesores sobre estos asuntos. Las referencias a cualquier valor o activo digital son solo para fines ilustrativos y no constituyen una recomendación de inversión ni una oferta para proporcionar servicios de asesoramiento de inversión. Además, este contenido no está dirigido ni destinado a ser utilizado por ningún inversionista o posible inversionista, y bajo ninguna circunstancia se puede confiar en él al tomar una decisión de invertir en cualquier fondo administrado por a16z. (Una oferta para invertir en un fondo a16z se realizará solo mediante el memorando de colocación privada, el acuerdo de suscripción y otra documentación relevante de dicho fondo y debe leerse en su totalidad). Cualquier inversión o compañía de cartera mencionada, referida o descritos no son representativos de todas las inversiones en vehículos administrados por a16z, y no puede garantizarse que las inversiones serán rentables o que otras inversiones realizadas en el futuro tendrán características o resultados similares. Una lista de inversiones realizadas por fondos administrados por Andreessen Horowitz (excluyendo inversiones para las cuales el emisor no ha otorgado permiso para que a16z divulgue públicamente, así como inversiones no anunciadas en activos digitales que cotizan en bolsa) está disponible en https://a16z.com/investments /.

Los cuadros y gráficos proporcionados en el interior tienen únicamente fines informativos y no se debe confiar en ellos al tomar cualquier decisión de inversión. El rendimiento pasado no es indicativo de resultados futuros. El contenido habla sólo a partir de la fecha indicada. Todas las proyecciones, estimaciones, pronósticos, objetivos, perspectivas y/u opiniones expresadas en estos materiales están sujetas a cambios sin previo aviso y pueden diferir o ser contrarias a las opiniones expresadas por otros. Consulte https://a16z.com/disclosures para obtener información adicional importante.

Sello de tiempo:

Mas de Andreessen Horowitz