// INFORMACIÓN Y SEGURIDAD
Cómo funciona, y por qué es seguro
JSForge es un lab de seguridad ofensiva enfocado 100% en JavaScript, autohospedable y de uso educativo. Tiene 12 retos: 10 se juegan en tu navegador y 2 (labs Docker descargables) están en construcción. Acá está el modelo de amenaza y qué medidas lo mantienen seguro.
Qué es JSForge
Cada reto trae un objetivo, pistas progresivas, el código vulnerable a la vista y la remediación en diff, lado a lado. La idea no es solo explotar el bug, sino entender por qué ocurre y cómo se cierra. Los retos se reparten en dos tracks: cliente (lo que corre en el navegador) y servidor (Node.js).
Las dos modalidades
La app vulnerable corre dentro de un <iframe> con sandbox de origen opaco: no puede leer este sitio, tu progreso ni tus cookies. Los retos de servidor traen un backend simulado dentro del mismo iframe (se intercepta fetch), así que nada sale de tu máquina y no hace falta instalar nada.
Algunos retos ejecutan código de servidor real (RCE, deserialización), así que no pueden correr en el sitio: van a descargarse y ejecutarse en un contenedor Docker aislado en tu propia máquina. Estos labs todavía están en construcción; su material didáctico (código vulnerable y remediación) ya está disponible en cada reto.
Cómo se aísla lo vulnerable
El iframe de cada reto se sirve con sandbox="allow-scripts" y sin allow-same-origin. Eso le da un origen opaco: el código vulnerable puede correr y hasta ser explotado, pero está encerrado — no tiene acceso al DOM de la página, a localStorage ni a nada del sitio que lo contiene. Si un exploit "rompe" la app, rompe solo esa caja descartable.
Verificación de flags
Cada reto guarda el SHA-256 de su flag, nunca la flag en claro. Sin cuenta, tu navegador la hashea con crypto.subtle y compara contra ese resumen — nada sale de tu equipo. Con cuenta, la flag se valida en tu propio servidor (mismo hash) y el reto queda registrado en tu perfil. (La verificación en el navegador requiere contexto seguro: https:// o localhost.)
Cuenta y privacidad
La cuenta es opcional. Sin ella, tu progreso vive solo en el localStorage de tu navegador. Con ella, se guarda en la base de datos de tu propia instancia (self-hosted): la cuenta pide usuario, email y contraseña. El email se usa solo para mandarte el enlace de reseteo si olvidás la contraseña —no se comparte con nadie ni se usa para nada más— y la contraseña se guarda con hash argon2id, nunca en claro. No hay tracking de terceros ni analítica: el único que ve tu progreso sos vos (y quien administre ese servidor, que sos vos si lo autohospedás).