Informe de auditoría de contratos inteligentes para Dimo

Resumen de gestión

Dimo se puso en contacto con Sayfer para realizar una auditoría de seguridad de su contrato inteligente.

Este informe documenta la investigación realizada por Sayfer dirigida a los recursos seleccionados definidos bajo el alcance de la investigación. En particular, este informe muestra la revisión de la postura de seguridad del contrato inteligente de Dimo.

Durante el período de investigación de 40 horas de investigación, descubrimos 14 vulnerabilidades en el contrato. Ninguno de ellos es crítico.

En conclusión, se deben implementar varias correcciones después del informe, pero la postura de seguridad del sistema es competente.

Después de una revisión por parte del equipo de Sayfer, certificamos que todos los problemas de seguridad mencionados en este informe han sido abordados por el equipo de Dimo.

Metodología de Riesgo

En Sayfer, estamos comprometidos a ofrecer auditorías de contratos inteligentes de la más alta calidad a nuestros clientes. Es por eso que hemos implementado un modelo integral de evaluación de riesgos para evaluar la gravedad de nuestros hallazgos y brindar a nuestros clientes las mejores recomendaciones posibles para la mitigación.

Nuestro modelo de evaluación de riesgos se basa en dos factores clave: IMPACTO y PROBABILIDAD. El impacto se refiere al daño potencial que podría resultar de un problema, como pérdidas financieras, daños a la reputación o un sistema no operativo. La probabilidad se refiere a la probabilidad de que ocurra un problema, teniendo en cuenta factores como la complejidad del contrato y la cantidad de atacantes potenciales.

Al combinar estos dos factores, podemos crear una comprensión integral del riesgo que plantea un problema en particular y brindar a nuestros clientes una evaluación clara y procesable de la gravedad del problema. Este enfoque nos permite priorizar nuestras recomendaciones y garantizar que nuestros clientes reciban el mejor asesoramiento posible sobre cómo proteger sus contratos inteligentes.

El riesgo se define de la siguiente manera:

Vulnerabilidades por Riesgo

Alta – Amenaza directa a los procesos clave del negocio.
Medio – Amenaza indirecta a los procesos comerciales clave o amenaza parcial a los procesos comerciales.
Baja – No existe amenaza directa. La vulnerabilidad puede explotarse utilizando otras vulnerabilidades.
Informativo – Este hallazgo no indica vulnerabilidad, pero establece un comentario que notifica sobre fallas de diseño e implementación incorrecta que podría causar un problema a largo plazo.

Gravedad
# de problemas
Alta
3
Medio
1
Baja
5
Informativo
5
Critical
0

Enfoque

Introducción

Dimo se puso en contacto con Sayfer para realizar una auditoría de seguridad de su contrato inteligente.

Este informe documenta la investigación realizada por Sayfer dirigida a los recursos seleccionados definidos en el ámbito de la investigación. En particular, este informe muestra la revisión de la postura de seguridad para los contratos antes mencionados.

Descripción general del alcance

Junto con el equipo del cliente definimos el siguiente contrato como alcance del proyecto.
Commit hash: 14ce58aa499e3672fb0b61da13948a6ea51fb879

 

Contrato Sha-256
Recompensa.sol 86cffc0108ebe977ac55650da60cccc5f790013332186a2cb4dab47d7d38ac87

 

Nuestras pruebas se realizaron en enero de 2024.

¡No dejes que sea demasiado tarde!

Comienza tu auditoría con Sayfer

Validación del alcance

Comenzamos por asegurarnos de que el alcance que nos definiera el cliente fuera técnicamente lógico.
Decidir qué alcance es el adecuado para un sistema dado es parte de la discusión inicial.

Modelo de amenaza

Definimos que la mayor amenaza actual para el sistema es la capacidad de usuarios malintencionados de robar fondos del contrato.

¡No dejes que sea demasiado tarde!

Comienza tu auditoría con Sayfer

Descripción general del protocolo

Introducción al protocolo

DIMO es una empresa de IoT web3 que permite a los usuarios y desarrolladores aprovechar el rico flujo de datos generados por los vehículos modernos. Su solución es un ecosistema propiedad del usuario que permite a los conductores obtener beneficios económicos de sus datos y hacer posibles aplicaciones como seguros paramétricos, uso compartido de automóviles entre pares y mercados de vehículos. La plataforma descentralizada también brinda tranquilidad a los desarrolladores, sabiendo que su acceso a los datos no está sujeto a los caprichos de un guardián centralizado. Esta solución se basa en Polygon.

