🧬
Genotoxic Triage Report
SentinelAPI · src/auth/ · Python 3.12 · mutmut + necessist + trailmark
v1.0.0 2026-06-18 ⚡ 4 corroborados
Mutantes totales
47
supervivientes mutmut
Necessist
18
removals pasaron
Corroborados
4
prioridad máxima
Falsos positivos
19
29.2 % del total
Tests unitarios
28
43.1 % del total
Fuzzing targets
14
21.5 % del total
Distribución de hallazgos (65 total)
Corroborados 6.2% Falsos positivos 29.2% Tests unitarios 43.1% Fuzzing targets 21.5%
Hallazgos Corroborados (mutation + necessist — máxima confianza)
4
Archivo · Línea Función Señal Mutation Señal Necessist CC Acción
src/auth/jwt_handler.py
L:142
verify_token_signature CompareOp: >= → > — boundary en exp check Assertion assert result.valid removida, test pasó 14 Fuzz harness JWT
src/auth/token_parser.py
L:87
parse_access_token AugAssign: += → -= — offset acumulado Llamada a _validate_header() eliminada, sin fallo 18 Fuzz parser binario
src/auth/rbac.py
L:203
evaluate_policy_chain BoolOp: and → or — cortocircuito DENY Aserción de permiso denegado removida, test pasó 22 Fuzz policy engine
src/auth/password_utils.py
L:56
validate_password_policy Constant: 8 → 9 — umbral longitud mínima Llamada a check_complexity() eliminada 9 Property-based test
Falsos Positivos (ignorar — sin impacto en comportamiento)
19
Archivo · Línea Mutación Razón Fuente
src/auth/jwt_handler.py L:18 Constant: "HS256" → "HS255" Solo callers de test; código de logging, sin callers en prod mutation
src/auth/rate_limiter.py L:34 BinOp: // → / Función dead code — sin callers en grafo mutation
src/auth/rate_limiter.py L:71 Str: "window_ms" → "" String de log display; comportamiento cosmético mutation
src/auth/rbac.py L:12 Constant: 100 → 101 Mutante equivalente — resultado idéntico para todos los inputs observables mutation
src/auth/password_utils.py L:9 Sentencia logger.debug(...) eliminada Sentencia de debug genuinamente innecesaria para comportamiento necessist
src/auth/jwt_handler.py L:29 UnaryOp: not → — Código de feature flag desactivado; rama inalcanzable mutation
src/auth/rate_limiter.py L:91–107 Varios (5 mutantes) Módulo legado sin callers activos — marcar para eliminación mutation
src/auth/token_parser.py L:14–19 Sentencias setup (3 removals) Setup redundante en fixture: estado ya inicializado por conftest necessist
src/auth/rbac.py L:44 Compare: != → == Solo callers de infraestructura de test; sin path en producción mutation
tests/test_auth_unit.py varios Removals de print/log (3 removals) No mapeable a función de producción; debug puro necessist
Tests Unitarios Faltantes (escribir tests)
28
Archivo · Línea Función CC Callers Test sugerido Fuente
src/auth/password_utils.py L:72 check_complexity 7
4
Property-based (Hypothesis) mutation
src/auth/password_utils.py L:48 hash_password 3
6
Test negativo bcrypt rounds mutation
src/auth/jwt_handler.py L:98 decode_payload 6
9
Test claims expirados/inválidos mutation
src/auth/rate_limiter.py L:55 is_rate_limited 4
7
Test boundary ventana temporal mutation
src/auth/rbac.py L:88 get_effective_roles 5
11
Test herencia roles anidados mutation
src/auth/rbac.py L:155 has_permission 4
13
Test permisos denegados + wildcards necessist
src/auth/jwt_handler.py L:170 refresh_token 8
3
Test refresco con token revocado necessist
src/auth/rate_limiter.py L:116 get_retry_after 3
4
Test off-by-one segundos restantes mutation
+ 20 ítems adicionales · Consultar GENOTOXIC_REPORT_FULL.md para lista completa
Objetivos de Fuzzing (instalar harness — atheris / cargo-fuzz)
14
Archivo · Línea Función CC Path entrypoint Blast radius Harness sugerido Fuente
src/auth/token_parser.py L:87 parse_access_token 18 POST /auth/token → parse_access_token Alto (23 nodos) atheris — formato binario prop. ★ corroborado
src/auth/jwt_handler.py L:142 verify_token_signature 14 middleware.auth → verify_token_signature Alto (19 nodos) atheris — corpus JWT malformado ★ corroborado
src/auth/rbac.py L:203 evaluate_policy_chain 22 API gateway → evaluate_policy_chain Muy alto (31 nodos) atheris — policy JSON arbitrario ★ corroborado
src/auth/token_parser.py L:34 _parse_claims_section 12 parse_access_token → _parse_claims_section Medio (9 nodos) atheris — claims arbitrarios mutation
src/auth/jwt_handler.py L:60 decode_header 10 verify_token_signature → decode_header Medio (8 nodos) atheris — headers base64 malformados mutation
+ 9 ítems adicionales · Consultar GENOTOXIC_REPORT_FULL.md para lista completa