¿Qué es Cosmos EVM?
Cosmos EVM es una integración de la Ethereum Virtual Machine [EVM] dentro del ecosistema Cosmos, lo que permite ejecutar contratos inteligentes escritos para Ethereum en una blockchain construida sobre Cosmos.
Se trata de una solución plug–and–play que añade compatibilidad y personalización EVM a la cadena Cosmos SDK.
Algunas de sus características:
- Crear una cadena de aplicaciones con el control y la extensibilidad del SDK de Cosmos.
- Soporte nativo para EVM como VM y experiencia de usuario/token/monedero EVM<>Cosmos sin fisuras.
- Aprovecha IBC con EVM, soporte nativo de ERC20 en Cosmos y mucho más con extensiones y precompilaciones.
Descripción de la Vulnerabilidad
Establecer un gas de llamada EVM inferior o más bajo permite a los usuarios ejecutar parcialmente precompilaciones y fallar en puntos específicos del código de precompilación sin revertir el estado parcialmente escrito.
Si se ejecuta en la precompilación de distribución al reclamar fondos, podría causar que los fondos se transfieran a un usuario sin restablecer las recompensas reclamables a 0. La vulnerabilidad también podría ser utilizada para causar una ejecución indeterminada fallando en otros puntos del código, deteniendo los validadores.
Cualquier cadena EVM evmOS o Cosmos que utilice precompilados está afectada.
¿Cómo se ha Parcheado la Vulnerabilidad?
La vulnerabilidad fue parcheada envolviendo cada ejecución de precompilación en una función atómica que revierte cualquier estado parcialmente comprometido en caso de error.
Para las cadenas que utilizan una estructura de archivos diferente, debe aplicar manualmente el diff:
En x/evm/statedb.go añadir la siguiente función:

En x/evm/statedb/journal.go reemplaza la función Revert con esto:

En precompiles/common/precompile.go cambia la firma de la función en HandleGasError a:
func HandleGasError(ctx sdk.Context, contract *vm.Contract, initialGas storetypes.Gas, err *error, stateDB *statedb.StateDB, snapshot snapshot) func() {
…
}
En la función HandleGasError, añada la siguiente línea en la sentencia switch en el caso storetypes.ErrorOutOfGas: case:

añade la siguiente función:

Precompilaciones
Finalmente, en cada precompilación, localice la función Run, y envuelva cada sentencia switch y valores de retorno en p.RunAtomic. Por ejemplo:

Actualmente no existen soluciones para las cadenas que utilizan precompilaciones. Por eso es necesaria una actualización coordinada para solucionar el problema.
Se ha introducido una prueba en la precompilación de la distribución para garantizar que ya no se produzcan escrituras de estado parciales cuando se establece una cantidad de gas inferior.