Home

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

ClasseEsempioContromisura
Falsificazione della barra degli indirizziRLO/bidi, CR-LF, NUL, bank.com@evil.com, riempimento con spazi, omografi IDNCaratteri invisibili e spazi restano codificati in percentuale, le credenziali sono nascoste, il punycode è mostrato
Offuscamento del dominioaccounts.google.com.giris.evil.comIl dominio registrabile è scritto a colori pieni, il resto è attenuato
Imitazione delle pagine internenewtab.html, una copia scaricataL'indirizzo deve corrispondere per intero; non si cerca alcuna sottostringa
Falsificazione dell'interfaccia a schermo interouna pagina passa a schermo intero e disegna una finta barra degli strumentiLa vista della pagina non viene mai ingrandita sopra il guscio
Evasione di schemafile:, chrome:, blob:, view-source:file:Nelle navigazioni avviate dalla pagina solo http(s)
Chiamata a un'applicazione esternams-msdt:, search-ms:, ms-appinstaller:Elenco di permessi ristretto e una sola finestra di conferma
Trucchi sul nome del downloadevil.exe / evil.exe., punto o spazio finale, estensione nascosta con RLONormalizzazione prima del controllo dell'estensione; la decisione segue il nome reale su disco
Aggiramento del bloccoizleyici.com., punto finaleNormalizzazione 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ì:

  1. Si scaricano il manifest firmato e il file di firma che lo accompagna.
  2. 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.
  3. 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.
  4. La versione e l'hash del pacchetto trovati dal downloader devono coincidere esattamente con quelli del manifest firmato.
  5. A download concluso, l'hash sha512 del pacchetto viene confrontato in tempo costante con quello firmato.
  6. 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.

Pagine correlate