Evaluación de seguridad

Los siguientes casos de prueba fueron la pauta durante la auditoría del sistema. Esta lista de verificación es una versión modificada de la SCSVS v1.2, con gramática mejorada, claridad, concisión y criterios adicionales. Donde hay una brecha en la numeración, se eliminó un criterio original. Los criterios que están marcados con un asterisco fueron agregados por nosotros.

Arquitectura, Diseño y Modelado de Amenazas

Arquitectura, Diseño y Modelado de Amenazas Nombre de la prueba
G1.2 Cada cambio de diseño introducido está precedido por el modelado de amenazas.
G1.3 La documentación define de forma clara y precisa todos los límites de confianza en el contrato (relaciones de confianza con otros contratos y flujos de datos significativos).
G1.4 El SCSVS, los requisitos de seguridad o la política están disponibles para todos los desarrolladores y probadores.
G1.5 Se definen los eventos para las operaciones (cambio de estado/crucial para el negocio).
G1.6 El proyecto incluye un mecanismo que puede detener temporalmente funcionalidades sensibles en caso de un ataque. Este mecanismo no debe bloquear el acceso de los usuarios a sus activos (por ejemplo, tokens).
G1.7 La cantidad de criptomonedas no utilizadas mantenidas en el contrato está controlada y en el nivel mínimo aceptable para no convertirse en un objetivo potencial de un ataque.
G1.8 Si cualquier persona puede llamar a la función de reserva, se incluye en el modelo de amenazas.
G1.9 La lógica de negocios es consistente. Los cambios importantes en la lógica deben aplicarse en todos los contratos.
G1.10 Se emplean herramientas automáticas de análisis de código para detectar vulnerabilidades.
G1.11 Se utiliza la versión principal más reciente de Solidity.
G1.12 Cuando se utiliza una implementación externa de un contrato, se utiliza la versión más reciente.
G1.13 Cuando las funciones se anulan para ampliar la funcionalidad, la palabra clave super se utiliza para mantener la funcionalidad anterior.
G1.14 El orden de la herencia se especifica cuidadosamente.
G1.15 Hay un componente que monitorea la actividad del contrato usando eventos.
G1.16 El modelo de amenaza incluye transacciones de ballenas.
G1.17 La fuga de una clave privada no compromete la seguridad de todo el proyecto.

Pólizas y Procedimientos

Pólizas y Procedimientos Nombre de la prueba
G2.2 La seguridad del sistema está bajo control constante (por ejemplo, el nivel esperado de fondos).
G2.3 Existe una política para rastrear nuevas vulnerabilidades de seguridad y actualizar las bibliotecas a la última versión segura.
G2.4 Se puede contactar públicamente al departamento de seguridad y que el procedimiento para manejar los errores informados (p. ej., una recompensa completa por errores) esté bien definido.
G2.5 El proceso de agregar nuevos componentes al sistema está bien definido.
G2.6 El proceso de cambios importantes en el sistema implica el modelado de amenazas por parte de una empresa externa.
G2.7 El proceso de adición y actualización de componentes al sistema incluye una auditoría de seguridad por parte de una empresa externa.
G2.8 En caso de que se produzca un ataque, existe un procedimiento de mitigación claro y bien conocido.
G2.9 El procedimiento en caso de hackeo define claramente qué personas deben ejecutar las acciones requeridas.
G2.10 El procedimiento incluye alertar a otros proyectos sobre el hackeo a través de canales confiables.
G2.11 Se define un procedimiento de mitigación de fugas de clave privada.

Capacidad de actualización

Capacidad de actualización Nombre de la prueba
G3.2 Antes de actualizar, se realiza una emulación en una bifurcación de la red principal y todo funciona como se espera en la copia local.
G3.3 El proceso de actualización se ejecuta mediante un contrato multisig donde más de una persona debe aprobar la operación.
G3.4 Los bloqueos de tiempo se utilizan para operaciones importantes para que los usuarios tengan tiempo de observar los próximos cambios (tenga en cuenta que eliminar posibles vulnerabilidades en este caso puede ser más difícil).
G3.5 inicializar() solo se puede llamar una vez.
G3.6 inicializar() solo puede ser llamado por un rol autorizado a través de modificadores apropiados (por ejemplo, inicializador, solo propietario).
G3.7 El proceso de actualización se realiza en una sola transacción para que nadie pueda adelantarlo.
G3.8 Los contratos actualizables tienen espacios reservados en las ranuras para evitar la sobrescritura.
G3.9 El número de espacios reservados (como un espacio) se ha reducido adecuadamente si se han agregado nuevas variables.
G3.10 No hay cambios en el orden en que se declaran las variables de estado del contrato, ni en sus tipos.
G3.11 Los nuevos valores devueltos por las funciones son los mismos que en versiones anteriores del contrato (por ejemplo, propietario(), saldoDe(dirección)).
G3.12 Se inicializa la implementación.
G3.13 La implementación no puede ser destruida.

 

