« Back to Glossary Index

Storage Collision Attack (Ataque de Colisión de Almacenamiento)

⚡ Definición Rápida

Un ataque de colisión de almacenamiento es una vulnerabilidad en contratos inteligentes de Ethereum (y EVM-compatibles) donde un atacante manipula la disposición de las variables de estado para sobrescribir datos críticos del contrato, como el propietario o los balances. Esto ocurre cuando dos variables diferentes se asignan accidentalmente a la misma posición de almacenamiento (slot), permitiendo que un atacante controle o corrompa el estado del contrato.

Términos relacionados: Smart ContractReentrancy AttackDelegate Call AttackStorage SlotSolidity


❓ ¿Qué es un Storage Collision Attack y por qué es peligroso?

Un Storage Collision Attack es un ataque técnico que explota cómo la Ethereum Virtual Machine (EVM) organiza el almacenamiento persistente de un contrato inteligente. A diferencia de ataques como el reentrancy, que explotan la lógica de ejecución, este ataque se enfoca en la capa de datos, forzando que dos variables compartan el mismo slot de almacenamiento, lo que permite a un atacante sobrescribir información crítica.

El peligro radica en su sutileza: no requiere errores evidentes en el código, sino una mala planificación del diseño de almacenamiento, especialmente en sistemas que usan herencia, bibliotecas o patrones de proxy. Un ataque exitoso puede permitir a un atacante tomar el control total de un contrato, robar fondos o deshabilitar funcionalidades esenciales.

Históricamente, el caso más famoso fue el hack de Parity Multisig Wallet en 2017, donde un atacante explotó una colisión de almacenamiento para autodestruir la biblioteca de la billetera, bloqueando permanentemente más de $30 millones en Ether.

📖 Definición Técnica

En la EVM, cada contrato tiene un espacio de almacenamiento de 2²⁵⁶ slots de 32 bytes cada uno. Las variables de estado se asignan a estos slots de forma determinista: las variables estáticas se asignan secuencialmente desde el slot 0, mientras que las variables dinámicas (como mappings o arrays) usan hashing Keccak-256 para calcular su posición.

Un Storage Collision Attack ocurre cuando un atacante puede influir en la posición de almacenamiento de una variable (por ejemplo, proporcionando una clave para un mapping) de manera que coincida con el slot de otra variable crítica. Esto permite sobrescribir datos sensibles, como la dirección del propietario, balances o variables de control.

La vulnerabilidad es especialmente común en patrones de proxy (como ERC-1967 o UUPS) donde el contrato proxy y el contrato de implementación deben tener diseños de almacenamiento perfectamente alineados. Si no lo están, una función en la implementación puede sobrescribir accidentalmente la dirección del proxy, permitiendo que un atacante lo redirija a un contrato malicioso.


🏗️ Mecánica del Ataque: Cómo se Forza una Colisión

El ataque sigue un proceso metódico que aprovecha la naturaleza determinista y pública del almacenamiento de la EVM. Aquí se describen los pasos principales:

PasoDescripciónEjemplo
1. Análisis del ContratoEl atacante estudia el bytecode o código fuente para identificar el diseño de almacenamiento, localizando el slot de variables críticas como owner o balances.Identifica que owner está en el slot 0 y un mapping público userData está en el slot 1.
2. Identificación de Vector de EntradaBusca una función que permita escribir en una variable dinámica (mapping, array) donde la clave o índice sea controlable por el usuario.Encuentra una función setUserData(address user, uint256 value) que escribe en userData[user].
3. Cálculo de la Clave MaliciosaCalcula qué valor de entrada hará que la fórmula de hashing de la EVM para la variable dinámica resulte exactamente en el slot de la variable crítica.Necesita encontrar user tal que keccak256(encodePacked(user, 1)) = 0 (slot del owner).
4. Ejecución de la SobrescrituraLlama a la función legítima con la clave calculada y el valor deseado (por ejemplo, su propia dirección). La EVM escribe este valor en el slot de la variable crítica, corrompiendo el estado.Llama a setUserData(direccionCalculada, suDireccion), sobrescribiendo owner con su dirección.

🎯 Vectores Principales y Ejemplos Concretos

Los Storage Collision Attacks pueden manifestarse de varias formas, dependiendo de la arquitectura del contrato. Aquí se presentan los vectores más comunes:

