Sicurezza
La superficie d'attacco di un browser si divide in due: il motore, che non abbiamo scritto noi, e il guscio, che invece è nostro. I due si comportano in modo molto diverso, perciò li descriviamo separatamente. Le lacune note di questa versione sono in fondo alla pagina.
Il motore: Chromium, V8, Skia
Nel corso del 2026 in Chrome sono state corrette decine di falle di sicurezza della memoria, sei delle quali zero-day già sfruttati in attacchi reali. Questo codice non lo scriviamo noi e non possiamo correggerlo: qui l'unica difesa è tenere il motore aggiornato.
Per questo la nostra regola è netta: Girginos Browser non viene pubblicato su una versione di Electron a fine ciclo di vita. Electron supporta soltanto le sue ultime tre versioni principali e il vincolo di versione viene verificato prima di ogni rilascio. Al momento usiamo Electron 44.2.0 con Chromium 152.0.7977.76.
Il guscio: il codice che abbiamo scritto noi
Queste sono le scelte architetturali dal lato del guscio:
- Ogni scheda è una WebContentsView separata. I contenuti delle pagine girano con sandbox: true, contextIsolation: true e nodeIntegration: false, e non ricevono alcun preload.
- Anche la finestra dell'interfaccia gira in sandbox e condivide la sessione con le schede: così pure le sue richieste passano dal blocco e portano le intestazioni DNT.
- I canali IPC sono accettati solo dal frame principale della finestra dell'interfaccia. Le scritture delle impostazioni passano da una convalida di chiave e di tipo.
- I download sono indirizzati tramite identificatore; un percorso di file grezzo proveniente dall'interfaccia non viene mai aperto.
- Le navigazioni avviate dalla pagina possono essere solo http(s) e view-source:http(s). file: e chrome: si aprono solo se è l'utente a scriverli nella barra degli indirizzi.
- Il passaggio a un'applicazione esterna è limitato a un elenco ristretto di schemi: mailto:, tel:, sms:, magnet:, ftp(s):, webcal:. Può restare aperta una sola finestra di conferma per volta.
- Le origini opache — quelle il cui origin è null, come data: e about: — vengono sempre rifiutate nelle richieste di permesso.
- Il controllo ortografico è disattivato, perché Chromium scarica i file dei dizionari da un server Google.
- I dati si scrivono in modo atomico, tramite un file temporaneo e una rinomina.
Vettori d'attacco e contromisure
| Classe | Esempio | Contromisura |
|---|---|---|
| Falsificazione della barra degli indirizzi | RLO/bidi, CR-LF, NUL, bank.com@evil.com, riempimento con spazi, omografi IDN | Caratteri invisibili e spazi restano codificati in percentuale, le credenziali sono nascoste, il punycode è mostrato |
| Offuscamento del dominio | accounts.google.com.giris.evil.com | Il dominio registrabile è scritto a colori pieni, il resto è attenuato |
| Imitazione delle pagine interne | newtab.html, una copia scaricata | L'indirizzo deve corrispondere per intero; non si cerca alcuna sottostringa |
| Falsificazione dell'interfaccia a schermo intero | una pagina passa a schermo intero e disegna una finta barra degli strumenti | La vista della pagina non viene mai ingrandita sopra il guscio |
| Evasione di schema | file:, chrome:, blob:, view-source:file: | Nelle navigazioni avviate dalla pagina solo http(s) |
| Chiamata a un'applicazione esterna | ms-msdt:, search-ms:, ms-appinstaller: | Elenco di permessi ristretto e una sola finestra di conferma |
| Trucchi sul nome del download | evil.exe / evil.exe., punto o spazio finale, estensione nascosta con RLO | Normalizzazione prima del controllo dell'estensione; la decisione segue il nome reale su disco |
| Aggiramento del blocco | izleyici.com., punto finale | Normalizzazione dell'host |
La catena di aggiornamento firmata
Il modello di minaccia presume che il server degli aggiornamenti possa essere già compromesso. La sequenza funziona così:
- Si scaricano il manifest firmato e il file di firma che lo accompagna.
- La firma viene verificata sui byte grezzi del manifest con la chiave pubblica Ed25519 incorporata nell'applicazione. Se non passa, non viene letto nemmeno un campo.
- Si applicano i controlli di versione: il ritorno a una versione precedente è rifiutato; un manifest oltre la propria data di scadenza è rifiutato — questo protegge dall'attacco che serve all'infinito un vecchio manifest per congelare gli aggiornamenti; dove serve, si impone una versione intermedia; e l'indirizzo di download deve essere https.
- La versione e l'hash del pacchetto trovati dal downloader devono coincidere esattamente con quelli del manifest firmato.
- A download concluso, l'hash sha512 del pacchetto viene confrontato in tempo costante con quello firmato.
- L'installazione parte solo dopo la conferma dell'utente.
Se uno dei passaggi fallisce, l'aggiornamento non avviene. La chiave privata non risiede mai sul server: anche se il server venisse compromesso, un aggressore non potrebbe produrre un manifest valido.
Test
Sul codice girano 118 test unitari, 73 regressioni sui vettori d'attacco e 46 test di verifica degli aggiornamenti; il contratto IPC e DOM fra l'interfaccia e il processo principale è collaudato a parte. Accanto a questi, prima e dopo ogni rilascio girano script di verifica end-to-end sugli output reali e sul server in funzione.
Lacune note
Quello che segue manca nella 0.1.0. Nasconderlo farebbe sembrare il prodotto più sicuro di quanto sia, perciò lo diciamo apertamente.
- Nessun Mark-of-the-Web
- Sui file scaricati non viene scritto alcun Zone.Identifier, quindi Windows SmartScreen non interviene su di essi. Il browser mostra un proprio avviso, ma manca il livello del sistema operativo.
- Nessun certificato di firma del codice
- La firma del codice del programma di installazione non è verificabile. Il manifest firmato chiude questo punto per gli aggiornamenti, ma la prima installazione resta scoperta.
- Nessuna Public Suffix List
- Su domini di hosting come github.io, le eccezioni per sito e l'evidenziazione nella barra degli indirizzi coprono più di quanto dovrebbero.
- Gli errori di certificato usano il comportamento predefinito di Chromium
- Non è stata scritta una schermata «continua comunque» dedicata; con un certificato non valido la pagina semplicemente non si apre.
- Il blocco è solo a livello di dominio
- I tracker nascosti dietro record CNAME e la pubblicità servita dalla prima parte non vengono intercettati, e non si applica alcun filtro cosmetico.