Lógica de negocios

Lógica de negocios Nombre de la prueba
G4.2 La implementación de la lógica del contrato y los parámetros del protocolo corresponde a la documentación.
G4.3 La lógica empresarial procede en un orden de pasos secuenciales y no es posible omitir pasos o hacerlo en un orden diferente al diseñado.
G4.4 El contrato ha aplicado correctamente los límites comerciales.
G4.5 La lógica empresarial no se basa en los valores recuperados de contratos que no son de confianza (especialmente cuando hay varias llamadas al mismo contrato en un solo flujo).
G4.6 La lógica comercial no se basa en el saldo del contrato (por ejemplo, saldo == 0).
G4.7 Las operaciones sensibles no dependen de los datos del bloque (p. ej., hash de bloque, marca de tiempo).
G4.8 El contrato utiliza mecanismos que mitigan los ataques de ordenación de transacciones (ejecución inicial) (por ejemplo, esquemas de compromiso previo).
G4.9 El contrato no envía fondos automáticamente, sino que permite a los usuarios retirar fondos en transacciones separadas.

Control de Acceso

Control de Acceso Nombre de la prueba
G5.2 Se mantiene el principio del menor privilegio. Otros contratos solo deberían poder acceder a funciones y datos para los que posean autorización específica.
G5.3 Los nuevos contratos con acceso al contrato auditado se adhieren al principio de derechos mínimos por defecto. Los contratos deben tener permisos mínimos o nulos hasta que se otorgue explícitamente el acceso a las nuevas funciones.
G5.4 El creador del contrato cumple con el principio del mínimo privilegio y sus derechos siguen estrictamente los señalados en la documentación.
G5.5 El contrato hace cumplir las reglas de control de acceso especificadas en un contrato de confianza, especialmente si el control de acceso del lado del cliente de la dApp está presente y podría omitirse.
G5.6 Las llamadas a contratos externos solo están permitidas si es necesario.
G5.7 El código modificador es claro y simple. La lógica no debe contener llamadas externas a contratos que no sean de confianza.
G5.8 Todos los atributos de usuario y datos utilizados por los controles de acceso se mantienen en contratos confiables y no pueden ser manipulados por otros contratos a menos que se autorice específicamente.
G5.9 Los controles de acceso fallan de forma segura, incluso cuando se produce una reversión.
G5.10 Si se valida la entrada (parámetros de la función), se utiliza el enfoque de validación positiva (lista blanca) siempre que sea posible.

Comunicación

Comunicación Nombre de la prueba
G6.2 Se identifican las bibliotecas que no forman parte de la aplicación (pero de las que depende el contrato inteligente para funcionar).
G6.3 La llamada de delegado no se usa con contratos que no son de confianza.
G6.4 Los contratos de terceros no ocultan funciones especiales (por ejemplo, reversión).
G6.5 El contrato no verifica si la dirección es un contrato usando código de operación de tamaño de código ext.
G6.6 Los ataques de reingreso se mitigan bloqueando las llamadas recursivas de otros contratos y siguiendo el patrón Verificar-Efectos-Interacciones. No utilice la función de envío a menos que sea imprescindible.
G6.7 El resultado de llamadas a funciones de bajo nivel (p. ej. enviar, delegar llamar, llamar) de otros contratos se comprueba.
G6.8 El contrato se basa en los datos proporcionados por el remitente correcto y no se basa en el valor de tx.origin.

Aritmética