Vector / ContextoMecanismo de AtaqueEjemplo Concreto
Proxy de Actualización (Upgradeable Proxy)El contrato Proxy y el contrato de implementación tienen diseños de almacenamiento incompatibles. Una función en la implementación escribe en un slot que, en el contexto del Proxy, corresponde a la dirección del Implementation o a datos críticos.Hack de Parity Multisig (2017): Un atacante llamó a initWallet en la biblioteca, sobrescribiendo variables que en el contexto de las billeteras proxy correspondían a propietarios, permitiendo el control total y la autodestrucción de la biblioteca.
Colisión en un Único Contrato con MappingsUn contrato tiene un mapping público y una variable privada crítica. El atacante calcula una clave para el mapping cuyo hash coincide con el slot de la variable privada.Un contrato con address private owner en slot 0 y mapping(address => uint256) public balances en slot 1. El atacante encuentra una dirección addr tal que keccak256(addr, 1) = 0, y escribe su dirección en balances[addr], sobrescribiendo owner.
Problemas con Variables Empaquetadas (Packing)El compilador empaqueta variables pequeñas (como varios uint8) en un solo slot. Si la lógica de actualización no considera los offsets correctamente, puede sobrescribir otras variables en el mismo slot.Un contrato tiene uint8 public flagA; y uint248 public importantData; en el slot 0. Una función que escribe flagA sin considerar el empaquetamiento puede sobrescribir accidentalmente parte de importantData.

🔮 Caso de Estudio: El Hackeo de Parity Multisig Wallet (2017)

Este incidente, que resultó en la pérdida de **$30 millones de dólares en Ether**, es el ejemplo más icónico y educativo de un ataque de colisión de almacenamiento explotado a gran escala.

La Arquitectura Vulnerable:

Parity utilizaba un patrón de contrato biblioteca para sus billeteras multisig. Existía:

  • Un contrato WalletLibrary (el Implementation): Contenía la lógica de la billetera.
  • Muchos contratos de billetera individuales (los Proxies): Cada billetera de usuario era un contrato ligero que, a través de DELEGATECALL, delegaba toda su lógica al WalletLibrary.

El error fatal fue que el contrato WalletLibrary **no estaba destinado a ser inicializado como una billetera independiente**, pero tenía una función initWallet accesible públicamente.

La Explotación:

1. El atacante llamó a initWallet en el propio contrato WalletLibrary.

2. Esta función escribió en las posiciones de almacenamiento que *para el contrato biblioteca* estaban destinadas a almacenar los propietarios de la billetera.

3. Sin embargo, en el diseño de almacenamiento esperado por los contratos proxy de billetera, esas mismas posiciones de almacenamiento correspondían a **otras variables**.

4. Al cambiar estas variables, el atacante se declaró a sí mismo como el dueño del contrato WalletLibrary.

5. Luego, llamó a una función kill en la biblioteca, que, debido a la modificación del estado, autorizó al atacante a autodestruirla (selfdestruct).

6. **Todas las billeteras multisig (cientos de ellas) que dependían de esta biblioteca se volvieron inoperativas instantáneamente**, y los fondos en las que no habían sido inicializadas con un método específico pudieron ser drenados por el atacante.

La Lección:

El ataque no fue un hack directo a las claves privadas, sino una **manipulación del estado del contrato base** que toda una arquitectura de contratos asumía como inmutable e inocuo. Expuso los peligros críticos de los patrones de proxy y la delegación (DELEGATECALL) cuando el diseño de almacenamiento no está perfectamente aislado y protegido.


⚙️ Defensas y Mejores Prácticas de Diseño

Tras incidentes como el de Parity, la comunidad desarrolló estándares y prácticas robustas para prevenir colisiones de almacenamiento.

1. Uso de Patrones de Proxy Estandarizados y Probados:

  • ERC-1967 (Proxy Pattern Standard): Define slots específicos y estandarizados para almacenar la dirección de la implementación y otros datos del administrador, usando hashing de constantes para evitar colisiones. Ej: bytes32 internal constant _IMPLEMENTATION_SLOT = bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1);
  • Transparent Proxy vs UUPS (EIP-1822): Patrones que separan claramente la lógica de proxy y de implementación. En UUPS, la lógica de actualización está *dentro* del contrato de implementación, forzando una coherencia explícita.
  • Herramientas como OpenZeppelin Upgrades Plugins: Estas librerías y plugins realizan comprobaciones automáticas de colisión de almacenamiento durante el desarrollo y el despliegue, comparando el diseño de almacenamiento entre versiones.

2. Diseño de Almacenamiento Inmutable y Aislado:

  • Contratos de Almacenamiento (Storage Contracts): Un patrón donde todas las variables de estado se declaran en un contrato base abstracto. Tanto el Proxy como la Implementation heredan de este contrato, garantizando una **alineación perfecta y explícita** del diseño de almacenamiento.
  • Evitar Variables Públicas no Constantes en Contratos Implementación de Proxies: Las variables públicas en la implementación pueden tener getters automáticos que colisionen con funciones del proxy.

3. Prácticas Generales de Seguridad en Smart Contracts:

  • Auditorías Exhaustivas: Una auditoría de seguridad profesional siempre debe revisar el diseño de almacenamiento, especialmente en sistemas que usan proxies, herencia compleja o assemblies de bajo nivel.
  • Inicializadores en lugar de Constructores: En contratos upgradeable, usar funciones initialize con modificadores initializer para establecer el estado inicial, ya que los constructores no funcionan como se espera en el contexto de un proxy.
  • Minimizar el uso de delegatecall: Es una operación poderosa pero peligrosa. Restringir su uso a patrones estandarizados y bien auditados.

