Auditoría de seguridad de Nym mixnet y contratos de vesting
Auditoría de seguridad de la mixnet y los contratos de vesting de Nym
Introducción
En diciembre de 2022, Nym se sometió a una auditoría de seguridad independiente realizada por Oak Security, una empresa de consultoría de ciberseguridad con sede en Alemania, especializada en la auditoría de blockchains de tercera generación y protocolos descentralizados. Con una amplia experiencia en ecosistemas como Cosmos, Terra, Polkadot y Flow, Oak Security tuvo la tarea de evaluar dos componentes críticos del ecosistema Nym: (1) la mixnet y los contratos de vesting de Nym (ver reporte completo y (2) la Wallet de Nym (ver reporte completo). La auditoría tuvo como objetivo evaluar la robustez de estos componentes, identificar posibles vulnerabilidades y garantizar el cumplimiento de las mejores prácticas en el desarrollo de código. Para que sea más fácil de seguir, hemos desglosado los hallazgos para cada componente. Puedes consultar el resumen de la auditoría de la wallet de Nym aquí.
Resumen de la Auditoría de Nym Mixnet y Contratos de Vesting por Oak Security.
Con una duración de 2 semanas, la auditoría involucró a un equipo de 4 expertos. El equipo de Nym proporcionó a Oak Security acceso completo al código base del proyecto, especificaciones detalladas del proyecto y documentación de respaldo. El alcance de la auditoría cubrió los repositorios de contratos/mixnet, contratos/vesting y las importaciones relevantes de estos contratos para la mixnet y los contratos de vesting de Nym.
Oak Security revisó minuciosamente el código, combinando el análisis automatizado del código fuente y las dependencias con una inspección manual línea por línea para descubrir vulnerabilidades de seguridad, evaluar la calidad del código y analizar el cumplimiento de los principios de codificación segura. Este enfoque integral incluyó un análisis en profundidad de áreas críticas como vulnerabilidades de condición de carrera, problemas de desbordamiento inferior y superior, prácticas de gestión de claves, robustez criptográfica, riesgos de fuga de datos, manejo de contraseñas y controles de acceso y autorización.
El objetivo de la auditoría fue garantizar la funcionalidad correcta de los protocolos, identificar cualquier vulnerabilidad explotable o error en los contratos inteligentes y recomendar mejoras para la seguridad y legibilidad del código.
Resumen de los hallazgos
Los contratos de la mixnet y de vesting de Nym se caracterizaron por su alta legibilidad y claridad, con una sólida cobertura de pruebas que respalda su fiabilidad. En su evaluación, los auditores identificaron 19 hallazgos, incluyendo 9 vulnerabilidades de seguridad —que comprendían problemas de gravedad crítica y mayor— y 10 debilidades generales clasificadas como menores o informativas.
El equipo de Nym ha abordado rápidamente todos los problemas críticos y mayores. El equipo de Oak Security verificó y aprobó nuestras correcciones.
NYM-MIX-VEST-CONTRACT-1: Un fallo en la ejecución de un evento del epoch o intervalo bloquea permanentemente el avance del epoch (Crítico).
La auditoría identificó una vulnerabilidad en el manejo de los mensajes AdvanceCurrentEpoch en contracts/mixnet/src/interval/transactions.rs. Un bucle secuencial procesa todos los eventos pendientes directamente dentro del contexto de la transacción, lo que significa que un único evento fallido podría revertir toda la transacción, deteniendo efectivamente el avance de la época y el intervalo, y provocando que el protocolo se quede atascado.
Para abordar esto, los auditores recomendaron envolver la ejecución de eventos en submensajes con una política de respuesta. Este enfoque permitiría al sistema manejar los fallos con elegancia sin revertir toda la transacción. Sin embargo, deliberadamente elegimos no seguir esta recomendación. Un fallo durante la ejecución de un evento indica un defecto lógico significativo que podría comprometer el mecanismo de recompensas, por lo que es preferible detener el avance de la época para una inspección manual en lugar de arriesgarse a operar en un estado corrupto. En cambio, implementamos una monitorización mejorada en la API de Nym para detectar y alertarnos sobre fallos en el avance de los epochs. Este enfoque garantiza que dichos fallos se señalen rápidamente, lo que permite una intervención oportuna para resolver los problemas.
NYM-MIX-VEST-CONTRACT-2: Los atacantes pueden forzar a nodos de mezcla huérfanos a unirse a una familia sin su consentimiento para agregar una gran cantidad de ellos en la misma capa (Crítico).
Se identificó una vulnerabilidad en el mensaje JoinFamilyOnBehalf, que podría permitir a un atacante agregar un nodo de mezcla a una familia sin su consentimiento. Al crear una familia maliciosa y utilizar la clave de identidad del nodo de mezcla víctima firmada con su clave privada como firma, el atacante podría atrapar el nodo de mezcla en la familia. Esto podría permitir potencialmente a un atacante agrupar nodos de mezcla huérfanos en una sola familia, interrumpiendo la red al concentrar nodos en la misma capa y aumentar las posibilidades del atacante de influir en el enrutamiento.
Para abordar la vulnerabilidad en el mensaje JoinFamilyOnBehalf, se rediseñó el mecanismo de firma del contrato. En lugar de simplemente firmar la identidad del nodo de mezcla, las firmas se actualizaron para incluir un mensaje con una intención clara y un nonce único. Este cambio garantiza que las firmas no puedan reutilizarse ni repetirse.
NYM-MIX-VEST-CONTRACT-3: Una iteración ilimitada en el manejo del mensaje TrackUndelegation podría impedir que el usuario cancele su delegación, lo que también inhibe permanentemente el avance del epoch (Crítico).
La iteración ilimitada del mensaje TrackUndelegation podría causar el agotamiento del gas al manejar cuentas con numerosas delegaciones, impidiendo que los usuarios cancelen sus delegaciones. Este fallo también detendría el avance del epoch, dejando el protocolo atascado en su estado actual.
Para abordar el problema, implementamos un límite de 25 delegaciones de vesting por cuenta. Esta solución se basó en el mayor número observado de delegaciones de vesting en ese momento.
Actualización: A partir del 2024, la opción de realizar delegaciones de vesting está completamente desactivada.
NYM-MIX-VEST-CONTRACT-4: Un atacante puede realizar front-running de los mensajes BondMixnodeOnBehalf y CreateFamilyOnBehalf y modificar su carga útil (Crítico)
Esta vulnerabilidad permitiría a un atacante realizar front-running de los mensajes BondMixNodeOnBehalf y CreateFamilyOnBehalf, extraer la firma y modificar la carga útil. En el caso de BondMixNodeOnBehalf, el atacante también podría establecerse a sí mismo como el proxy, obteniendo control total sobre el bono registrado.
Para abordar esta vulnerabilidad, implementamos una solución doble. Primero, aplicamos los cambios en la creación de firmas descritos en NYM-MIX-VEST-CONTRACT-2, que añadieron una intención clara y un nonce único. Segundo, restringimos la dirección de proxy legal a la cuenta de vesting, asegurando que los atacantes no puedan establecerse a sí mismos como el proxy y obtener control no autorizado sobre los bonds registrados.
Actualización: A partir de 2024, todas las operaciones de proxy están desactivadas, lo que hace que el ataque sea inaplicable.
NYM-MIX-VEST-CONTRACT-5: Las firmas pueden ser reutilizadas en transacciones "en nombre de" para suplantar la identidad de los usuarios (Crítico)
Esta vulnerabilidad permite que las firmas se reutilicen en transacciones "en nombre de", lo que permite a los atacantes suplantar la identidad de los usuarios. Dado que las firmas solo incluyen datos sin procesar sin metadatos adicionales como nonces o identificadores de mensaje, un atacante podría reutilizar una firma de un mensaje para otro y eliminar por la fuerza a miembros de la familia. Además, los atacantes pueden reutilizar firmas para el mismo tipo de mensaje, lo que permite a un miembro volver a unirse a una familia varias veces utilizando la misma firma.
La solución a este problema es similar a la implementada en NYM-MIX-VEST-CONTRACT-4.
NYM-MIX-VEST-CONTRACT-6: La generación de claves para pares (propietario, proxy) podría provocar colisiones (Crítico)
Esta vulnerabilidad permitiría que dos pares de direcciones (propietario, proxy) diferentes generaran el mismo resultado XOR en la función generate_owner_storage_subkey, lo que podría provocar colisiones de claves y sobrescritura de datos.
La solución de restringir el proxy legal únicamente a la dirección del contrato de vesting, que se aplicó en el NYM-MIX-VEST-CONTRACT-4, también resuelve esta vulnerabilidad. Al garantizar que la operación XOR siempre se realice contra una cadena constante, este cambio elimina eficazmente el riesgo de colisiones.
NYM-MIX-VEST-CONTRACT-7: track_delegation puede sobrescribir una delegación existente si se procesa más de una dentro del mismo bloque (Crítico).
Este problema permitiría que ocurrieran colisiones de claves si se realizan múltiples delegaciones dentro del mismo bloque, lo que podría causar que la función save_delegation sobrescriba una delegación existente, resultando en la pérdida de la delegación anterior.
Para abordar este problema, cambiamos la lógica de la función save_delegation para que primero lea la cantidad de delegación existente antes de guardar la nueva. Si ya existe una delegación para la misma clave, recuperamos la cantidad actual, agregamos la nueva delegación y luego guardamos el total actualizado, asegurando que no se sobrescriba ninguna delegación existente.
NYM-MIX-VEST-CONTRACT-8: El propietario del bono no puede realizar operaciones si el bono es creado "en nombre de" por un proxy (Mayor).
Este problema impediría que el propietario del bond realizara cualquier operación sobre su bond si este fue creado "en nombre de" y la transacción actual es iniciada por el propietario en lugar del proxy. Dado que el proxy podría verse comprometido o perderse, y no hay forma de que el propietario lo cambie, esto podría resultar en que el propietario pierda el control sobre su bond.
No consideramos que esto sea un problema, ya que es un comportamiento intencional por diseño. Cuando un nodo de mezcla está enlazado (o se realizan delegaciones) a través del contrato de vesting, se espera que todas las interacciones posteriores con el bond o la delegación ocurran solo a través del contrato de vesting.
Actualización: A partir de 2024, el contrato de vesting ha sido eliminado.
NYM-MIX-VEST-CONTRACT-9: La ejecución de los mensajes LeaveFamily y LeaveFamilyOnBehalf podría fallar si una cantidad significativa de nodos de mezcla son miembros de una familia (Mayor).
Este problema provocaría el fallo de los mensajes LeaveFamily y LeaveFamilyOnBehalf debido al agotamiento del gas al iterar sobre una gran cantidad de miembros de la familia en el mapa MEMBERS. Esto impediría que los nodos de mezcla abandonaran una familia, dejándolos efectivamente bloqueados en su familia actual.
Solución: La solución implicó la reelaboración de la lógica para acceder directamente al mapa MEMBERS y verificar la membresía de un nodo de mezcla. Este cambio eliminó la necesidad de iteración, lo que podría generar errores por falta de gas, y garantizó que los miembros puedan abandonar una familia con éxito, incluso cuando haya muchos miembros en la familia.
Actualización: A partir de 2024, las familias de nodos han sido eliminadas.
Últimas palabras
Nos gustaría agradecer al equipo de Oak Security por su experiencia y dedicación durante todo este proceso de auditoría. También apreciamos la colaboración y profesionalismo demostrados durante las etapas de planificación y ejecución de la auditoría. Nuestro compromiso continuo con la seguridad sigue siendo una prioridad máxima, y esperamos seguir colaborando con expertos en seguridad para mantener los más altos estándares para nuestro ecosistema.