Aritmética Nombre de la prueba
G7.2 Los valores y las operaciones matemáticas son resistentes a los desbordamientos de enteros. Use la biblioteca SafeMath para operaciones aritméticas antes de solidity 0.8.*.
G7.3 Los fragmentos de código no verificados de Solidity ≥ 0.8.* no introducen desbordamientos/desbordamientos de enteros.
G7.4 Los valores extremos (por ejemplo, valores máximos y mínimos del tipo variable) se consideran y no cambian el flujo lógico del contrato.
G7.5 La desigualdad no estricta se utiliza para la igualdad de equilibrio.
G7.6 En los cálculos se utilizan órdenes de magnitud correctos.
G7.7 En los cálculos, la multiplicación se realiza antes de la división para mayor precisión.
G7.8 El contrato no asume una precisión de punto fijo y utiliza un multiplicador o almacena tanto el numerador como el denominador.

Denegación de servicio

Denegación de servicio Nombre de la prueba
G8.2 El contrato no itera sobre bucles no vinculados.
G8.3 La funcionalidad de autodestrucción se usa solo si es necesario. Si está incluido en el contrato, debe estar claramente descrito en la documentación.
G8.4 La lógica empresarial no se bloquea si un actor (por ejemplo, contrato, cuenta, oráculo) está ausente.
G8.5 La lógica comercial no desincentiva a los usuarios a usar contratos (por ejemplo, el costo de la transacción es mayor que la ganancia).
G8.6 Las expresiones de funciones afirmar o requerir tienen una variante de paso.
G8.7 Si nadie puede llamar a la función de reserva, no está bloqueando las funcionalidades del contrato.
G8.8 No hay operaciones costosas en un bucle.
G8.9 No hay llamadas a contratos que no son de confianza en un bucle.
G8.10 Si existe la posibilidad de suspender la vigencia del contrato, también es posible reanudarla.
G8.11 Si se utilizan listas blancas y listas negras, no interfieren con el funcionamiento normal del sistema.
G8.12 No hay DoS causado por desbordamientos y subdesbordamientos.

Datos de la cadena de bloques

Datos de la cadena de bloques Nombre de la prueba
G9.2 Los datos guardados en los contratos no se consideran seguros ni privados (incluso las variables privadas).
G9.3 No se almacenan datos confidenciales en la cadena de bloques (contraseñas, datos personales, token, etc.).
G9.4 Los contratos no utilizan cadenas literales como claves para las asignaciones. En su lugar, se utilizan constantes globales para evitar el ataque de homoglifos.
G9.5 El contrato no genera trivialmente números pseudoaleatorios basados ​​en la información de la cadena de bloques (p. ej., inicialización con el número de bloque).

Uso de gas y limitaciones

Uso de gas y limitaciones Nombre de la prueba
G10.1 El uso de gas está previsto, definido y tiene limitaciones claras que no se pueden exceder. Tanto la estructura del código como la entrada maliciosa no deberían causar el agotamiento del gas.
G10.2 La ejecución de la función y la funcionalidad no dependen de las tarifas de gas codificadas (están obligadas a variar).

Claridad y legibilidad

Claridad y legibilidad Nombre de la prueba
G11.2 La lógica es clara y modularizada en múltiples contratos y funciones simples.
G11.3 Cada contrato tiene un breve comentario de 1-2 oraciones que explica su propósito y funcionalidad.
G11.4 Se utilizan implementaciones listas para usar, esto se aclara en el comentario. Si estas implementaciones han sido modificadas, las modificaciones se anotan a lo largo del contrato.
G11.5 El orden de herencia se tiene en cuenta en los contratos que utilizan múltiples funciones de herencia y sombra.
G11.6 Siempre que sea posible, los contratos utilizan código probado existente (por ejemplo, contratos de token o mecanismos como poseer) en lugar de implementar los suyos propios.
G11.7 Se siguen patrones de nomenclatura coherentes a lo largo del proyecto.
G11.8 Las variables tienen nombres distintivos.
G11.9 Todas las variables de almacenamiento se inicializan.
G11.10 Las funciones con un tipo de devolución especificado devuelven un valor de ese tipo.
G11.11 Se utilizan todas las funciones y variables.
G11.12 exigir se utiliza en lugar de revertir in if Declaraciones.
G11.13 El afirmar La función se utiliza para probar errores internos y la exigir La función se utiliza para garantizar una condición válida en la entrada de los usuarios y los contratos externos.
G11.14 El código ensamblador solo se usa si es necesario.

Cobertura de prueba

