Deneal of service (Dos)
La importancia de la seguridad en los smart contracts. Qué es la vulnerabilidad Deneal of service y como solucionarla.
Los ataques de denegación de servicio (DoS) son una forma de ciberataque en el que un atacante busca hacer que un recurso de computadora o red no esté disponible para sus usuarios previstos, interrumpiendo los servicios de un host conectado a Internet. En el contexto de Solidity, lenguaje de programación utilizado para escribir contratos inteligentes en Ethereum, estos ataques pueden tomar diversas formas, como puede ser el límite de gas alcanzado, el lanzamiento inesperado, el suicidio inesperado y el control de acceso roto.
-Límite de Gas: Cada contrato inteligente en Ethereum tiene un tope de gas que puede gastar. Es la cantidad máxima de cálculos que se pueden realizar antes de que se detenga la ejecución del contrato. Si un contrato consume más gas que ese límite, lanzará una excepción y dejará de ejecutarse. Esto puede ser explotado por un atacante para lanzar un ataque DoS enviando transacciones al contrato con un alto consumo de gas, lo que hace que el contrato lance una excepción quedando bloqueado para los demás.
Para prevenirlo, es importante analizar cuidadosamente el consumo de gas de las funciones de contrato y establecer el límite de gas de manera adecuada. Se podría usar la palabra clave «gas» de Solidity para especificar el consumo máximo de gas para funciones individuales. Por ejemplo:
function pruebaGas(uint256 x) public payable gas(500000) {
// aqui iría el cuerpo de la función
}
En este ejemplo, la función «pruebaGas» se define con un consumo máximo de gas de 500,000. Si un atacante intenta llamar a esta función con una transacción que consume más de 500,000 gas, la transacción fallará y el contrato no terminará afectado.
– Lanzamiento inesperado: Este es un tipo de ataque DoS en el que un atacante hace que un contrato lance una excepción proporcionando una entrada inesperada al contrato. Esto se puede hacer llamando a una función de contrato con el número o tipo incorrecto de argumentos, o llamando a una función con una entrada maliciosa que hace que el contrato lance una excepción. Para prevenirlo hay que intentar usar los mayor cantidad de mecanismos de manejo de errores posible, para asegurar que las funciones del contrato solo puedan ser llamadas con una entrada válida. Por ejemplo:
function pruebaEntrada(uint256 x) public {
require(x > 0, «x debe ser positivo»);
// resto de la función
}
En este ejemplo, la declaración «require» verifica que el valor de entrada «x» sea positivo antes de ejecutar el resto de la función. Si «x» no es positivo, la función lanzará una excepción y dejará de ejecutarse. Es un paso sencillo pero que evita grandes problemas.
– Suicidio inesperado: Es un tipo de ataque DoS en el que hace que un contrato se autodestruya, o «se suicida», llamando a la función selfdestruct del contrato. Esto puede ser hecho por cualquier atacante que simplemente conozca la dirección del contrato. Para prevenir este tipo de ataque, se deben implementar medidas de control de acceso para restringir la capacidad de llamar a la función selfdestruct solo a usuarios autorizados.
Y aquí hay una versión segura que solo permite a los propietarios llamar a selfdestruct:
En este ejemplo, la función asesina solo puede ser llamada por un usuario autorizado. Esto se logra utilizando un «modifier onlyMultiSig» , que verifica que el llamador de la función (identificado por la variable «msg.sender») esté dentro de los usuarios aprobados. Si el llamador no está en la lista, la función lanzará una excepción y dejará de ejecutarse.
– Control de acceso roto. Es una medida de seguridad utilizada en contratos inteligentes para restringir el acceso a ciertas funciones o variables a ciertos usuarios. Si un atacante es capaz de violar este control de acceso y obtener acceso a funciones o variables restringidas, podrían ser capaces de manipular el contrato de una manera que haga que se comporte de manera inesperada, que puede producir una denegación de servicio, DoS.Para prevenir este tipo de ataque, hay que usar de modo adecuado las palabras clave de control de acceso de Solidity (como «private», «internal» y «public») para especificar la visibilidad de las funciones y variables.
Ejemplo de violación del control de acceso:
En este contrato, la función getSecretValue es «internal» (también podría ser «private», con una restricción aún mayor), y solo puede ser leída de modo interno, sin acceso exterior. Si el llamador intenta acceder a la función, no podrá.
En conclusión, los ataques de denegación de servicio (DoS) son una preocupación seria en el desarrollo de contratos inteligentes en Solidity. Sin embargo, hay varias estrategias que los desarrolladores pueden usar para prevenir estos ataques, incluyendo la gestión cuidadosa del consumo de gas, validación de entradas, la implementación de medidas de control de acceso, y la restricción de la visibilidad de las funciones y variables. Al seguir estas prácticas, aumenta la protección de los contratos inteligentes contra los ataques DoS y se asegura que sean seguros y eficientes.
También puedes ver este mismo artículo en Linkedin aqui