Seguridad y modelo de amenazas
Qué ataques mitiga Accesly, cuáles quedan en manos del usuario y por qué el backend jamás ve la llave privada. Lectura obligatoria si vas a integrar Accesly en un producto financiero.
Premisa fundacional
La regla dura del diseño: la llave privada del usuario nunca sale del dispositivo del usuario en forma reconstruible. Ni Accesly como empresa, ni AWS como cloud provider, ni el integrador que usa el SDK, pueden reconstruir la llave privada de un usuario sin cómplice el usuario mismo (con su biométrico o passphrase).
Esa premisa se refleja en 5 propiedades técnicas concretas:
- El backend guarda ciphertext, nunca plaintext de fragmentos.
- Las llaves de cifrado se derivan del biométrico del usuario, no de secretos del backend.
- El backend no tiene 2 de 3 fragmentos accesibles al mismo tiempo. F2 y F3 usan llaves de cifrado distintas.
- La firma de transacciones ocurre en el navegador del usuario. Nunca se manda seed al backend.
- La rotación de signers on chain requiere firma con la seed vieja, que solo el usuario puede reconstruir.
Matriz de amenazas
| Ataque | Impacto | Mitigación |
|---|---|---|
| Robo del dispositivo desbloqueado | Alto: atacante puede firmar | Timeout de sesión, spending limit por rule, MFA opcional |
| Robo del dispositivo bloqueado | Bajo: sin biométrico no hay PRF | Passkey exige unlock del OS antes de responder |
| Compromiso del backend Accesly (DynamoDB dump) | Nulo: solo ciphertext, sin llaves | F2 wrapped en KMS, F3 protegido por passphrase del usuario |
| Compromiso de KMS de AWS | Bajo: descifra F2 wrap pero F2 sigue cifrado con llave del user | Dos capas de cifrado: KMS wrap + AES con PRF derivada |
| Phishing de passphrase | Medio: si además roban device, comprometen wallet | Passphrase nunca se pide fuera del flow de recovery |
| Malware en el device | Alto si tiene acceso a memoria del browser | Zeroize post firma, WebAuthn con userVerification required |
| Man in the middle en transporte | Nulo: session key ECDH + HTTPS + JWT | F2 se envuelve en session key X25519 efímera |
| Ingeniería social a Accesly Core | Nulo: no tenemos las llaves | No podemos entregar lo que no tenemos |
| Rug pull del integrador que usa el SDK | Nulo: la wallet vive on chain, el integrador solo hostea UI | Usuario mantiene control de su seed via recovery flow |
| Compromiso del contrato Smart Account | Crítico: puede robar fondos | 6 audits Almanax internos, timelock 48h en upgrades, plan de audit externo pre GA |
| Bug en Soroban runtime | Fuera de nuestro control | Confiamos en Stellar core team + validators |
Por qué el backend jamás puede firmar
Un examen granular del scenario "atacante tiene control total del backend Accesly (Lambdas + DynamoDB + KMS)":
- El atacante puede leer todas las rows de
user_fragments. VefragmentF2Wrapped(base64 KMS ciphertext). - El atacante puede pedir a KMS
Decryptcon elfragmentsKey. Obtiene elfragmentF2Encryptedplaintext (que sigue siendo ciphertext AES). - Para descifrar ese AES ciphertext necesita la
F2Key = HKDF(PRFoutput, encryptionSalt, "accesly-f2-encryption"). - El
PRFoutputviene del passkey privkey del user. Vive en el Secure Enclave del device. El atacante no tiene forma de reproducirlo sin el device físico + biométrico del user. - Sin F2 plaintext, el atacante tiene 1 de 3 fragmentos (F3 en
email_fragments, protegido por PBKDF2(passphrase)). Con 1 fragmento no puede reconstruir la seed. Necesitaría también F1 (del device del user) o crackear PBKDF2 600k del F3, lo cual computacionalmente es prohibitivo si el usuario tiene una passphrase decente.
Conclusión: incluso con control total del backend, el atacante no llega a los fondos. Necesita comprometer ADEMÁS el device del usuario.
Wallets custodiales (Coinbase Exchange, Kraken) guardan seeds en HSM administrados por ellos. Si su HSM se compromete, los fondos de todos los usuarios están expuestos. Accesly no tiene ese single point of failure porque nunca centraliza seeds.
Qué queda en manos del usuario
El modelo no custodial mueve ciertos riesgos del custodio al usuario. Es un trade off explícito y hay que comunicarlo honestamente.
- Pérdida del device + olvido de passphrase: no hay recuperación posible. Ni Accesly ni AWS ni ningún dios puede reconstruir la seed. Los fondos quedan inaccesibles para siempre.
- Ataque coercitivo: si un atacante fuerza al usuario a poner biométrico y passphrase, tiene acceso pleno. No hay "seguro contra secuestro". Recomendamos configurar spending limits diarios en el Smart Account para limitar el daño.
- Ingeniería social sobre passphrase: si el usuario le da su passphrase a un attacker que hackeó su device (accedió al F1), el attacker gana. La educación del usuario es responsabilidad del integrador.
Defensa en profundidad
Además de la separación arquitectural, hay varias capas defensivas:
Cifrado en tránsito
HTTPS es tabla obligatoria. Sobre HTTPS, F2 viaja envuelto en un session key efímero (X25519 ECDH por request), así aunque un atacante rompiera TLS solo vería un doble ciphertext.
Cifrado at rest doble
F2 en DynamoDB tiene dos capas de cifrado:
- Interior: AES GCM con llave derivada del PRF del user. Esta es la llave "real" que solo el user puede reproducir.
- Exterior: KMS wrap con el
fragmentsKeyde Accesly. Esta capa está para cumplir compliance de encryption at rest en cloud providers regulados.
Idempotencia de operaciones críticas
recovery/finalize, createWallet, y otras ops que mueven state usan Idempotency-Key header. Un attacker que reenvía el mismo request no lo procesamos dos veces. Los idempotency keys se guardan 24h con TTL en DDB.
Rate limiting
OTP recovery: máximo 3 por hora por email hash. Verify OTP: máximo 5 intentos antes de invalidar. API general: WAF con reglas por IP y por identidad Cognito.
Timelock en upgrades
Para cambiar el WASM del contrato Smart Account se requiere el upgrade-rule, que aplica timelock de 48 horas. Cualquier intento de upgrade se anuncia on chain con anticipación. Si vemos un upgrade sospechoso, hay ventana para reaccionar.
Audit trail
Todas las operaciones sensibles se loguean en audit_logs DDB table con TTL 90 días. Retention más largo para compliance disponible bajo request. Cada log tiene userId, action, result, metadata, timestamp e IP.
Estado de auditorías
Los 6 contratos Soroban tienen review interno hecho por Almanax. Zero findings críticos o high abiertos al día de hoy.
- Smart Account v3
- ed25519 verifier
- secp256r1 verifier
- spending limit rule
- session key rule
- governance timelock
Audit externo con firma independiente (OtterSec, Runtime Verification o similar) planeado antes de subir el cap de valor por wallet más allá de mil dólares. Hasta ese punto operamos con cap conservador y beta acotada.
Divulgación responsable
Si encontrás una vulnerabilidad, escribinos a security@accesly.xyz con detalle técnico. No abras issue público en GitHub. Respondemos en 48 horas para triage.
Publicamos hall of fame de reporters responsables. Bugs críticos elegibles para bug bounty (montos anunciados post GA en un programa formal Immunefi o HackerOne).
Compliance y regulación
Accesly opera como proveedor de infraestructura tecnológica. No custodiamos fondos. La responsabilidad regulatoria del custodio queda en el integrador que decide qué features exponer a sus usuarios.
- KYC de usuarios para operaciones fiat: gestionado por Dynerox.
- Screening OFAC / UN sanctions: gestionado por Dynerox en operaciones fiat.
- Retention de datos personales: 5 años post cierre de cuenta para cumplimiento AML/CFT.
- GDPR / LGPD: derecho a acceso, borrado y portabilidad garantizados. Contactanos para ejercer estos derechos.
Siguientes pasos
- Cómo funciona la recuperación y por qué el modelo Shamir 2 de 3 permite recuperar sin comprometer seguridad.
- Arquitectura completa del sistema.