Saltar al contenido principal

Modelo de Seguridad

Primitivas Criptográficas

PrimitivaAlgoritmoUso
FirmasEd25519 (ed25519-dalek)Firma de transacciones, firma de bloques
Hash de bloquesSHA-512Hash de bloque con etiqueta de dominio "BLK"
Hash de transaccionesSHA-256Hash del mensaje de firma
Hash de estadoBLAKE3Cómputo de raíz de estado
Hash de almacenamientoKeccak256Derivación de ranuras de almacenamiento de contratos
Compresiónsnap, lz4Compresión de mensajes P2P

Seguridad de Transporte

Capa P2P

  • Cifrado: Protocolo Noise de libp2p (cifrado autenticado)
  • Multiplexación: Yamux
  • Identidad: Claves de par Ed25519
  • Tamaño máximo de transmisión: 256KB por mensaje

Capa RPC

  • TLS: No terminado por el servidor RPC. Los despliegues en producción deben usar un proxy inverso con terminación TLS.
  • CORS: Restringido a orígenes localhost. Configurar orígenes permitidos para producción.
  • Límite de cuerpo: Cuerpo de solicitud máximo de 1MB.

Limitación de Tasa

CapaLímiteVentana
RPC global200 req/sVentana deslizante de 1 segundo
RPC por IP50 req/sVentana deslizante de 1 segundo
Tamaño de lote100 solicitudesPor solicitud HTTP
Escaneo de hash de bloque1000 bloquesPor llamada a chain_getBlockByHash

Validación de Entradas

RPC

  • La versión JSON-RPC debe ser exactamente "2.0"
  • Los mensajes de error se sanean antes de devolverlos a los clientes
  • Los errores internos devuelven mensajes genéricos (sin trazas de pila ni formatos internos)
  • Los detalles de rechazo del mempool se eliminan de las respuestas de error

Mempool

  • Validación de nonce: Se requieren nonces secuenciales (tolerancia de brecha de hasta 5000 para recuperación de ráfagas)
  • Verificación de saldo: El remitente debe tener saldo suficiente para monto + tarifa
  • Verificación de firma: La firma Ed25519 se verifica antes de la admisión
  • Sistema de cuotas: Límites por clase (Financiero: 50K, IoT: 100K, Global: 100K)
  • Límite por remitente: Máximo 512 transacciones pendientes por remitente

Canal de Transacciones

Guardas sin estado (se ejecutan primero):

  1. Validación del formato de firma
  2. Verificación de firma Ed25519
  3. Verificación de derivación de clave pública a dirección

Guardas con estado (se ejecutan tras pasar las sin estado):

  1. Nonce >= nonce de cuenta
  2. Saldo >= monto + tarifa
  3. Cuenta no en lista negra

Confirmación atómica: la deducción de saldo y el incremento de nonce ocurren de forma atómica.

Seguridad del Consenso

Quórum BFT

  • Quórum: 2f+1 (67%) de los validadores deben firmar el Certificado de Aceptación de Bloque
  • Tolerancia Bizantina: Hasta f = (n-1)/3 nodos bizantinos
  • Verificación de certificados: Los masternodos verifican todas las firmas de atestación

Anti-Manipulación PoU

  • Suavizado de puntaje: La media móvil exponencial previene la manipulación del puntaje mediante comportamiento transitorio
  • Rotación de proponente: Tras 50 bloques, el proponente debe ceder (previene monopolio)
  • Umbral mínimo de puntaje: Puntaje < 300 descalifica de las recompensas

Seguridad Electoral

  • IDs de grupo determinísticos: Basados en época, no en tiempo de reloj (previene desacuerdo entre MNs)
  • Deduplicación de elecciones: Solo se confirma el primer resultado por ronda
  • Rechazo suave de grupos desconocidos: Los masternodos advierten pero continúan procesando IDs de grupo desconocidos

Gestión de Claves

Cartera SDK

  • Eliminación segura: Las claves privadas se borran de forma segura al hacer Drop (mediante el crate zeroize)
  • Sin persistencia: La cartera SDK no guarda claves en disco
  • Cumplimiento de HTTPS: Los endpoints RPC remotos requieren HTTPS por defecto

Faucet

  • Claves por turnos: 10 pares de claves rotados para prevenir contención de nonces
  • Reclamaciones serializadas: El mutex faucet_lock previene condiciones de carrera TOCTOU
  • Límites de reclamación: 5 SAVT por reclamación, período de espera de 24 horas por dirección

Seguridad de Nodos

Actividad de Pares

  • Keepalive de Gossipsub: El compartir puntajes PoU se publica vía gossipsub para actualizar last_seen
  • Tiempo de espera por inactividad: 600 segundos (configurable) antes de eliminar un par
  • Desconexión SlowPeer: Los nodos se desconectan si la cola de envío de gossipsub está saturada

Límites de Recursos

  • Cola del manejador de conexiones: 50,000 mensajes (LN + MN)
  • Malla Gossipsub: mesh_n=8, mesh_n_high=12, mesh_n_low=4
  • Tamaño de pila: 8MB para prevenir desbordamiento de pila
  • Memoria: Grupos de mempool acotados con contrapresión

Divulgación Responsable

Reportar vulnerabilidades de seguridad mediante el proceso de divulgación responsable del proyecto. No crear incidencias públicas para errores de seguridad.