Según un reciente estudio, al menos un 0,36% de los contratos de la red Ethereum son vulnerables a fallas de error humano, lo cual, pese al poco porcentaje, podría llegar a causar pérdidas millonarias.
En este estudio, titulado “Finding The Greedy, Prodigal, and Suicidal Contracts at Scale“ (Encontrando los contratos codiciosos, pródigos y suicidas a escala) y realizado por los investigadores Ivica Nicolic, Aashish Kolluri, Ilya Sergey, Prateek Saxena, y Aquinas Hobor de la University College London y la Escuela de Computación de la Universidad Nacional de Singapur, se analizaron casi 1 millón de contratos de Ethereum, de los cuales 3.686 fueron diagnosticados con potenciales fallas que podrían ser causadas por error humano, lo que indica que aproximadamente un 0,36% de los contratos de la red pueden presentar vulnerabilidades.
Para lograr esto, se realizó una bifurcación privada de esta blockchain, evitando conectar terceros que se encuentren en la red original. De esta forma, se logró obtener la muestra de contratos para este estudio.
Implementamos MAIAN, la primera herramienta para especificar precisamente y razonar sobre las propiedades de rastreo, que emplea análisis simbólico inter-procedimiento y validación concreta para exhibir vulnerabilidades reales. Nuestro análisis de casi un millón de contratos señala 34.200 (2.365 distintos) contratos vulnerables, a diez segundos por contrato. En un subconjunto de 3.759 contratos que hemos muestreado para la validación concreta y manual análisis, reproducimos exploits reales a una tasa positiva real del 89%, produciendo exploits por 3.686 contratos.
Ivica Nicolic, Aashish Kolluri, Ilya Sergey, Prateek Saxena, y Aquinas Hobor
Las fallas posibles fueron clasificadas en tres categorías: primero están los Contratos Pródigos (Prodigal Contracts), que son aquellos que pueden ser manipulados para modificar la dirección de la cartera a la cual se deben enviar los fondos; en segundo lugar están los Contratos Suicidas (Suicidal Contracts), los cuales pueden ser terminados por un ataque externo llevado a cabo por un tercero; y, finalmente, están los Contratos Codiciosos (Greedy Contracts), que son los que se pueden manipular para bloquear los fondos contenidos en ellos. Como estos sistemas tienden a utilizar varios contratos, incidentes de este tipo pueden involucrar fallas de más de una de las categorías anteriormente mencionadas.
Ejemplo de ello fue el caso de Parity, ya que el pasado noviembre un bug accidentalmente congeló cerca de 150 millones de dólares en ether cuando un usuario lo activó accidentalmente. Esto se podría considerar un contrato suicida, pero dado que sus carteras dejaron bloqueados los fondos, estas pueden considerarse codiciosas. Al día de hoy, estos fondos continúan congelados.
Para la muestra de contratos usada en este estudio, la cantidad de Ether (ETH) que pudieron haberse extraído o bloqueado desde contratos pródigos y suicidas es de 4.905 ETH (más de 4 millones de dólares). Adicionalmente, unos 6.239 ETH (más de 5 millones de dólares) se encuentran atrapados dentro de contratos póstumos, los cuales son contratos que ya fueron terminados o que no poseen código, de los cuales 313 ETH fueron enviados a contratos que ya habían sido terminados. Después de que un contrato es terminado, ya no se puede ejecutar su código en la blockchain, pero todos los contratos terminados pueden seguir recibiendo transacciones, aunque estas ya no puedan invocar el código de estos contratos, por ello los tokens enviados a contratos ya terminados son bloqueados indefinidamente.
La red de Ethereum utiliza un lenguaje de programación llamado Solidity, el cual se creó apenas en 2014 y fue hecho con la intención de volver más seguros a los contratos inteligentes. Al ser este un lenguaje novedoso, algunos programadores no están acostumbrados a él y esto puede llevar a fallas de error humano en la programación de los contratos inteligentes. Sin embargo, este proceso de adaptación es necesario para que la red siga creciendo, y a medida que los programadores se acostumbren a Solidity las fallas de esta naturaleza deberían disminuir.
Cuando errores de este tipo ocurren y se pierde una cantidad importante de fondos, una de las soluciones posibles es realizar una bifurcación fuerte (hardfork) de la red de Ethereum, creando así una actualización de la misma red pero sin el error. Sin embargo, esto sólo ocurrió una vez tras los eventos del robo de los fondos del DAO de Slock.it, lo cual desembocó por diferencias ideológicas en la creación del Ethereum Classic. Generalmente propuestas de esta naturaleza tienden a encontrar bastante resistencia, pues se considera que se traiciona el ideal de descentralización.
Sin embargo, existen otras formas de abordar estos problemas. Estudios como este, acompañados de monitoreos y de un sistema de auditoría para estos programas pueden ayudar a detectar errores y fallas potenciales antes de que estos ocurran. También se podría crear una biblioteca de contratos cuyo funcionamiento ya ha sido verificado, lo que puede facilitar el trabajo de los programadores y reducir el riesgo de fallas. Asimismo, Ethereum podría aplicar interfaces más amigables con el usuario, lo que reduciría el riesgo de fallas.