📊 Comparativa: Storage Collision vs. Otros Ataques a Contratos

AspectoStorage Collision AttackReentrancy AttackOracle Manipulation Attack
Capa PrincipalNivel de Lenguaje/Compilador y Diseño de Datos.Nivel de Lógica de Negocio y Secuencia de Ejecución.Nivel de Integración Externa y Fuentes de Datos.
ObjetivoCorromper el estado interno del contrato (variables).Robar fondos mediante llamadas recursivas antes de actualizar el estado.Alimentar datos falsos para alterar cálculos financieros.
Prevención PrimariaDiseño de almacenamiento robusto, patrones de proxy seguros, herramientas de verificación.Patrón Checks-Effects-Interactions, uso de reentrancy guards.Oracles descentralizados, uso de TWAPs, circuit breakers.
Complejidad de ExplotaciónMedia-Alta (requiere análisis técnico profundo y/o cálculos específicos).Media (la lógica es comprensible, pero requiere una vulnerabilidad clara).Variable (desde baja con oráculos centralizados hasta muy alta con oráculos robustos).
Ejemplo HistóricoParity Multisig Hack (2017).The DAO Hack (2016).Mango Markets Exploit (2022).

🎯 Conclusión: Un Ataque Sutil con Consecuencias Catastróficas

El ataque de colisión de almacenamiento enseña una lección fundamental: en el desarrollo de contratos inteligentes para DeFi y otros sistemas críticos, **no se puede dar por sentado ni el compilador ni las estructuras de datos subyacentes**. La seguridad debe extenderse a la capa de organización de la memoria.

Para los diferentes roles en el ecosistema:

  • 🔍 Para Desarrolladores de Contratos Inteligentes: **Nunca diseñes un sistema de proxy o herencia compleja desde cero**. Usa estándares de la industria probados y luchados como los de OpenZeppelin. Entender el layout de almacenamiento de la EVM no es un conocimiento opcional; es esencial. Utiliza siempre el plugin de upgrades para comprobaciones automáticas.
  • ⚠️ Para Auditores de Seguridad: Este vector debe ser parte de cualquier checklist de auditoría, especialmente para protocolos upgradeable. Verificar la alineación del almacenamiento entre versiones y en patrones de proxy es crítico.
  • 💡 Para Proyectos y DAOs: Al aprobar una actualización de contrato, exigir un informe que incluya una **verificación formal o una explicación detallada de la compatibilidad del diseño de almacenamiento**. No confíes únicamente en que «el código se compila».
  • 🧠 Para Usuarios e Inversores: Al interactuar con protocolos complejos, especialmente aquellos que anuncian capacidad de actualización («upgradeable»), investiga si han sido auditados por firmas reputadas que revisen estos vectores. Un buen recurso para entender los riesgos generales es nuestra guía de estafas comunes, aunque este ataque es más técnico.

❓ Preguntas Frecuentes sobre Storage Collision Attack


🚀 ¿Quieres Profundizar?

Explora más sobre los fundamentos de Ethereum y la seguridad de contratos:

🔗 ¿Qué es Blockchain? – La tecnología base que hace posibles los contratos inteligentes.

¿Qué es DeFi? – El ecosistema donde los contratos upgradeable y complejos son más comunes.

🛡️ Guía de Seguridad Crypto – Principios generales para navegar el espacio de forma segura.

🔷 ¿Cómo auditar un token? – Aprende a identificar vulnerabilidades técnicas en contratos.

💡 ¿Qué es una DAO? – Muchas DAOs utilizan contratos gobernanza upgradeable que deben protegerse de estos ataques.

⚖️ Ataque de Manipulación del Tiempo – Otro ataque de bajo nivel que explota propiedades fundamentales de la EVM.


📚 ¿Desarrollando Contratos Inteligentes Avanzados?

Construye sobre una base de conocimiento sólida. Comienza con nuestra guía completa gratuita para principiantes y luego especialízate con nuestra serie Cryptopedia para entender y mitigar los vectores de ataque más complejos, como la colisión de almacenamiento.

📋 ¿Por qué confiar en esta definición? Cada término de la Cryptopedia sigue una metodología de verificación con fuentes primarias, whitepapers y legislación oficial. Conoce nuestro proceso →



⚠️ Descargo de responsabilidad: Este artículo es informativo y educativo. No constituye asesoramiento de seguridad, de desarrollo de software o financiero. Los ataques de colisión de almacenamiento son un vector técnico avanzado. La seguridad de los contratos inteligentes es un campo complejo y en evolución. Siempre busca auditorías profesionales de múltiples firmas, utiliza bibliotecas y herramientas estandarizadas y prueba exhaustivamente en entornos de testnet antes de cualquier despliegue en mainnet. El ejemplo de Parity muestra que un solo error de diseño puede tener consecuencias devastadoras y sistémicas.

📅 Actualizado: Marzo 2026
📖 Categoría: Seguridad y Riesgos / Auditoría y Smart Contracts

« Volver al Glosario
Scroll al inicio