Back to Blog

Incidente de Seguridad en Seal Finance

Code Auditing
January 3, 2021
5 min read

El 30 de noviembre, nuestro sistema de monitoreo de incidentes de seguridad ThunderForecast descubrió un ataque al protocolo Loopring (Blog en EN, CN) mediante el escaneo de transacciones históricas en Ethereum. En conclusión, la causa raíz de este ataque es la falta de control de acceso en la función sellTokenForLRC. El atacante se aprovechó de 80,97 ETH, equivalente a 48.849,2 USD según el precio en ese momento.

El 11 de diciembre de 2020, nuestro sistema de monitoreo ThunderForecast reportó una serie de transacciones con una tasa de intercambio anormal. Luego, utilizamos el sistema EthScope desarrollado por nuestro equipo de investigación para analizar estas transacciones y descubrimos que se trata de un ataque que aprovecha una vulnerabilidad del Protocolo Seal Finance con fines de arbitraje.

¿Qué es Seal?

Mencionado en el whitepaper de Seal: "SEAL - Un protocolo experimental que actúa como intermediario entre los principales tokens de protocolo DeFi, creando mayor liquidez entre ellos". Hasta ahora, existen más de 10 pools de liquidez que conectan Seal con otros tokens conocidos (como UNI, YFI, USDT, SNX y otros). Para obtener el bono, el inversor debe depositar tokens LP en el contrato de recompensas SEAL y activar la función breed() en el contrato Farm para producir nuevos tokens SEAL. El contrato Farm se despliega en cada pool de Seal y la función breed() en el contrato se utiliza para emitir nuevos tokens Seal. Según la configuración de breed(), emite un 1,6% adicional de tokens Seal. Además, el 0,8% de los tokens Seal emitidos se intercambia por otro token que se deposita en el pool junto con el otro 0,8% de los tokens Seal emitidos como liquidez. Sin embargo, dado que no existe ningún control de acceso diseñado para la función breed(), cualquiera puede activar esta función y este diseño primitivo se convierte en la causa raíz del ataque reportado.

El siguiente es el código fuente confirmado de la función breed():

function breed() external {
	require(now / 1 days > today);
	today += 1;
 
	uint256 sealPairAmount = seal.balanceOf(address(cSeal));
	uint256 tokenPairAmount = token.balanceOf(address(cSeal));
	uint256 newSeal = sealPairAmount.mul(spawnRate).div(1e18);
	uint256 amount = UniswapV2Library.getAmountOut(newSeal, sealPairAmount, tokenPairAmount);
 
	seal.mint(address(cSeal), newSeal);
	if(address(seal) < address(token))
    	cSeal.swap(0, amount, address(this), "");
	else
    	cSeal.swap(amount, 0, address(this), "");
	token.transfer(address(cSeal), amount);
	seal.mint(address(cSeal), newSeal);
	cSeal.mint(address(this));
}

Detalles

Ahora comenzamos a revelar más detalles de este ataque con una transacción de ataque. En esta transacción, el atacante repite la lógica de ataque en 10 pools de Seal para maximizar sus ganancias. En el siguiente análisis, nos centramos en el ataque lanzado en el pool Seal-SNX.

Hay tres pasos involucrados:

  • Paso 1: Intercambiar 1.084 Seal por 2.787 SNX en el pool Seal-SNX. La tasa de intercambio es: 1 Seal = 2,57 SNX.
  • Paso 2: Activar la función breed() en el contrato Farm. Esta función emite 13,08 Seal y los intercambia por 10,20 SNX. La tasa de intercambio ahora es: 1 SNX = 0,78 Seal. La razón es que la mayor parte del SNX en el pool se intercambia por Seal y provoca una gran diferencia entre SNX y Seal en términos de cantidad. Luego, según el algoritmo de cálculo de precios de Uniswap, el SNX se vuelve extremadamente valioso (el precio aumenta más de 3 veces) en el pool.
  • Paso 3: Intercambiar 2787 SNX por 1100 Seal en el pool Seal-SNX. Dado que el intercambio aumenta aún más el precio del SNX, el atacante obtiene más tokens Seal por arbitraje (extra 16 Seal).

Para medir y confirmar la pérdida de manera más precisa, reprodujimos la función breed() bajo el estado del bloque anterior al ataque, utilizando nuestro sistema EthScope. Como resultado, Farm emitió 18 tokens Seal adicionales en comparación con una invocación normal. El atacante obtuvo 16 Seal y solo 2 Seal quedaron en el pool.

Ganancia y Pérdida

En esta transacción, el atacante obtiene un total de 175 Seal.

La Escala del Ataque

Hasta el 13 de diciembre de 2020, hay 3 contratos maliciosos (0x49f93e, 0x8b3710, 0x0f20b6) desplegados en la cadena y 22 transacciones se han lanzado exitosamente para robar 4.247 tokens Seal. Según el precio en ese momento, el atacante gana aproximadamente 58.467 USD aprovechando la vulnerabilidad del protocolo Seal. Vale la pena mencionar que ¡la vulnerabilidad del protocolo Seal sigue siendo objeto de ataques!

Además, al analizar el flujo de los tokens Seal obtenidos, descubrimos que alrededor de 900 tokens Seal se depositan en DEX y el resto se distribuye en 6 direcciones diferentes. Como se muestra en la siguiente figura, esas direcciones son todas los principales poseedores de tokens Seal, además de Seal Finance y el pool de liquidez en Uniswap V2.

Conclusión

Con el desarrollo del ecosistema DeFi en Ethereum, diversos problemas de seguridad van surgiendo gradualmente. De hecho, la causa raíz, que es el control de acceso, detrás del ataque genera una pérdida considerable (58.467 USD) en Seal mediante el lanzamiento de 22 transacciones hasta el 13 de diciembre de 2020.

Actualización (2021/01/04)

Tras el primer ataque el 30/11 de 2020, el atacante ha desplegado un tercer contrato de ataque y ha lanzado cinco ataques. El último ataque fue el 24/12 de 2020 y transfirió los tokens Seal obtenidos a esta dirección. Durante este proceso, el atacante obtuvo 6.021 tokens Seal.

Cronología:

  • 2020/12/11: Se detectaron transacciones sospechosas
  • 2020/12/12: Se completó el análisis
  • 2020/12/13: Se informó a Seal Finance
  • 2021/01/03: Se publicaron los detalles
  • 2021/01/03: Se asignó CVE-2021–3006

Sobre BlockSec

BlockSec es una empresa pionera en seguridad blockchain establecida en 2021 por un grupo de expertos en seguridad de renombre mundial. La empresa está comprometida con mejorar la seguridad y la usabilidad del emergente mundo Web3 para facilitar su adopción masiva. Con este fin, BlockSec ofrece servicios de auditoría de seguridad de contratos inteligentes y cadenas EVM, la plataforma Phalcon para el desarrollo de seguridad y el bloqueo proactivo de amenazas, la plataforma MetaSleuth para el rastreo e investigación de fondos, y la extensión MetaSuites para que los desarrolladores de web3 naveguen eficientemente en el mundo cripto.

Hasta la fecha, la empresa ha prestado servicios a más de 300 distinguidos clientes como MetaMask, Uniswap Foundation, Compound, Forta y PancakeSwap, y ha recibido decenas de millones de dólares en dos rondas de financiamiento de inversores prominentes, entre ellos Matrix Partners, Vitalbridge Capital y Fenbushi Capital.

Sitio web oficial: https://blocksec.com/

Cuenta oficial de Twitter: https://twitter.com/BlockSecTeam

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit