Seguridad y datos: tu trabajo se queda en local

PanelCraft es una aplicación de escritorio pensada para funcionar sin conexión. Tus proyectos, tarifas, fichas de clientes e imágenes de acabado se guardan en tu propio equipo, y la aplicación está construida para que un archivo hostil o un componente defectuoso no pueda llegar más allá de lo que necesita.

Dudas sobre seguridad: hello@panelcraft.store.

Sin conexión por diseño

Diseñar, cortar, presupuestar, planos, documentos, exportación de mecanizado y vista de habitación funcionan en local. La interfaz de la aplicación no puede cargar nada de la red: su política de contenido limita todo tipo de fuente a la propia aplicación, y la sesión por defecto cancela toda solicitud salvo archivos locales, data y URL blob.

Solo una cosa necesita internet: la licencia. La aplicación se activa una vez y después comprueba la licencia en línea cuando toca. Si no puede alcanzar el servicio de licencias, sigue funcionando durante un periodo de gracia de varios días, de modo que un taller con mala conexión no se interrumpe. Los errores de red y de servidor nunca eliminan una licencia existente; solo lo hace una negativa explícita del servicio.

Nunca se sube ningún proyecto, tarifa, ficha de cliente, imagen de acabado ni fotografía de habitación.

Dónde viven tus datos

Todo se guarda en tu ordenador, en lugares que puedes encontrar y copiar.

DatosDóndeNotas
ProyectosDonde guardes el archivo .panelcraftSe escriben de forma atómica (archivo temporal y después renombrado). Al abrir se leen como máximo 50 MB.
Índice de proyectos, clientes, presupuestosUna base de datos SQLite local en la carpeta de datos de la aplicaciónSe mantiene en memoria y se guarda de forma atómica tras cada transacción. Un archivo ilegible se renombra aparte, nunca se elimina.
Bibliotecas y stockArchivos JSON en la carpeta de datos de la aplicaciónSe leen como máximo 10 MB y se validan antes de usarse.
Imágenes de acabadoLa carpeta de datos de la aplicación, guardadas por hash de contenidoValidadas por contenido: 8 MB, de 16 a 8192 px, 36 megapíxeles por imagen.
Foto de la vista de habitaciónUna copia reducida en la carpeta de datos de la aplicaciónComo máximo 10 MB, validada por bytes mágicos, en una carpeta con nombre derivado de un hash del id del proyecto.
LicenciaDos copias de un archivo de estado de la licencia en la carpeta de datos de la aplicaciónGana la copia válida con la hora de comprobación más reciente, así que borrar o editar una copia no reinicia el reloj de la prueba.

Las exportaciones salen de la aplicación como archivos normales: PDF, CSV, DXF, SVG e imágenes. Tú eliges dónde se escriben, y la aplicación nunca decide una ruta por ti.

De qué se defiende el diseño

El modelo de amenazas nombra cuatro adversarios. Un archivo malicioso o dañado que abres o importas (un proyecto, un CSV, una biblioteca, una imagen o una base de datos) se trata como datos no fiables. Una interfaz comprometida, por ejemplo por un fallo en una dependencia, también se trata como no fiable: no debe poder leer ni escribir archivos arbitrarios, ejecutar código en el proceso principal, eludir las licencias ni llegar a la red. Un usuario local que manipule los archivos de licencia o el reloj se gestiona hasta un nivel razonable. Y la cadena de suministro, las dependencias de npm y el propio Electron, se mantiene reducida y revisada.

Quedan fuera del alcance un atacante que ya ejecuta código como tú, un sistema operativo malicioso y el acceso físico al equipo. Ninguna aplicación de escritorio puede defenderse de eso, y no pretendemos hacerlo.

Los controles

