Accueil

Sécurité

La surface d'attaque d'un navigateur se divise en deux : le moteur, que nous n'avons pas écrit, et le shell, que nous avons écrit. Les deux se comportent très différemment, nous les décrivons donc séparément. Les lacunes connues de cette version figurent en fin de page.

Le moteur : Chromium, V8, Skia

Au cours de 2026, des dizaines de failles de sécurité mémoire ont été corrigées dans Chrome, dont six zero-days exploités dans la nature. Ce code n'est pas le nôtre et nous ne pouvons pas le corriger ; la seule défense ici consiste à maintenir le moteur à jour.

D'où une règle sans détour : Girginos Browser n'est pas publié sur une version d'Electron arrivée en fin de vie. Electron ne prend en charge que ses trois dernières versions majeures, et la version épinglée est vérifiée avant chaque publication. Nous utilisons actuellement Electron 44.2.0 avec Chromium 152.0.7977.76.

Le shell : le code que nous avons écrit

Voici les décisions d'architecture côté shell :

  • Chaque onglet est une WebContentsView distincte. Le contenu des pages s'exécute avec sandbox: true, contextIsolation: true et nodeIntegration: false, et ne reçoit aucun script de préchargement.
  • La fenêtre de l'interface s'exécute elle aussi en bac à sable et partage une session avec les onglets ; ainsi, les requêtes propres à l'interface passent également par le bloqueur et portent les en-têtes DNT.
  • Les canaux IPC ne sont acceptés que depuis le cadre principal de la fenêtre de l'interface. Les écritures de réglages passent par une validation de clé et de type.
  • Les téléchargements sont désignés par un identifiant ; un chemin de fichier brut venant de l'interface n'est jamais ouvert.
  • La navigation déclenchée par la page se limite à http(s) et view-source:http(s). file: et chrome: ne s'ouvrent que si l'utilisateur les saisit lui-même dans la barre d'adresse.
  • Le passage à une application externe se limite à une liste étroite de schémas : mailto:, tel:, sms:, magnet:, ftp(s):, webcal:. Une seule boîte de confirmation peut être ouverte à la fois.
  • Les origines opaques — celles dont l'origine est null, comme data: et about: — sont toujours refusées lors des demandes d'autorisation.
  • La correction orthographique est désactivée, parce que Chromium télécharge ses fichiers de dictionnaire depuis un serveur Google.
  • Les données sont écrites de façon atomique, via un fichier temporaire puis un renommage.

Vecteurs d'attaque et parades

CatégorieExempleParade
Usurpation de la barre d'adresseRLO/bidi, CR-LF, NUL, bank.com@evil.com, remplissage par des espaces, homographes IDNLes caractères invisibles et les espaces restent encodés en pourcentage, les identifiants sont masqués, le punycode est affiché
Dissimulation du domaineaccounts.google.com.giris.evil.comLe domaine enregistrable est écrit en pleine couleur, le reste est atténué
Imitation d'une page internenewtab.html, une copie téléchargéeL'adresse complète doit correspondre ; aucune recherche de sous-chaîne n'est faite
Fausse interface en plein écranune page passe en plein écran et dessine une fausse barre d'outilsLa vue de la page n'est jamais agrandie par-dessus le shell
Évasion de schémafile:, chrome:, blob:, view-source:file:Navigation déclenchée par la page en http(s) uniquement
Appel d'une application externems-msdt:, search-ms:, ms-appinstaller:Liste d'autorisation étroite et boîte de confirmation unique
Ruses sur le nom de téléchargementevil.exe / evil.exe., point ou espace final, extension masquée par RLONormalisation avant le contrôle de l'extension ; la décision suit le nom réel sur le disque
Contournement du bloqueurizleyici.com., point finalNormalisation de l'hôte

La chaîne de mise à jour signée

Le modèle de menace suppose que le serveur de mise à jour peut déjà être compromis. La séquence se déroule ainsi :

  1. Le manifeste signé et le fichier de signature qui l'accompagne sont récupérés.
  2. La signature est vérifiée sur les octets bruts du manifeste avec la clé publique Ed25519 intégrée à l'application. Si elle ne passe pas, pas un seul champ n'est lu.
  3. Des verrous de version s'appliquent : les retours à une version antérieure sont refusés ; un manifeste dont la date d'expiration est dépassée est refusé — cela protège d'un attaquant qui servirait indéfiniment un vieux manifeste pour geler les mises à jour ; une version intermédiaire est imposée là où c'est nécessaire ; et l'adresse de téléchargement doit être en https.
  4. La version et l'empreinte du paquet trouvées par le téléchargeur doivent correspondre exactement à celles du manifeste signé.
  5. Une fois le téléchargement terminé, l'empreinte sha512 du paquet est comparée à l'empreinte signée en temps constant.
  6. L'installation ne démarre qu'une fois que l'utilisateur l'a approuvée.

Si une seule étape échoue, aucune mise à jour n'a lieu. La clé privée n'est jamais conservée sur le serveur ; même si celui-ci était pris, un attaquant ne pourrait pas produire de manifeste valide.

Tests

118 tests unitaires, 73 régressions sur les vecteurs d'attaque et 46 tests de vérification des mises à jour sont exécutés sur le code, et le contrat IPC et DOM entre l'interface et le processus principal est testé à part. À côté de cela, des scripts de vérification de bout en bout tournent avant et après chaque publication, sur les fichiers réellement produits et sur le serveur en ligne.

Lacunes connues

Les points suivants manquent dans la 0.1.0. Les cacher ferait paraître le produit plus sûr qu'il ne l'est, nous les énonçons donc clairement.

Pas de Mark-of-the-Web
Aucun Zone.Identifier n'est écrit dans les fichiers téléchargés, si bien que Windows SmartScreen ne se déclenche pas pour eux. Le navigateur affiche son propre avertissement, mais la couche du système d'exploitation est absente.
Pas de certificat de signature de code
La signature de code du programme d'installation ne peut pas être vérifiée. Le manifeste signé règle la question pour les mises à jour, mais la première installation reste exposée.
Pas de Public Suffix List
Sur les domaines d'hébergement comme github.io, les exceptions de site et la mise en évidence dans la barre d'adresse couvrent plus large qu'elles ne le devraient.
Les erreurs de certificat suivent le comportement par défaut de Chromium
Aucun écran « continuer quand même » n'a été écrit ; avec un certificat invalide, la page ne s'ouvre tout simplement pas.
Le blocage se fait uniquement au niveau du domaine
Les traqueurs dissimulés derrière des enregistrements CNAME et les publicités servies depuis le site lui-même ne sont pas attrapés, et aucun filtre cosmétique n'est appliqué.

Pages liées