🧬 Testing de Mutación — CultivaChain

Informe de configuración de campaña mewt · Módulos Rust + Solidity · Pre-audit externo
mewt v0.9.3 23% mutantes vivos Campaña lista Fase 2 pendiente
CultivaChain SaaS · Seguridad pre-audit
Configurado: 14 jun 2026
Audit externo: 5 jul 2026 · 21 días
Mutantes generados (fase 1)
487
auth/ + contracts/ (Solidity)
Mutantes capturados
374
Tests detectaron la mutación ✓
Mutation score
76.8%
Objetivo: ≥85% antes del audit
Mutantes vivos (gaps)
113
Lógica sin cubrir por tests
Progreso de configuración · Workflow 5 fases
FASE 1
Init & Targets
✓ Completada
FASE 2
Scope & Mutants
✓ 487 mutantes
FASE 3
Optimización
✓ Opción B aplicada
FASE 4
Timeout Solidity
✓ Manual 13s
FASE 5
Validación final
→ Checklist activo
mewt.toml — Configuración final (Fase 1)
# CultivaChain — Campaña Fase 1 (auth + contracts)
# Fase 2: traceability/ — programada fin de semana siguiente
# Commit: a4f82c1 · 2026-06-14

db = "mewt.sqlite"

[log]
level = "info"

[targets]
# Scope reducido: auth crítico + contratos (pre-audit)
# traceability/ diferido a Fase 2
include = [
  "src/auth/**/*.rs",
  "src/contracts/**/*.rs",
  "contracts/**/*.sol"
]
ignore = ["test", "mock", "generated"]

[run]
# Sin filtro de mutaciones — cubrir todos los tipos

[test]
# Comando base Rust
cmd = "cargo test"
# Auto-calculado (12s × 2 = 24s)

# Solidity: timeout manual (touch → forge: 6.1s × 2 = 12.2 → 13)
[[test.per_target]]
glob = "contracts/**/*.sol"
cmd  = "forge test"
timeout = 13
Distribución por severidad
Alta
181
Media
206
Baja
100
Alta+Media: 387 mutantes (79.5%) del total.
Solo alta+media para análisis prioritario.
Mutation score por módulo
82%

src/auth/

148/180 mutantes capturados
32 gaps · crítico pre-audit

72%

contracts/ (Solidity)

163/225 mutantes capturados
62 gaps · BatchValidator crítico

Análisis de duración · Decisión de optimización (Fase 3)
Sin optimización (scope completo)
traceability/ estimado
~620 mutantes
Duración total (worst-case)
~38h
Baseline cargo test
12s
Cálculo: 1107 × 12s
No viable ✗
Con Opción B — Scope crítico (aplicada)
auth/ + contracts/
487 mutantes
Duración estimada (Rust)
~1.6h
Duración Solidity (forge)
~0.8h
Total campaña Fase 1
~2.4h ✓
Comandos ejecutados · Trazabilidad de la campaña
Sesión de configuración — 14 jun 2026
$ mewt init
Created mewt.toml and mewt.sqlite in /cultivachain

$ mewt print config
targets.include = ["**/*.rs", "**/*.sol"]   # demasiado amplio → editado

# [Editar mewt.toml: scope reducido a auth/ + contracts/]

$ mewt mutate src/auth/ src/contracts/ contracts/
Mutating src/auth/token.rs      → 48 mutants (high:18 med:22 low:8)
Mutating src/auth/permissions.rs → 61 mutants (high:24 med:28 low:9)
Mutating src/auth/session.rs     → 38 mutants (high:14 med:17 low:7)
Mutating src/contracts/validator.rs → 53 mutants (high:20 med:24 low:9)
Mutating contracts/BatchValidator.sol → 95 mutants (high:38 med:42 low:15)
Mutating contracts/TraceRegistry.sol  → 130 mutants (high:47 med:56 low:27)
Mutating contracts/AccessControl.sol  → 62 mutants (high:20 med:17 low:25)
Total: 487 mutants generated

