Organización ficticia: Nebula Custody
Modalidad: análisis offline reproducible + consulta opcional de Bitcoin testnet
Riesgo: no usa claves privadas, credenciales, fondos ni sistemas reales
El motor diario de conciliación informa que el saldo BTC del ledger no coincide con la realidad observada. El estudiante actúa como equipo conjunto de SOC, DFIR, tesorería, IAM/PAM y auditoría. Debe cuantificar la diferencia, reconstruir la secuencia, preservar evidencia, evaluar hipótesis y proponer controles sin atribuir intención cuando los datos no la demuestran.
Al terminar podrás:
request_id, approval_id, tx_hash y tiempo;| Recurso | Uso |
|---|---|
data/ |
doce fuentes sintéticas del caso |
analizar_caso.py |
conciliación y controles de integridad referencial |
consultar_testnet.py |
consulta opcional, sólo lectura, de Bitcoin testnet |
THREAT_MODEL.md |
activos, actores, DFD, STRIDE, insider y abuse cases |
PLAYBOOKS.md |
ocho playbooks específicos de custodia |
DATA_DICTIONARY.md |
contrato semántico de campos y fuentes |
templates/ |
cadena de custodia e informe de hallazgos |
EVALUACION.md |
entregables y rúbrica |
SOLUCION.md |
solución docente; abrir después de resolver |
data/ durante el análisis.Desde la raíz del repositorio:
python labs/custodia-activos-digitales/analizar_caso.py
python -m unittest discover -s labs/custodia-activos-digitales/tests -v
La primera orden debe terminar con RESULTADO: ALERTA y cuantificar una diferencia
BTC de 0.70000000. El test confirma que el hallazgo no depende de inspección
manual ni de red.
templates/CADENA_CUSTODIA.md a tu carpeta de entrega.Reconstruye esta unión, sin asumir que compartir tiempo significa compartir causa:
withdrawals.request_id
-> approvals.request_id
-> application_logs.request_id
-> blockchain.request_id + tx_hash
-> ledger.reference
-> access_logs.session_id / security_alerts.correlation_id
Para cada retiro responde quién solicitó, quién aprobó, qué identidad ejecutó, qué credencial/sesión se usó, qué política decidió, qué dirección recibió, qué TXID resultó, qué asiento quedó y quién podía alterar esa evidencia.
El dataset funciona offline. Para practicar adquisición desde una fuente externa, usa un TXID real de Bitcoin testnet obtenido por el docente o por un explorador de testnet:
python labs/custodia-activos-digitales/consultar_testnet.py tx <TXID_TESTNET> --out evidencia-tx.json
python labs/custodia-activos-digitales/consultar_testnet.py address <DIRECCION_TESTNET> --out evidencia-address.json
El script fija el endpoint en testnet, guarda bytes de respuesta y muestra SHA-256. Una API de explorador es una fuente derivada: para mayor aseguramiento se contrasta con un nodo propio mediante RPC y se documentan altura, confirmaciones, endpoint y momento de adquisición. No envíes transacciones ni pegues seeds.
Construye una timeline UTC. Cada fila debe citar fuente y event_id. Clasifica:
Completa templates/INFORME_HALLAZGOS.md. La raíz no puede ser el nombre de una
persona: modela decisiones, permisos, ausencia o bypass de controles, calidad de
datos y supervisión. Una conducta individual puede ser una observación relevante,
pero intención y responsabilidad requieren evidencia y proceso competente.
Los JSONL incluyen: event_id, timestamp, user_id, role, session_id,
device_id, source_ip, action, asset, amount, source_wallet,
destination_wallet, approval_id, request_id, tx_hash, block_number,
exchange, result, risk_score y correlation_id. Campos vacíos son valores
ausentes, no evidencia de que el hecho no ocurrió.
Para resistencia a alteración, el diseño objetivo exige reenvío temprano a una cuenta separada, almacenamiento WORM/object-lock cuando corresponda, cifrado, control de acceso independiente, sincronización temporal, hashes o firmas de lotes, alertas por silencio y pruebas de restauración. «Blockchain para logs» no es requisito ni solución automática.
| Capacidad | Maker | Checker | Firmante/operador | Conciliador | Auditor | Admin plataforma |
|---|---|---|---|---|---|---|
| Crear solicitud | sí | no | no | no | no | soporte técnico |
| Aprobar | no | sí | no | no | no | no |
| Firmar/transmitir | no | no | sí, con política | no | no | no |
| Registrar asiento | servicio | no | no | no | no | mantener, sin editar datos |
| Conciliar/cerrar excepción | no | no | no | sí | revisar | no |
| Borrar/alterar evidencia | no | no | no | no | no | no |
La tabla describe incompatibilidades, no sólo roles. ABAC agrega importe, activo, destino allowlisted, horario, dispositivo, riesgo, número de aprobaciones y estado del conciliador. Acceso JIT/JEA limita duración y comandos; MFA resistente al phishing reduce account takeover; PAM graba sesión y rota credenciales. La cuenta break-glass requiere doble custodia, alerta inmediata, motivo, expiración y revisión.
El escenario no reconstruye FTX, Celsius ni ningún caso real. Nebula Custody, sus usuarios, eventos, direcciones, saldos y transferencias son ficticios. El diseño practica controles que documentos públicos permiten justificar sin copiar ni inventar la arquitectura de una organización real:
| Evidencia pública | Competencia que se practica | Límite de la traslación |
|---|---|---|
| El testimonio oficial del nuevo CEO de FTX describió concentración de control, acceso de alta dirección a sistemas con activos de clientes, mezcla de activos y registros incompletos. | mínimo privilegio, segregación maker-checker, conciliación y trazabilidad | no afirma que el dataset, campos o reglas de Nebula existieran en FTX |
| El informe del OIG de la SEC sobre Madoff documentó una confirmación supuestamente externa obtenida a través del propio examinado. | adquisición directa desde una fuente independiente y registro de procedencia | no convierte a Madoff en caso blockchain ni en incidente de ciberseguridad |
Las fuentes inspiran preguntas de control, no hechos del escenario. Por eso el alumno busca quién podía solicitar, aprobar, ejecutar, registrar y conciliar; también contrasta una API externa. Una anomalía abre investigación. No prueba fraude, autor, intención ni una causa técnica, y el explorador externo tampoco demuestra por sí solo propiedad económica o autorización interna.
| Modelo | Ventaja | Riesgo/límite | Uso razonado |
|---|---|---|---|
| Clave única | simple y rápida | punto único de compromiso y control | saldos mínimos con límites estrictos |
| Multisig on-chain | quórum verificable por protocolo | metadatos, soporte y recuperación dependen de la cadena | tesorería con firmantes independientes |
| MPC | ninguna parte reconstruye normalmente la clave | protocolo, proveedor y gobernanza siguen siendo críticos | operación frecuente con políticas distribuidas |
| HSM-backed | aislamiento y operaciones auditables | un HSM firma órdenes válidas aunque sean ilegítimas | raíz de confianza junto a approval workflow |
Hot, warm y cold describen exposición y disponibilidad, no una garantía absoluta. La arquitectura combina límites/velocity, allowlist con enfriamiento, simulación, ceremonias de clave, backups probados, rotación, recuperación ante desastre y reconciliación independiente.
| Síntoma | Causa probable | Corrección |
|---|---|---|
| el script termina con código 2 | encontró la anomalía prevista | verifica que muestre RESULTADO: ALERTA; no es un fallo del laboratorio |
| aparecen decimales imprecisos | se usó float o una hoja redondeó |
usa Decimal y conserva ocho decimales para BTC |
| el TXID no existe | se usó el identificador sintético offline en la API real | usa un TXID de Bitcoin testnet entregado por el docente |
| la API responde error/timeout | red, rate limit o identificador inválido | conserva el error, reintenta más tarde y no sustituyas la fuente sin documentarlo |
se concluye quién fue por user_id |
se confundió cuenta con persona | busca IdP, MFA, PAM, endpoint y evidencia contextual |
| ledger y cadena no unen | se compararon snapshots, fees o ventanas distintas | revisa semántica, cobertura, dirección, estado y tiempo |
¿La blockchain es la fuente definitiva?
Es definitiva para ciertas propiedades del protocolo observado, no para propiedad económica, autorización interna, identidad humana ni saldos mantenidos fuera de cadena.
¿Por qué el script devuelve un código distinto de cero?
Porque automatización y CI deben poder distinguir un caso conciliado de una alerta. El test unitario es la validación verde; el comando del caso demuestra la detección.
¿Puedo usar mainnet?
No es necesario ni parte del ejercicio. El cliente incluido fija Bitcoin testnet y no tiene ninguna función de firma o transmisión.
¿Multisig o MPC resuelven insider risk?
Reducen rutas unilaterales si los participantes y dominios son independientes. No eliminan colusión, políticas erróneas, administración excesiva ni recuperación débil.