Sicurezza e dati: il suo lavoro resta in locale

PanelCraft è un’applicazione desktop pensata per l’uso offline. Progetti, listini, schede clienti e immagini dei decori sono memorizzati sul suo computer, e l’applicazione è costruita in modo che un file ostile o un componente difettoso non possa andare oltre ciò che gli serve.

Domande sulla sicurezza: hello@panelcraft.store.

Pensata per l’uso offline

Progettazione, taglio, prezzi, disegni, documenti, export per lavorazioni e vista ambiente girano tutti in locale. L’interfaccia dell’applicazione non può caricare nulla dalla rete: i suoi criteri sui contenuti limitano ogni tipo di fonte all’applicazione stessa e la sessione predefinita annulla ogni richiesta tranne file locali, dati e URL blob.

Una sola cosa richiede internet: la licenza. L’applicazione si attiva una volta e poi verifica la licenza online alla scadenza del controllo. Se non raggiunge il servizio di licenza, continua a funzionare per un periodo di tolleranza di alcuni giorni, così un laboratorio con una connessione scadente non viene interrotto. Errori di rete e di server non rimuovono mai una licenza esistente; solo un rifiuto esplicito del servizio lo fa.

Nessun progetto, listino, scheda cliente, immagine di decoro o foto di un ambiente viene mai caricato.

Dove si trovano i suoi dati

Tutto è memorizzato sul suo computer, in posti che può trovare e salvare in backup.

DatiDoveNote
ProgettiDove salva il file .panelcraftScritti in modo atomico (file temporaneo, poi ridenominazione). L’apertura legge al massimo 50 MB.
Indice dei progetti, clienti, preventiviUn database SQLite locale nella cartella dati dell’applicazioneTenuto in memoria e salvato in modo atomico dopo ogni transazione. Un file illeggibile viene rinominato e messo da parte, mai eliminato.
Librerie e magazzinoFile JSON nella cartella dati dell’applicazioneLetti per al massimo 10 MB, verificati prima dell’uso.
Immagini dei decoriLa cartella dati dell’applicazione, memorizzate per hash del contenutoVerificate nel contenuto: 8 MB, da 16 a 8192 px, 36 megapixel per immagine.
Foto della vista ambienteUna copia ridotta nella cartella dati dell’applicazioneAl massimo 10 MB, verificata tramite i magic byte, cartella nominata con un hash dell’id del progetto.
LicenzaDue copie di un file di stato della licenza nella cartella dati dell’applicazioneVince la copia valida con l’orario di verifica più recente, perciò eliminare o modificare una copia non azzera il conteggio della prova.

Le esportazioni lasciano l’applicazione come file semplici: PDF, CSV, DXF, SVG e immagini. È Lei a scegliere dove vengono scritte e l’applicazione non decide mai un percorso al suo posto.

Da cosa difende il progetto

Il modello di minaccia individua quattro avversari. Un file malevolo o danneggiato che apre o importa (un progetto, un CSV, una libreria, un’immagine o un database) è trattato come dato non attendibile. Un’interfaccia compromessa, ad esempio per un difetto in una dipendenza, è trattata anch’essa come non attendibile: non deve poter leggere o scrivere file arbitrari, eseguire codice nel processo principale, aggirare le licenze né raggiungere la rete. Un utente locale che manomette i file di licenza o l’orologio è gestito a un livello ragionevole. E la catena di fornitura, le dipendenze npm ed Electron stesso, è mantenuta ridotta e rivista.

Restano fuori ambito un aggressore che già esegue codice come Lei, un sistema operativo malevolo e l’accesso fisico alla macchina. Nessuna applicazione desktop può difendersi da questi casi e non pretendiamo di farlo.

I controlli