ÁreaControl
Aislamiento del renderizadorRenderizador aislado (sandbox) con aislamiento de contexto y sin integración de Node. Sin contenido remoto ni vistas web incrustadas. Sandbox de la aplicación activado en todas las ventanas.
Llamadas al proceso principalCada llamada se comprueba: el remitente debe ser el marco superior de la página empaquetada, cada argumento se comprueba por tipo y tamaño, se descartan los campos desconocidos y las extensiones de exportación están en una lista blanca.
Rutas de archivoLa interfaz nunca elige dónde leer o escribir. Las lecturas vienen de diálogos nativos de abrir, las escrituras de diálogos nativos de guardar o de archivos propios de la aplicación. Una ruta solo se acepta para guardar si la elegiste en un diálogo durante esta sesión o ya figura en el índice que escribió el proceso principal.
E/S de archivos acotadaLas lecturas tienen un tamaño máximo (proyecto 50 MB, CSV 10 MB, almacenes 10 MB, base de datos 512 MB, licencia 64 KB) y deben ser archivos normales, no dispositivos ni carpetas. Las escrituras usan un nombre temporal aleatorio abierto en exclusiva y después renombrado, así que nunca se sigue un enlace plantado.
Entrada mal formadaEl texto de proyectos, bibliotecas y stock debe interpretarse como un objeto o una matriz JSON antes de usarse. Los errores de lectura se convierten en un mensaje limpio, nunca en un fallo.
Política de contenidoPolítica de producción: fuentes de scripts, estilos, imágenes, tipografías y conexiones limitadas a la propia aplicación; sin eval; sin scripts ni estilos en línea; sin marcos ni objetos; sin destinos base ni de formulario.
Renderizado de PDFUna ventana oculta con JavaScript desactivado, su propia sesión en memoria que cancela todo salvo las URL data, permisos denegados, navegación y ventanas emergentes denegadas, y un tiempo límite de 60 segundos. El marcado se sanea de nuevo en el proceso principal, se inyecta una política como primer elemento y se eliminan scripts, marcos, objetos, incrustaciones, elementos base y link, y controladores de eventos. El texto del usuario se escapa al generar los documentos.
NavegaciónLa ventana solo puede navegar a su propia página; las ventanas nuevas se deniegan siempre; los enlaces web se abren en el navegador del sistema; las vistas web y las solicitudes de permisos se deniegan.
ImágenesLos acabados y las fotos de habitación se validan por contenido (bytes mágicos y tamaño en píxeles de la cabecera), se rechazan si son enlaces, carpetas o demasiado grandes, se guardan bajo un hash y se decodifican sin relajar la política de contenido.
Base de datosCada consulta es una sentencia preparada con parámetros enlazados. El único lugar que construye una lista de columnas usa literales fijos. Los comodines se escapan y hay pruebas adversarias que cubren cargas de inyección.
Refuerzo del entorno de ejecuciónLa aplicación empaquetada activa los fusibles del entorno: el modo de ejecución de node está desactivado, la variable NODE_OPTIONS y las opciones de inspección están desactivadas, el cifrado de cookies está activado, solo se puede cargar el archivo empaquetado y se comprueba su integridad.

Licencias sin vigilancia

Una licencia es un token firmado: un conjunto de declaraciones (plan, funciones, caducidad, límite de dispositivos, días de gracia) y una firma Ed25519 sobre ellas. La aplicación verifica la firma en tu equipo con una clave pública integrada; la clave privada vive solo en el servidor de licencias. Las comprobaciones de funciones se ejecutan en el proceso principal, dentro de los controladores que guardan, exportan y leen datos, así que una interfaz modificada no puede activar funciones.

La gestión del tiempo es monótona. La aplicación recuerda la última hora que ha visto y nunca retrocede, así que atrasar el reloj no amplía una prueba ni un periodo de gracia. La prueba y el periodo de gracia se cuentan a partir de ese reloj.

La llamada de licencia envía una clave de licencia y un identificador de dispositivo, y nada sobre tus diseños.

Dependencias y pruebas

El JavaScript que se entrega es reducido: React, three.js, una pequeña biblioteca de estado, un motor SQLite compilado a WebAssembly y los paquetes propios del proyecto. El motor SQLite no necesita compilación nativa, lo que elimina una clase de problemas de compilación por plataforma.

El comportamiento de seguridad está cubierto por pruebas: comprobaciones del remitente, validación de rutas y argumentos, escrituras con salto de directorio y con enlaces, JSON demasiado grande y mal formado, refuerzo del marcado de impresión, la lista de URL permitidas y la política de contenido; cargas de inyección SQL; bytes mágicos de acabados, tamaños de cabecera, bombas de descompresión, saltos de directorio, enlaces y manipulación; y pruebas de extremo a extremo que falsifican rutas, intentan exportaciones inseguras, infringen la política de contenido, navegan, abren ventanas, envían llamadas desde una ventana ajena y alimentan archivos hostiles y marcado de PDF hostil.

Si encuentras un problema de seguridad, escribe a hello@panelcraft.store con los detalles.

El programa en imágenes

Diagrama: un solo archivo de proyecto que alimenta las piezas derivadas, un plano de corte, un presupuesto y los documentos.
Un archivo, todo derivado: Producto.
El diálogo del paquete para el taller con ocho archivos escritos.
El paquete para el taller: Documentos.
La biblioteca de materiales con muestras de acabado, tamaños de tablero y precios.
Tus tableros y precios: Bibliotecas.
La pantalla de inicio de PanelCraft con Nuevo proyecto, Abrir archivo, tipos de mueble y plantillas.
La pantalla de inicio: Guía del usuario.
Escritorio en L con tapa de nogal, soportes de roble claro y cajonera, con las medidas generales.
Diseño libre: Diseño.
La pestaña Plano de corte con dos tableros optimizados de un armario con puertas correderas, el desperdicio y las medidas de las piezas.
Planos de corte: Corte y optimización.

Pruébalo en tu propio equipo

Descarga PanelCraft para Windows o macOS y pasa por él un trabajo real, del diseño al presupuesto. La prueba de 14 días incluye todas las funciones de Studio.

¿Prefieres preguntar antes? Escribe a hello@panelcraft.store o consulta las preguntas frecuentes.