// 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 se descargan como labs Docker para correr en tu propia máquina. 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: se descargan y se ejecutan en un contenedor Docker aislado en tu propia máquina. Estos labs ya están listos: cada reto trae el comando para clonarlos y levantarlos, más su material didáctico (código vulnerable y remediación). Resolvés el reto en local y volvés acá a enviar la flag.
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).
¿Cómo reportar un bug?
Si algo no funciona —un reto que no carga, una flag válida que el verificador rechaza, un lab Docker que no levanta o un error del sitio— abrí una issue en el repositorio: github.com/Ismaeldevs/JSForge-Labs/issues.
Para que se pueda reproducir, contá qué reto es, qué esperabas y qué pasó, con tu navegador o versión de Docker y, si hay, el error de la consola. Ojo con una cosa: no pegues flags ni exploits completos en una issue pública —son spoilers para el resto—; describí el paso donde se rompe y alcanza.