Cobertura de prueba Nombre de la prueba
G12.2 Las narrativas de abuso detalladas en el modelo de amenazas están cubiertas por pruebas unitarias
G12.3 Las funciones sensibles en los contratos verificados se cubren con pruebas en la fase de desarrollo.
G12.4 Se ha comprobado la implementación de contratos verificados en busca de vulnerabilidades de seguridad mediante análisis estáticos y dinámicos.
G12.5 La especificación del contrato se ha verificado formalmente
G12.6 La especificación y los resultados de la verificación formal se incluyen en la documentación.

Finanzas descentralizadas

Finanzas descentralizadas Nombre de la prueba
G13.1 El contrato del prestamista no asume que su saldo (utilizado para confirmar el pago del préstamo) se cambie solo con sus propias funciones.
G13.2 Las funciones que cambian el saldo de los prestamistas y/o prestan criptomonedas no son reingresantes si el contrato inteligente permite tomar prestada la criptomoneda de la plataforma principal (por ejemplo, Ethereum). Bloquea los ataques que actualizan el saldo del prestatario durante la ejecución del préstamo flash.
G13.3 Las funciones de préstamo flash solo pueden llamar a funciones predefinidas en el contrato de recepción. Si es posible, defina un subconjunto confiable de contratos para llamar. Por lo general, el contrato de envío (préstamo) es el que debe devolverse.
G13.4 Si incluye operaciones potencialmente peligrosas (p. ej., devolver más ETH/tokens de los prestados), la función del receptor que maneja ETH o tokens prestados puede ser llamada solo por el grupo y dentro de un proceso iniciado por el propietario del contrato receptor u otra fuente confiable (p. ej. multigrado).
G13.5 Los cálculos de la cuota del fondo de liquidez se realizan con la mayor precisión posible (por ejemplo, si la contribución se calcula para ETH, debe hacerse con una precisión de 18 dígitos, para Wei, no para Ether). El dividendo debe multiplicarse por 10 a la potencia del número de dígitos decimales (por ejemplo, dividendo * 10^18 / divisor).
G13.6 Las recompensas no se pueden calcular y distribuir dentro de la misma llamada de función que deposita tokens (también debe definirse como no reingreso). Esto protege de fluctuaciones momentáneas en las acciones.
G13.7 Los contratos de gobernanza están protegidos contra ataques de préstamos rápidos. Una posible técnica de mitigación es requerir que el proceso de depositar tokens de gobernanza y proponer un cambio se ejecute en diferentes transacciones incluidas en diferentes bloques.
G13.8 Cuando se utilizan oráculos en cadena, los contratos pueden pausar las operaciones en función del resultado de los oráculos (en caso de un oráculo comprometido).
G13.9 Los contratos externos (incluso los de confianza) que pueden cambiar los atributos de un contrato de proyecto (p. ej., el precio del token) tienen implementadas las siguientes limitaciones: umbrales para el cambio (p. ej., no más/menos del 5 %) y un límite de actualizaciones (p. ej., una actualización por día).
G13.10 Los atributos del contrato que pueden ser actualizados por los contratos externos (incluso los confiables) se monitorean (por ejemplo, usando eventos) y se implementa un procedimiento de respuesta a incidentes (por ejemplo, durante un ataque en curso).
G13.11 Las operaciones matemáticas complejas que consisten en operaciones de multiplicación y división primero realizan multiplicaciones y luego divisiones.
G13.12 Al calcular los precios de intercambio (por ejemplo, ETH a token o viceversa), el numerador y el denominador se multiplican por las reservas (ver el obtenerPrecioEntrada en función de la Intercambio Uniswap contrato).

 

