Los dos primeros exploits conocidos contra circuitos ZK en vivo acaban de ocurrir, y no fueron errores sutiles de subrestricción. Eran verificadores Groth16 desplegados sin completar la ceremonia de configuración de confianza. Uno fue rescatado por un sombrero blanco por aproximadamente ~$1.5M, el otro drenado por 5 ETH. 🧵
Ambos protocolos utilizaron Circom + snarkjs, la pila más común para implementaciones de Groth16. ¿El error? Se saltaron la Fase 2 de la configuración de confianza: el paso de contribución específico del circuito. Sin ello, los parámetros γ y δ de la clave de verificación se establecen ambos al mismo valor: el generador G2.
¿Por qué γ = δ rompe todo? Comprobaciones de verificación de Groth16: e(-A, B) · e(α, β) · e(vk_x, γ) · e(C, δ) = 1 Cuando γ = δ, un atacante puede establecer C = -vk_x para cancelar ambos términos, luego establecer A = α, B = β para cancelar el resto. La ecuación se convierte en 1 · 1 = 1. No se necesita testigo.
El Protocolo Foom (~$1.4M) era una dApp de lotería en Base y Ethereum. Un rescate de whitehat por @duha_real y otro whitehat independiente drenaron los contratos antes de que un actor malicioso pudiera, utilizando pruebas falsificadas para extraer el 99.97–99.99% de los tokens.
El Protocolo Veil (~$5K) fue un fork de Tornado Cash en Base. Un atacante drenó toda la piscina en una transacción, 29 retiros falsificados utilizando anuladores ficticios como 0xdead0000, extrayendo el saldo completo de 2.9 ETH de la piscina.
Esto es snarkjs funcionando como se diseñó. Cuando ejecutas groth16 setup, inicializa γ y δ al generador G2 como un marcador de posición. Se espera que ejecutes zkey contribute para aleatorizar δ. Si omites ese paso, tu verificador aceptará cualquier prueba.
La parte aterradora: no fue un fallo criptográfico profundo ni un error sutil en el circuito. Fue un error de implementación: faltaba un comando de CLI. Y estuvo en producción con fondos reales en riesgo.
conclusiones: - Siempre revisa los scripts de despliegue, no solo el código del circuito - Verifica tus claves de verificación: si vk_gamma_2 == vk_delta_2, tus pruebas son falsificables - Trabajamos con @DedaubSecurity para escanear cadenas EVM en busca de otros contratos afectados, no se encontraron de alto valor, pero existen algunos
4,16K