Inicio / Biblioteca
referencia

Biblioteca de vulnerabilidades de smart contracts

Cada clase de vulnerabilidad explicada, con un ejemplo vulnerable y su versión corregida.

Reentrancy

Una llamada externa hecha antes de actualizar el estado permite a un atacante reentrar en la función antes de decrementar los saldos. Aplica checks-effects-interactions y usa un guard anti-reentrancy.

// vulnerable
function withdraw(uint a) public {
  require(bal[msg.sender] >= a);
  (bool ok,) = msg.sender.call{value:a}("");
  bal[msg.sender] -= a; // too late
}
// fixed
function withdraw(uint a) public nonReentrant {
  require(bal[msg.sender] >= a);
  bal[msg.sender] -= a;                 // effects first
  (bool ok,) = msg.sender.call{value:a}("");
  require(ok);
}

Autenticación con tx.origin

Usar tx.origin para autorización permite que un contrato intermediario actúe en nombre del usuario. Usa msg.sender.

Manipulación de oráculo / precio

Leer un precio spot de una sola pool lo hace manipulable con un swap grande, a menudo financiado con un flash loan. Prefiere un precio medio ponderado por tiempo (TWAP) o un oráculo agregado.

Falta de control de acceso

Una función sensible sin modifier restrictivo puede ser llamada por cualquiera. Protege las funciones privilegiadas con onlyOwner o comprobaciones de rol.

Llamada externa no verificada

Ignorar el valor de retorno de una llamada de bajo nivel deja continuar el contrato tras una transferencia fallida. Comprueba siempre el booleano devuelto.

Fallas de lógica de negocio

Una comparación invertida o un cálculo de cuota erróneo rompe un invariante. Estas fallas son propias del contrato, escapan a los detectores genéricos y suelen ser las más costosas. Describe el comportamiento esperado y compáralo con el código.

¿Quieres practicar explotándolas de forma segura? Ver Aprender. ¿Listo para escanear tu contrato? Abre el escáner.

▶ Abrir el escáner