Ordenar auditoría de Sayfer





    Este sitio está protegido por reCAPTCHA y Google Política de Privacidad y Términos de Servicio aplican.

    Resultados de la auditoría

    [H] Cambiar el tiempo de Génesis puede potencialmente alterar la distribución de recompensas

    ID DECIR-01
    Estado fijo
    Riesgo Alta
    Empresa Impacto rewardsGenesisTime es una variable crítica que rastrea el momento en que se iniciaron las recompensas y, por lo tanto, gobierna la distribución de las recompensas.

    La tasa de recompensas continúa disminuyendo con el tiempo, reduciéndose lentamente al 85% del ciclo anterior en algún momento en el futuro. Por lo tanto, restablecer el tiempo de génesis después de comenzar la distribución de recompensas puede alterar todo el esquema.

    Destino – Recompensa.sol; restablecerRecompensasGenesisTime()
    – Recompensa.sol; Establecer manualmenteRewardsGenesisTime(uint256)

    Descripción

    Cambiar rewardsGenesisTime Más adelante en el ciclo, esto afectará las variables cruciales currentWeek y WeekLimit y podría arruinar todo el esquema de distribución de recompensas y su cronograma proyectado.

    Mitigación

    Una posible mitigación es revisar estas funciones de modo que restablecer el tiempo de génesis solo sea posible antes de que haya comenzado la distribución de recompensas:

     function resetRewardsGenesisTime() external onlyRole(ADMIN_ROLE) {
            require(dimoTotalSentOutByContract==0,"Reward Distribution already started");
            rewardsGenesisTime = block.timestamp;
      }

    Si es necesario restablecer o cambiar la variable después del hecho, tal vez pueda manejarse de manera controlada y predecible en la cadena, en lugar de permitir a los administradores un control arbitrario.

     

    [H] Retiro de administrador sin marcar

    ID DECIR-02
    Estado fijo
    Riesgo Alta
    Impacto en el negocio Si bien las cuentas de administrador, por definición, reciben cierta confianza, si se ven comprometidas, pueden usarse para drenar el contrato de sus fondos usando esta función.
    Destino – Recompensa.sol; administradorRetirar(dirección, uint256)

    Descripción

    La función adminWithdraw(address, uint256) permite a los administradores enviar fondos del contrato a los usuarios sin limitación. Según la documentación, esto se utiliza si los usuarios envían DIMO al contrato sin apostar. Sin embargo, creemos que es posible que se abuse de esta función, como se explica en la sección de impacto empresarial.

    Mitigación

    Una forma concebible de aumentar la seguridad es enviar una solicitud en nombre de un usuario, quizás utilizando una cuenta con el rol de Oracle. Luego, un administrador debe aprobar la transacción. Esto requiere al menos dos cuentas para aprobar dichas transacciones, lo que proporciona otra capa de seguridad.

     

    [H] Los administradores pueden restablecer el registro a voluntad

    ID DECIR-03
    Estado Admitido
    Riesgo Alta
    Impacto en el negocio El registro es donde se almacenan los datos del usuario y se realizan las validaciones. Si se restablece el registro, los usuarios existentes dejarán de recibir recompensas a menos que los datos se migren al nuevo registro.
    Destino – Recompensa.sol; setRegistryContractAddress(dirección)

    Descripción

    setRegistryContractAddress(address) permite a los administradores restablecer la dirección de registro a voluntad.

    Mitigación

    Una solución es asegurarse de que esta función se revierta a menos que el registro no esté configurado en primer lugar.

      function setRegistryContractAddress(
        address registryContractAddress
      ) external onlyRole(ADMIN_ROLE) {
        require(
            registryContractAddress != address(0),
            "registryContractAddress is an invalid zero address"
        );
        require(address(registry)==address(0)),"already set, cannot be set again")
        registry = IRegistry(registryContractAddress);
      }

    Otra solución es configurar un procedimiento de migración de datos. Si ya existe un procedimiento de este tipo, entonces este hallazgo puede ignorarse con seguridad.

     

    [I] El implementador tiene funciones de administrador y de Oracle

    ID DECIR-04
    Estado Admitido
    Riesgo Informativo
    Impacto en el negocio Decidimos calificar este hallazgo como informativo porque es principalmente un corolario de las principales preocupaciones sobre la centralización detalladas anteriormente. Con la forma actual en que está construido el sistema, es necesario que alguien asigne y administre los roles de Oracle y Administrador. Sin embargo, no es necesario que esa cuenta desempeñe estas funciones.
    Destino – Recompensa.sol:108-111; inicializar(dirección, dirección, dirección)

    Descripción

    Durante la inicialización, el implementador recibe los roles de administrador, administrador predeterminado y Oracle:

    _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
    
    _setupRole(ORACLE_ROLE, msg.sender);
    _setupRole(ADMIN_ROLE, msg.sender);

    Mitigación

    Considere otorgar solo la función de administrador predeterminada, heredada de OA. AccessControlUpgradeable, al implementador, lo que le permite administrar roles para otros usuarios.

     

    [M] Usar AccessControlDefaultAdminRulesUpgradeable

    ID DECIR-05
    Estado Admitido
    Riesgo Medio
    Impacto en el negocio Dada la centralización inherente del contrato y la importancia de las funciones administrativas (y por lo tanto su gestión), decidimos calificar este hallazgo como de riesgo medio.
    Destino

    Descripción

    Reward.sol Actualmente utiliza AccessControlUpgradable para otorgar y administrar el acceso a funciones críticas. En el esquema de control de acceso de OZ, la cuenta que posee DEFAULT_ADMIN_ROLE es capaz de otorgar y retirar todos los demás roles. En el estado actual del contrato, se entrega al implementador tras la inicialización.

    AccessControlDefaultAdminRulesUpgradeable Se extiende AccessControlUpgradable con dos características de seguridad cruciales:

    • Sólo una cuenta puede contener DEFAULT_ADMIN_ROLE.
    • DEFAULT_ADMIN_ROLE sólo se puede transferir mediante un proceso de dos pasos. Un retraso configurable entre los dos pasos, changeDefaultAdminDelay, se aplica.

    Mitigación

    Cambia desde AccessControlUpgradable a AccessControlDefaultAdminRulesUpgradeable.

     

    [L] Validación de entrada insuficiente en manualmenteSetRewardsGenesisTime(uint256)

    ID DECIR-06
    Estado fijo
    Riesgo Baja
    Impacto en el negocio Calificamos este problema como bajo, ya que el administrador podría rectificar un valor erróneo con la misma facilidad con la que se proporcionó.
    Destino – Recompensa.sol; Establecer manualmenteRewardsGenesisTime(uint256)

    Descripción

    Además de plantear un riesgo de centralización, como se detalló anteriormente, manuallySetRewardsGenesisTime(uint256) tampoco valida la marca de tiempo proporcionada por el administrador. Aceptaría felizmente un tiempo futuro, que llevaría a _getNumberOfWeeksSinceGenesis() revertir:

      function _getNumberOfWeeksSinceGenesis()
        private
        view
        returns (uint256 unixTimeDiff)
      {
        unixTimeDiff = (block.timestamp - rewardsGenesisTime) / 7 days;
      }

    Mitigación

    Asegúrese de que la entrada sea igual o menor que la marca de tiempo actual.

     

    [L] Validación de entrada insuficiente en setMinimumTimeForRewards(uint256)

    ID DECIR-07
    Estado fijo
    Riesgo Baja
    Impacto en el negocio Al igual que el hallazgo anterior, decidimos calificar este hallazgo como de bajo riesgo porque se puede rectificar fácilmente llamando a la función nuevamente.
    Destino – Recompensa.sol; setMinimumTimeForRewards(uint256)

    Descripción

    Este hallazgo es muy similar en esencia al que está directamente encima. Un valor demasiado alto hará que los usuarios no puedan reclamar sus recompensas. Esto, junto con el hecho de que las recompensas disminuyen semanalmente por _limitForWeek(uint256), neutralizará la ventaja conferida por la adopción temprana.

    Mitigación

    Definir un rango aceptable de valores para minimumTimeForRewards y aplicarlo a través de la función. Debido a la influencia directa que este valor tiene en toda la estructura de recompensas de la plataforma, es fundamental gestionarlo con cuidado.

     

    [L] Error no utilizado

    ID DECIR-08
    Estado fijo
    Riesgo Baja
    Impacto en el negocio Decidimos calificar este problema como bajo en lugar de informativo; esta omisión aparentemente accidental tiene cierto impacto en la lógica del contrato.
    Destino – Recompensa.sol:12

    Descripción

    El error InvalidArrayLegnth() se declara en la línea 12, pero nunca se utiliza.

    Mitigación

    Nuestra hipótesis es que se suponía que este error se debía incluir en batchTransfer(TransferInfo[]) si la matriz proporcionada no tiene ocho miembros:

    if(transferInfos.length != 8) revert InvalidArrayLength();

     

    [L] Valor de retorno no marcado

    ID DECIR-09
    Estado fijo
    Riesgo Baja
    Impacto en el negocio La función de transferencia de tokens ERC20 devuelve el éxito o el fracaso de la transferencia como un valor booleano. Se considera una buena práctica comprobar este valor y sólo proceder si tiene éxito. Sin embargo, debido a que la documentación implica que batchTransfer(TransferInfo[]) solo se utiliza para transferir tokens Dimo, calificamos este hallazgo como bajo.
    Destino – Recompensa.sol:232; transferencia por lotes(TransferInfo[])

    Descripción

    En la línea indicada, se realiza una transferencia de dimoToken, pero el valor de retorno no está marcado.

    Mitigación

    Revertir con un error si la transferencia falla:

    if (!dimoToken.transfer(user, amount)) revert TokenTransferFailed();

     

    [L] Llamada API obsoleta

    ID DECIR-10
    Estado Admitido
    Riesgo Baja
    Impacto en el negocio Diferente a la grantRole(bytes32, address), _setupRole(bytes32, address) no realiza ninguna verificación en la cuenta de llamadas. Por lo tanto, ha quedado obsoleto.
    Destino – Recompensa.sol:108-111; inicializar(dirección, dirección, dirección)

    Descripción

    La función _setupRole(bytes32, address), utilizado en la ubicación especificada, ha quedado obsoleto en OpenZepplin 5.0. Vocación grantRole(bytes32, address) en su lugar ahora se recomienda.

    Mitigación

    Reemplazar llamadas a _setupRole(bytes32, address) grantRole(bytes32, address).

     

    [I] Emisión de eventos insuficiente

    ID DECIR-11
    Estado fijo
    Riesgo Informativo
    Impacto en el negocio Muchas herramientas de monitoreo, interfaces, herramientas fuera de la cadena y servicios de informes se basan en eventos para capturar las actividades de los contratos en tiempo real. Además, los protocolos pueden reaccionar rápidamente ante emisiones de eventos sospechosos.
    Destino – Recompensa.sol; setRegistryContractAddress(dirección)
    – Recompensa.sol; setMinimumTimeForRewards(uint256)
    – Recompensa.sol; setSyntheticProxyAddress(dirección)
    – Recompensa.sol; restablecerRecompensasGenesisTime()
    – Recompensa.sol; manualmenteSetRewardsGenesisTime()
    – Recompensa.sol:267-268; transferencia por lotes(TransferInfo[])

    Descripción

    Las funciones antes mencionadas no emiten eventos para actualizaciones de estado importantes.

    Mitigación

    Agregue emisiones de eventos.

     

    [I] Versionado de Solidez

    ID DECIR-12
    Estado Admitido
    Riesgo Informativo
    Impacto en el negocio El contrato se puede compilar y probar con diferentes versiones del compilador durante el desarrollo y la revisión y con otra versión diferente del compilador durante la implementación en la red principal. Esto puede conducir a resultados inesperados.
    Destino Recompensa.sol:2

    Descripción

    El contrato especifica su pragma como pragma solidity ^0.8.13;. Esto permite el uso de cualquier versión de solidity a partir de 0.8.13. Además, la 0.8.13 no es la versión más reciente.

    Mitigación

    Decida qué versión única de solidez utilizará. La última versión estable (y por lo tanto recomendada) es 0.8.19.

     

    [I] Indexar el parámetro de semana en TokensTransferredForConnectionStreak()

    ID DECIR-13
    Estado fijo
    Riesgo Informativo
    Impacto en el negocio La indexación es útil para filtrar eventos en los registros de Ethereum. Cada parámetro indexado en un evento agrega un tema al registro de eventos, lo que facilita la búsqueda de eventos específicos utilizando esos parámetros.
    Destino – Recompensa.sol:81

    Descripción

    El parámetro semana representa la semana actual en la que se distribuyó el lanzamiento aéreo. Dado que la indexación facilita que las aplicaciones frontend filtren eventos específicos, la indexación de este parámetro facilitará el filtrado de usuarios que recibieron lanzamientos aéreos en una semana determinada.

    Mitigación

    Considere indexar el parámetro especificado.

     

    [I] Adhesión a la Guía de Estilo de Solidity

    ID DECIR-14
    Estado fijo
    Riesgo Informativo
    Impacto en el negocio Este número es puramente informativo. No hay ningún impacto en la situación de seguridad del contrato o de otro tipo.
    Destino – Recompensa.sol:36

    Descripción

    TransferInfo[], una estructura, se define en la línea 36, ​​directamente después de las variables de estado. La guía de estilo de Solidity recomienda colocar las declaraciones de estructura antes.

    Mitigación

    Mueva la declaración de la estructura directamente al comienzo del contrato, antes de las variables de estado.

    Contáctenos

    Mantenerse en contacto

    Destino
    Tel Aviv, Israel
    Correo electrónico
    Mensajeros
    No dude en ponerse en contacto con nosotros, ¡estaremos encantados de responderle!





      Este sitio está protegido por reCAPTCHA y Google Política de Privacidad y Términos de Servicio aplican.
      Ir al contenido