AmbitoControllo
Isolamento del rendererRenderer in sandbox con isolamento del contesto e senza integrazione Node. Nessun contenuto remoto e nessuna web view incorporata. Sandbox dell’applicazione attiva per ogni finestra.
Chiamate al processo principaleOgni chiamata è verificata: il mittente deve essere il frame principale della pagina impacchettata, ogni argomento è controllato nel tipo e limitato nella dimensione, i campi sconosciuti vengono scartati e le estensioni di esportazione sono in una lista consentita.
Percorsi dei fileL’interfaccia non sceglie mai dove leggere o scrivere. Le letture provengono da finestre native di apertura, le scritture da finestre native di salvataggio o da file di proprietà dell’applicazione. Un percorso è accettato per il salvataggio solo se Lei lo ha scelto in una finestra in questa sessione oppure è già nell’indice scritto dal processo principale.
I/O dei file con limitiLe letture hanno un limite di dimensione (progetto 50 MB, CSV 10 MB, archivi 10 MB, database 512 MB, licenza 64 KB) e devono riguardare file normali, non dispositivi né cartelle. Le scritture usano un nome temporaneo casuale aperto in modo esclusivo e poi ridenominato, così un collegamento inserito ad arte non viene mai seguito.
Input malformatoIl testo di progetti, librerie e archivi deve essere interpretabile come oggetto o array JSON prima dell’uso. Gli errori di lettura diventano un messaggio pulito, mai un arresto anomalo.
Criteri sui contenutiCriteri di produzione: fonti di script, stili, immagini, caratteri e connessioni limitate all’applicazione stessa; niente eval; niente script o stili inline; niente frame né oggetti; niente destinazioni base o di moduli.
Rendering dei PDFUna finestra nascosta con JavaScript disattivato, una propria sessione in memoria che annulla tutto tranne gli URL di dati, permessi negati, navigazione e finestre popup negate e un timeout di 60 secondi. Il markup viene ripulito di nuovo nel processo principale, un criterio è inserito come primo elemento e vengono rimossi script, frame, oggetti, embed, elementi base e link e gestori di eventi. Il testo dell’utente viene neutralizzato quando si generano i documenti.
NavigazioneLa finestra può navigare solo verso la propria pagina; le nuove finestre sono sempre negate; i collegamenti web si aprono nel browser di sistema; web view e richieste di permessi sono negate.
ImmaginiLe foto di decori e ambienti sono verificate nel contenuto (magic byte e dimensione in pixel nell’intestazione), rifiutate se sono collegamenti, cartelle o file troppo grandi, memorizzate per hash e decodificate senza allentare i criteri sui contenuti.
DatabaseOgni query è un’istruzione preparata con parametri vincolati. L’unico punto che costruisce un elenco di colonne usa valori letterali fissi. I caratteri jolly sono neutralizzati e test avversari coprono i payload di injection.
Rafforzamento del runtimeL’applicazione impacchettata modifica i fuse del runtime: la modalità di esecuzione node è disattivata, la variabile NODE_OPTIONS e le opzioni di inspect sono disattivate, la cifratura dei cookie è attiva, si può caricare solo l’archivio impacchettato e ne viene verificata l’integrità.

Licenze senza sorveglianza

Una licenza è un token firmato: un insieme di attestazioni (piano, funzioni, scadenza, limite di dispositivi, giorni di tolleranza) e una firma Ed25519 su di esse. L’applicazione verifica la firma sul suo computer con una chiave pubblica incorporata; la chiave privata si trova solo sul server delle licenze. I controlli sulle funzioni girano nel processo principale, dentro i gestori che salvano, esportano e leggono i dati, perciò un’interfaccia modificata non può attivare funzioni.

La gestione del tempo è monotona. L’applicazione ricorda l’ultimo orario visto e non torna mai indietro, quindi riportare indietro l’orologio non prolunga una prova né un periodo di tolleranza. Prova e tolleranza sono contate a partire da quell’orologio.

La chiamata di licenza invia una chiave di licenza e un identificativo del dispositivo, e nulla sui suoi progetti.

Dipendenze e test

Il JavaScript distribuito è poco: React, three.js, una piccola libreria di stato, un motore SQLite compilato in WebAssembly e i pacchetti propri del progetto. Il motore SQLite non richiede una compilazione nativa, e questo elimina una classe di problemi di compilazione per piattaforma.

Il comportamento di sicurezza è coperto da test: controlli sul mittente, verifica di percorsi e argomenti, attraversamento di percorsi e scritture tramite collegamenti, JSON troppo grande o malformato, rafforzamento del markup di stampa, la lista consentita degli URL e i criteri sui contenuti; payload di SQL injection; magic byte dei decori, dimensioni dell’intestazione, bombe di decompressione, attraversamento, collegamenti e manomissioni; e test end-to-end che falsificano percorsi, tentano esportazioni non sicure, violano i criteri sui contenuti, navigano, aprono finestre, inviano chiamate da una finestra estranea e forniscono file ostili e markup PDF ostile.

Se trova un problema di sicurezza, scriva a hello@panelcraft.store con i dettagli.

Il programma in immagini

Schema: un unico file di progetto alimenta i pezzi derivati, lo schema di taglio, il preventivo e i documenti.
Un solo file, tutto derivato: Prodotto.
La finestra del pacchetto officina con otto file scritti.
Il pacchetto officina: Documenti.
La libreria dei materiali con campioni di decori, formati dei fogli e prezzi.
I suoi pannelli e i suoi prezzi: Librerie.
La schermata iniziale di PanelCraft con Nuovo progetto, Apri file, tipi di mobile e modelli.
La schermata iniziale: Guida utente.
Scrivania a L con piano in noce, supporti in rovere chiaro e cassettiera, con le dimensioni complessive indicate.
Progetto libero: Progettazione.
La scheda Schema di taglio con due fogli ottimizzati di un armadio con ante scorrevoli, scarto e misure dei pezzi.
Schemi di taglio: Taglio e ottimizzazione.

Lo provi sul suo computer

Scarichi PanelCraft per Windows o macOS e porti un lavoro reale dal disegno al preventivo. La prova di 14 giorni include tutte le funzioni Studio.

Preferisce scriverci prima? Ci contatti a hello@panelcraft.store o consulti le domande frequenti.