Un problema de seguridad con el lenguaje Solidity de Ethereum, no solo el DAO

ACTUALIZACIÓN: Esta publicación es de junio de 2016 y enumera un problema de seguridad con Solidity. Desde entonces ha habido otros problemas, pero también un gran crecimiento del ecosistema Ethereum. Es fantástico ver la innovación en la informática descentralizada.

Se ha destacado otro problema en Solidity, un lenguaje similar a JavaScript que Ethereum usa para contratos inteligentes, que puede afectar cualquier contrato de Ethereum, no solo el DAO.

Este problema es específicamente un problema m con el diseño del lenguaje Solidity. Existe una gran cantidad de investigaciones sobre lenguajes formales para contratos (consulte esta encuesta o esta publicación de Nick Szabo). Ethereum, sin embargo, decidió utilizar un lenguaje similar a JavaScript.

El problema afecta a algunos, y no a todos, los contratos en Ethereum. Y los desarrolladores de contratos futuros pueden evitar la redacción de contratos explotables siguiendo de cerca las pautas y las mejores prácticas.

Esto NO significa que Ethereum esté roto permanentemente. El compilador de Solidity puede advertir a los programadores sobre este problema en particular.

¿Cuál es el problema?

Los contratos de Ethereum llaman a otros contratos de forma rutinaria. Esta práctica es fomentada por la comunidad con una visión de contratos inteligentes en todas partes hablando entre sí.

Resulta que cuando un contrato Ethereum habla con otro contrato, puede perder su propio control y estado del programa. Esta vulnerabilidad fue descubierta por Joey Krug y Martin Köppelmann, y publicitada por Philip Daian, un Estudiante de doctorado en Cornell con Emin Gun Sirer.

Es importante diferenciar este problema de la reentrada , que es un problema conocido y se utilizó para atacar el DAO. Este problema es una forma ligeramente diferente de reentrada y los detalles sutiles son importantes. Llamemos a este problema solarstorm ( por falta de un nombre mejor). Daian no lo nombró explícitamente, pero le gusta el nombre de la tormenta solar.

Tormenta solar contra reentrada:

Este problema puede parecer similar a la reentrada, pero es más amplio que la reentrada y los desarrolladores deben pensar en el estado compartido de forma explícita.

El problema de reentrada puede ocurrir cuando:

1. Contrato A, la función A llama contrato B.

2. El contrato B llama al contrato A, función A.

La idea clave de Daian es que incluso una sola llamada por cualquier contrato es suficiente. El problema de la tormenta solar puede ocurrir cuando:

1. El contrato A llama a cualquier contrato externo arbitrario.

2. El contrato A tiene una función externa que modifica el estado (la mayoría lo hace).

Por tanto, un ejemplo de explotación de tormenta solar puede ser:

1. Contrato A, la función A llama contrato B.

2. El contrato A tiene otra función C que comparte estado con la función A.

3. El contrato B llama al contrato A, función C.

Esto significa que en los contratos de Ethereum usted (a) no puede usar llamadas externas en su contrato o (b) no puede tener funciones a las que se puede llamar externamente que comparten el estado con funciones que realizan llamadas externas.

En la práctica, deshacerse de (a) es difícil, por lo que básicamente debes tener mucho cuidado con (b). Si debe tener llamadas externas, entonces solo puede usarlas al final de su propia lógica y una vez que se ejecuta la llamada externa, no puede asumir nada sobre el estado de su contrato.

Esto puede verse como una variante de la reentrada, pero es un problema más amplio que la reentrada y más fácil de perder .

Incluso si el otro problema (envío sin marcar y reentrada) no estuviera allí, la tormenta solar por sí sola es suficiente para robar $ 150 millones del DAO.

¿Qué significa esto?

Para resumir:

Pasos siguientes:

Se necesita una revisión completa de todos los contratos inteligentes publicados. También necesitamos un analizador estático para detectar la vulnerabilidad y el compilador Solidity debería detectar este problema. Esta vulnerabilidad aún no se publicita ampliamente y la documentación de Solidity debería advertir a la gente al respecto.

¿Comentarios? Envíelos en Twitter @muneeb . Gracias Philip Daian por los útiles debates y Elizabeth Stark por leer los borradores de esta publicación. Vea mi publicación anterior sobre Ethereum para conocer los desafíos relacionados con el uso de un lenguaje completo de turing.