$ mewt status
487 mutants across 7 files · High: 181  Med: 206  Low: 100

$ time cargo test
real 0m11.8s · user 0m8.2s · sys 0m1.1s   → baseline: 12s (auto-timeout: 24s)

# Test Solidity: recompilación diferencial
$ time forge test
real 0m0.9s (warm cache)
$ touch contracts/BatchValidator.sol && time forge test
real 0m6.1s (recompilación completa) → timeout manual: 13s

$ mewt run
Caught (TestFail):  374  (76.8%)
Uncaught (alive):   113  (23.2%)
Timeout:              0
Skipped:              0
Campaign completed in 2h 18m
Top mutantes vivos · Gaps de cobertura prioritarios
Mutantes sin capturar — severidad alta 32 gaps en auth/ · 62 gaps en contracts/
ID Archivo Tipo mutación Línea Descripción Severidad Estado
m-0041 src/auth/token.rs CR 87 Cambio expires_at > nowexpires_at >= now Alta Uncaught
m-0118 src/auth/permissions.rs IF 134 Negación condición can_write no detectada Alta Uncaught
m-0203 contracts/BatchValidator.sol ER 56 require(batchSize > 0) eliminado silenciosamente Alta Uncaught
m-0247 contracts/BatchValidator.sol IT 89 Inversión booleana en validación de origen de lote Alta Uncaught
m-0312 contracts/TraceRegistry.sol CR 112 block.timestamp < deadline<= Alta Uncaught
m-0089 src/auth/session.rs CR 211 Off-by-one en ventana de refresh token Media Uncaught
m-0156 src/contracts/validator.rs ER 45 Eliminación de guard null en firma digital Alta Caught
m-0401 contracts/AccessControl.sol IF 33 Modificador onlyOwner bypasseable Alta Caught
Recomendaciones · Plan de acción pre-audit

Prioridad 1 — Cubrir gaps en BatchValidator.sol (contratos)

  • Añadir test que verifique require(batchSize == 0) revierte correctamente (m-0203)
  • Test de inversión booleana en validación de origen: pasar batch de lote ajeno y verificar revert (m-0247)
  • Verificar boundary block.timestamp == deadline en TraceRegistry (m-0312)
  • Estimación: 3 tests nuevos en Foundry · ~2h desarrollo

Prioridad 2 — Fortalecer tests de auth/ Rust

  • Token expirado con expires_at == now exacto: ¿rechazado o aceptado? Test boundary (m-0041)
  • Test permisos write con usuario sin rol: verificar que can_write=false bloquea operación (m-0118)
  • Off-by-one refresh token window: test con token en el segundo exacto del límite (m-0089)

Fase 2 — traceability/ (620 mutantes pendientes)

Diferido por tiempo de campaña (~20.7h worst-case con cargo test 12s). Recomendado iniciar el próximo fin de semana con Opción D (Two-Phase) usando tests unitarios (~3s) para fase rápida. Objetivo: score ≥85% antes del audit del 5 jul.

Checklist de validación — Fase 5
  • mewt print config — Sintaxis válida, sin errores
  • mewt status — 487 mutantes (coincide con fase 2)
  • mewt print targets — Solo auth/, contracts/ (sin tests ni mocks)
  • cargo test validado en fase 2 (12s baseline)
  • forge test timeout — Manual 13s (recompilación: 6.1s × 2)
  • Duración aceptable — ~2.4h (dentro del slot de 20h)
  • mewt.toml commiteado — commit a4f82c1 con comentarios
Próximos pasos
  • 🔴 Escribir 3 tests Foundry para BatchValidator.sol (gaps alta)
  • 🔴 Escribir 3 tests Rust para auth/ (token boundary + permisos)
  • 🟡 Re-run campaña Fase 1 tras añadir tests → objetivo 85%
  • 🟡 Fase 2: configurar muton para traceability/ (Two-Phase)
  • Entrega informe mutation score al audit externo (5 jul)