Herkos

Política de seguridad

Herkos maneja claves privadas y mensajes cifrados, así que nos tomamos en serio los informes de seguridad y preferimos enterarnos pronto antes que tarde.

Cómo informar de una vulnerabilidad

No abras una incidencia pública para un problema de seguridad.

Comunícalo en privado por correo a security@herkos.email.

Conviene incluir: cuál es el problema, cómo reproducirlo, en qué plataforma y versión lo has probado, y qué podría conseguir un atacante. Una prueba de concepto ayuda mucho.

Nunca incluyas tu propia nsec, clave secreta o secreto de bunker en un informe.

Intentamos acusar recibo en unos pocos días. Como Herkos es un proyecto pequeño, te pedimos un plazo razonable para corregirlo antes de hacerlo público. Nos gusta acreditarte en el aviso, salvo que prefieras lo contrario.

Qué entra en el alcance

La propia aplicación Herkos: el manejo y almacenamiento de claves, el cifrado y descifrado de mensajes (incluidas las comprobaciones de remitente NIP-59 y el aislamiento de Bcc en local_packages/nostr_mail), el bloqueo de la app, la comunicación con relays y bridges, el manejo de adjuntos, y el proceso de compilación y publicación. En Herkos Drive, también su paquete de protocolo (packages/herkos_drive_protocol) y la página que abre sus enlaces (herkos.app/f/); ver su propia sección, más abajo.

Qué queda fuera

Limitaciones conocidas, dichas claramente

Son decisiones de diseño, no vulnerabilidades. Preferimos escribirlas que dejar que alguien las descubra por las malas:

Herkos Local Relay: qué protege y qué no

Herkos Local Relay guarda en tu dispositivo los eventos de tus apps, también los privados (borradores, listas privadas, los sobres que recibes). Esto es lo que lo protege y dónde está el límite, plataforma por plataforma. Los fallos de seguridad del relay se informan igual que los demás (arriba).

La base de datos va cifrada entera, el diario incluido (SQLite3 Multiple Ciphers, AEGIS-256). La clave son 32 bytes al azar creados en el dispositivo y guardados en el almacén seguro del sistema: el Keystore en Android, DPAPI en Windows, el llavero (libsecret) en Linux. No lleva una contraseña tuya, porque el relay tiene que arrancar solo. Sin la clave, el relay no arranca y lo dice: nunca abre ni crea una base sin cifrar, y nunca borra la que no puede abrir.

Si… Android Windows Linux
alguien copia el fichero de la base (una copia de seguridad, una carpeta sincronizada, una imagen del disco) Protegido Protegido Protegido
te roban el aparato o el disco apagado Protegido: la clave está en el Keystore Protegido, salvo que sepa la contraseña de tu sesión de Windows: DPAPI protege la clave con ella Protegido, salvo que sepa la contraseña de tu llavero (casi siempre, la de tu sesión)
otra cuenta de usuario del mismo aparato Protegido Protegido: DPAPI es por usuario Protegido: el llavero es por usuario
otra app o programa que funciona con tu usuario Protegido: Android aísla cada app y el Keystore solo da la clave al relay No: DPAPI cifra por usuario, no por app; un programa que corre como tú puede pedir la clave igual que el relay No: el llavero de tu sesión no separa unas apps de otras
un teléfono con root, o una herramienta que ejecuta código como la app No — —
alguien tiene el aparato desbloqueado en la mano Solo con el PIN o la huella del relay, si los pones Igual Igual
alguien lee la memoria del relay mientras funciona No No No

En escritorio, el límite de DPAPI y del llavero es el de cualquier programa: protegen frente a otros usuarios y frente a quien se lleva el disco, no frente a un programa malicioso que ya corre con tu usuario. Si te preocupa ese caso, lo que protege es el cifrado del disco del sistema (BitLocker, LUKS) junto con no ejecutar programas en los que no confías. En Linux sin llavero (sin Secret Service), el relay no arranca y lo explica: nunca guarda la clave en claro.

Quién entra, en el propio dispositivo. El relay escucha solo en 127.0.0.1, y cualquier app del dispositivo, o una página web del navegador, puede llegar a esa dirección. Por eso:

Lo que no protege, aquí:

La red local, si la enciendes (viene apagada):

Lo que no protege, aquí: quien está en la misma red ve que el aparato tiene un puerto abierto y cuánto tráfico pasa, aunque no lo que pasa; y si el aparato tiene una dirección pública (sin router en medio), ese puerto se ve desde Internet, aunque siga pidiendo una clave de tu lista.

Copias. La copia cifrada lleva contraseña (scrypt y XChaCha20-Poly1305): sin ella no la abre nadie, tampoco nosotros. La exportación en JSONL no va cifrada y lleva tus eventos privados en claro; la app lo avisa.

El bloqueo (PIN, y huella o Windows Hello) se pide al abrir la app, tras 30 segundos fuera, y para aprobar un emparejamiento. Es una barrera de conveniencia, como en Mail: no cifra nada. En Android, con PIN no hay capturas de pantalla ni miniatura en las apps recientes, y desde Android 12 ninguna ventana de otra app puede ponerse encima de la del relay mientras la usas.

Herkos Drive: qué protege y qué no

Herkos Drive guarda tus archivos en servidores Blossom y la lista de tus archivos y carpetas en relays Nostr, las dos cosas cifradas en tu dispositivo. Esto es lo que los protege y dónde están los límites. El detalle completo está en spec-drive.md y en el modelo de amenazas amenazas-drive.md, en packages/herkos_drive_protocol/; lo que ve cada relay y cada servidor, en la política de privacidad. Los fallos de seguridad de Drive se comunican igual que cualquier otro (arriba).

Lo que no pueden hacer los relays ni los servidores:

Lo que no protege:

Cómo se comprueba. Dos revisiones internas contra el modelo de amenazas (2 de noviembre de 2026) y sus arreglos; pruebas de lo que deja ver cada evento y cada bloque; fuzzing de todos los lectores de lo que llega de fuera (eventos, sellos, manifiestos, enlaces, copias). Aún sin auditoría externa: hay una prevista antes de la beta pública, y su informe se publicará entero. Drive todavía está en desarrollo.

Versiones con soporte

Las correcciones de seguridad se aplican a la última versión publicada. Dado el tamaño del proyecto, las versiones anteriores no se mantienen: actualiza antes de informar.