Réponse courte : rien de votre navigation ne sort de votre ordinateur, ni de votre appareil Android, vers l'éditeur. Seule une statistique anonyme lui parvient — pour compter les installations et pour afficher sur le site le total des requêtes bloquées —, et elle se coupe dans les réglages. Sur iPhone et iPad, c'est différent : les noms des sites que demande l'appareil passent, chiffrés, par un serveur de l'éditeur, qui les filtre sans les écrire.
Ce document décrit d'abord le programme pour ordinateur. La section « Sur Android » dit ce qui change, et ce qui ne change pas, dans l'application pour téléphone et boîtier Android. La section « Sur iPhone et iPad » renvoie à l'annexe livrée avec cette application, qui prévaut, pour elle, sur ce document.
Ce qui est traité, et où
AdHole voit forcément beaucoup de choses : c'est le prix d'un filtrage qui fonctionne. Il voit les noms de domaine que votre machine demande, et le contenu des pages web que votre navigateur charge, sauf pour les sites volontairement non déchiffrés. Tout ce traitement a lieu sur votre machine, dans la mémoire du programme, le temps de la requête.
Il voit aussi les noms de domaine demandés par les autres appareils que vous faites pointer sur ce PC : télévision, console, téléphones. Leur adresse IP locale apparaît dans le tableau de bord.
Ce qui est conservé
Tout ce qui est écrit sur le disque l'est dans le dossier de données d'AdHole :
C:\ProgramData\adhole sous Windows, /var/lib/adhole sous Linux.
| Donnée | Où, dans le dossier de données | Combien de temps |
|---|---|---|
| Les 1 000 dernières requêtes affichées au tableau de bord, avec l'adresse IP de l'appareil qui les a émises | nulle part : mémoire vive uniquement | jusqu'à l'arrêt du service |
| Les compteurs détaillés du tableau de bord : cache, latence, classements des domaines et des appareils | nulle part : mémoire vive uniquement | jusqu'à l'arrêt du service |
| Journal technique | logs |
pivote au-delà de 10 Mo ; la version précédente est conservée à côté |
| Listes de filtrage téléchargées | lists |
remplacées à chaque rafraîchissement |
| Certificat racine et sa clé privée | ca |
jusqu'à la désinstallation, et au-delà si vous ne supprimez pas le dossier de données |
| Attributions d'adresses du réseau, avec l'adresse matérielle et le nom de chaque appareil — uniquement si vous avez activé la distribution d'adresses | baux-dhcp.json |
jusqu'à suppression du fichier |
| Vos règles personnelles et réglages | à la racine du dossier | jusqu'à suppression |
| Les totaux de requêtes — vues, bloquées, part du filtre réseau, part du proxy — et la date à laquelle le comptage a commencé : des nombres seulement, aucun nom de domaine, aucune adresse, aucune heure de requête | compteurs.json |
jusqu'à suppression du fichier ou du dossier de données |
| Le numéro de la statistique anonyme et le repère de son dernier envoi — uniquement si la statistique anonyme est active | mesure.json |
jusqu'à la coupure de la statistique, qui efface le fichier |
Aucun historique de navigation n'est écrit sur le disque. Redémarrer le service efface les
dernières requêtes, les classements, le cache et la latence. Seuls les totaux survivent, dans
compteurs.json : des nombres, sans rien de ce qui a été demandé. Le journal technique ne contient
pas les pages visitées ; il peut contenir des noms de domaine en cas d'erreur, et davantage si vous
lancez le programme avec l'option -debug.
Ce qui n'est pas fait
- Le programme pour ordinateur et l'application Android n'envoient à l'éditeur aucune donnée de votre navigation. Seuls les résolveurs DNS voient les noms des sites demandés — et votre box, en clair, quand plus aucun résolveur chiffré ne répond (voir « Les seules connexions sortantes du programme »).
- Aucun compte, aucun mouchard et, sur ordinateur et sur Android, aucun identifiant durable : la seule mesure y est la statistique anonyme décrite ci-dessous.
- Aucune revente, aucun partage : il n'y a rien à vendre, et rien de votre navigation sur ordinateur ou sur Android ne parvient à l'éditeur.
- Sur iPhone et iPad, les trois points qui précèdent ne valent pas tels quels : voir « Sur iPhone et iPad ».
- Le tableau de bord ne charge aucune ressource distante : tout est servi depuis votre machine.
La statistique anonyme
Ce qui part. Peu après chaque démarrage du service, puis une fois par jour, avec la vérification
de version (point 4 ci-dessous) : un
numéro tiré au hasard sur votre ordinateur et renouvelé chaque mois (fichier mesure.json du
dossier de données), le numéro de version d'AdHole, le système avec son type de processeur (par
exemple windows-amd64), et le nombre de requêtes bloquées depuis l'envoi précédent. Rien
d'autre : ni nom, ni adresse matérielle, ni site visité.
Ce nombre de requêtes bloquées, précisément. C'est un simple nombre — par exemple 4128 —, et
il ne part qu'avec le numéro : aucun nom de domaine, aucune adresse, aucune date de navigation ne
l'accompagne, et il ne dit rien de ce qui a été bloqué. C'est un écart depuis le dernier envoi
accepté, jamais un cumul : le repère de cet envoi est gardé dans le même fichier mesure.json, si
bien que le changement mensuel de numéro ne fait pas recompter la même installation. Les totaux du
tableau de bord, eux, survivent au redémarrage du service : ils sont gardés sur votre disque, dans
compteurs.json, et ne contiennent que des nombres. Ce qui part reste l'écart depuis le dernier
envoi accepté, jamais ce total.
Pourquoi. Savoir combien d'installations sont actives chaque jour, chaque semaine et chaque mois, sur quels systèmes et dans quelles versions. Le nombre de requêtes bloquées sert, lui, à une seule chose : afficher sur le site d'AdHole le total des requêtes de publicité et de pistage bloquées par l'ensemble des installations. Le serveur compte aussi les téléchargements de chaque fichier publié, sans rien garder de la personne qui télécharge.
Ce que le serveur garde. Des totaux, par jour et par mois, et un seul grand total pour les requêtes bloquées, additionné sans lien avec l'installation qui l'a envoyé et sans conserver l'envoi lui-même ; un envoi qui annoncerait plus de dix millions de requêtes est écarté. Pour ne pas compter deux fois la même installation, il garde une empreinte du numéro, calculée avec une clé secrète qui ne quitte jamais le serveur et ne permet pas de retrouver le numéro : sept jours pour le décompte de la semaine, jusqu'à la fin du mois pour celui du mois, puis elle est effacée. Aucune adresse IP n'est enregistrée : le serveur ne tient aucun journal de ces connexions et n'écrit aucune adresse sur son disque. Pour écarter les numéros inventés en rafale, il garde seulement en mémoire vive une empreinte de l'adresse, calculée avec la même clé secrète, et le nombre de nouveaux numéros qu'elle a présentés dans la journée (50 au plus). Cette empreinte est oubliée au premier contact du jour suivant (heure UTC), ou au redémarrage du serveur.
Qui en répond. L'éditeur est responsable de ce traitement, fondé sur son intérêt légitime à
connaître l'usage de son logiciel (article 6, paragraphe 1, point f du règlement (UE) 2016/679). Il
le limite aux conditions que la CNIL admet pour une mesure d'audience dispensée de consentement :
finalité réduite au décompte, résultats agrégés, numéro renouvelé chaque mois, aucune transmission
à un tiers, et possibilité de s'y opposer à tout moment. Le serveur est chez l'hébergeur indiqué
dans MENTIONS-LEGALES.txt.
Comment la couper. Interrupteur « Statistiques anonymes » dans les réglages du tableau de bord
(ou mesure_audience: false dans config.yaml) : le numéro est aussitôt effacé de votre disque —
avec le repère du dernier envoi, qui est dans le même fichier —, le nombre de requêtes bloquées
cesse de partir, et la vérification de version part seule. Le fichier compteurs.json n'est pas
effacé : les totaux du tableau de bord continuent d'être comptés et gardés sur votre disque,
simplement plus rien n'en part vers l'éditeur. Vider l'adresse de mise à jour coupe, en plus, toute
connexion au serveur de l'éditeur.
Les seules connexions sortantes du programme
- Les résolveurs DNS, chiffrés par défaut : DNS-over-HTTPS chez Cloudflare, puis DNS-over-TLS chez Quad9 si Cloudflare n'a pas répondu dans la seconde ; la première réponse reçue est utilisée. Tant qu'ils répondent, votre fournisseur d'accès ne voit pas les noms que vous consultez ; le résolveur qui répond, lui, les voit. Quand plus aucun ne répond, c'est la box qui prend le relais et votre fournisseur d'accès les revoit : c'est le point suivant. La liste par défaut se termine par un résolveur de dernier recours non chiffré, 1.1.1.1 (Cloudflare), interrogé seulement quand les résolveurs chiffrés n'ont toujours pas répondu, trois secondes après la première demande : ces requêtes-là circulent en clair. Vous pouvez changer de résolveur, ou retirer celui-ci, dans les réglages.
- La box de votre réseau, uniquement quand tous les résolveurs ci-dessus ont échoué trois fois de suite. AdHole lui pose alors vos questions, en clair : votre fournisseur d'accès les voit de nouveau, comme avant l'installation. C'est un pis-aller, et nous le disons comme tel — il contourne le chiffrement que vous avez choisi, parce qu'un nom résolu en clair vaut mieux qu'un ordinateur sans internet. Il ne dure que le temps de la panne : toutes les dix secondes, AdHole réessaie les résolveurs chiffrés et y revient dès que l'un répond. Le filtrage ne change pas pendant ce temps — un domaine publicitaire est bloqué avant que la question ne parte, donc il reste bloqué. La box est détectée automatiquement ; à défaut, c'est le résolveur que vous avez réglé pour les noms locaux qui sert. AdHole ne se replie jamais sur lui-même, ni sur un résolveur déjà présent dans votre liste. Le journal du service note le début et la fin de chaque repli, avec sa durée.
- Les listes de filtrage, téléchargées une fois par jour chez leurs auteurs (AdGuard, hagezi) ou chez GitHub, qui en héberge une partie. Ces serveurs voient votre adresse IP, comme pour n'importe quel téléchargement. Chaque liste peut être désactivée.
- La vérification de version, peu après chaque démarrage du service puis une fois par jour :
un petit fichier indiquant la dernière version publiée, sur le serveur de l'éditeur (adresse
apercu.217-160-175-216.sslip.io, le même serveur que le site adhole.fr), accompagné de la statistique anonyme si elle est active. Ce serveur voit votre adresse IP et ne l'enregistre pas (voir « La statistique anonyme »). - Le téléchargement de l'installateur, quand une mise à jour existe et que l'installation automatique est active, depuis l'adresse que ce fichier indique.
Les points 4 et 5 se désactivent en vidant l'adresse de mise à jour dans le fichier
config.yaml du dossier de données.
Sous Windows, quand AdHole ne répond pas à temps, l'ordinateur interroge directement le résolveur de secours inscrit à l'installation — votre box, ou 1.1.1.1 si elle n'a pas été trouvée —, en clair et sans filtrage.
Les résolveurs, les auteurs des listes et GitHub sont des tiers : chacun est responsable, de son côté, de ce qu'il fait des adresses IP qu'il voit, et l'éditeur d'AdHole n'y a aucun accès.
Sur Android
L'application Android filtre sur l'appareil. Elle se déclare auprès d'Android comme réseau privé virtuel local — un VPN local — et, depuis la version 1.5.0, tout le trafic du téléphone passe par elle, sur le téléphone. Ce tunnel ne mène nulle part hors de l'appareil : ce qui y entre est traité sur place, puis repart du téléphone vers sa destination réelle. AdHole ne fait passer votre trafic par aucun serveur, ne masque pas votre adresse IP et ne fait transiter aucune de vos données par l'éditeur.
Ce qu'elle voit. Deux choses, et pas une de plus :
- les noms de domaine que l'appareil demande, pour toutes les applications ;
- le contenu des pages que vous ouvrez dans vos navigateurs, si vous avez installé son certificat racine (conditions d'utilisation, art. 5.6). Elle les ouvre pour y masquer les emplacements de publicité, refuser les bandeaux de cookies et retirer les publicités des vidéos YouTube. Cela ne vaut que pour les navigateurs que vous laissez cochés dans les réglages, et jamais pour les sites laissés chiffrés.
Ce qu'elle ne voit pas. Le contenu du trafic des applications autres que les navigateurs : Android ne permet pas à une application de lire le trafic chiffré d'une autre, et AdHole ne le tente pas — ces connexions sont relayées telles quelles, octet pour octet. Ni le contenu des sites laissés chiffrés, dans un navigateur comme ailleurs. Et tant que le certificat n'est pas installé, ou si vous coupez le réglage « Retirer les pubs et les bandeaux de cookies dans les navigateurs », aucune page n'est ouverte : l'application ne voit alors que des noms de domaine.
Tout ce traitement a lieu sur l'appareil, en mémoire, le temps de la requête ou de la page.
Ce qui est écrit sur l'appareil. Dans le dossier de données privé de l'application, qu'Android isole des autres applications, et nulle part ailleurs :
| Donnée | Où | Combien de temps |
|---|---|---|
| Les dernières requêtes affichées dans l'application, et les compteurs de la session en cours : classement des domaines bloqués, cache, latence | nulle part : mémoire vive uniquement | jusqu'à l'arrêt du filtrage |
| Vos règles personnelles et vos réglages (résolveurs choisis, navigateurs filtrés, sites laissés chiffrés, statistique anonyme) | à la racine du dossier | jusqu'à suppression |
| La liste de vos listes de filtrage, et les listes téléchargées | dans le dossier | remplacées à chaque rafraîchissement |
| Le certificat racine et sa clé privée — créés au premier appel du bouton « Installer le certificat » | ca |
jusqu'à la désinstallation de l'application |
| Les totaux de requêtes — vues et bloquées — et la date à laquelle le comptage a commencé : des nombres seulement, aucun nom de domaine, aucune adresse, aucune heure de requête | compteurs.json |
jusqu'à suppression du fichier ou du dossier de données, ou remise à zéro des compteurs |
| Le numéro de la statistique anonyme et le repère de son dernier envoi — uniquement si la statistique anonyme est active | mesure.json |
jusqu'à la coupure de la statistique, qui efface le fichier |
Aucun historique de navigation n'est écrit sur l'appareil, et le contenu des pages ouvertes
n'est jamais conservé : il est traité en mémoire, le temps de la page. Les dernières requêtes
affichées dans l'application, le classement des domaines bloqués, le cache et la latence vivent en
mémoire et disparaissent quand le filtrage s'arrête. Seuls les totaux survivent, dans
compteurs.json : des nombres, sans rien de ce qui a été demandé. C'est ce cumul que l'écran
d'accueil affiche, parce que sur un téléphone le filtrage s'arrête plusieurs fois par jour et que
les compteurs repartaient alors de zéro. Le bouton de remise à zéro des compteurs efface aussi ce
fichier.
La clé privée du certificat ne quitte jamais l'appareil. Elle est fabriquée sur le téléphone, l'éditeur n'en a aucune copie et ne peut pas en obtenir une. Ne copiez le dossier de données de l'application nulle part : qui mettrait la main sur cette clé pourrait se faire passer pour n'importe quel site, sur ce téléphone.
Les connexions sortantes sont les mêmes que sur ordinateur (voir la section précédente) : les résolveurs DNS chiffrés, le repli en clair quand ils sont tous tombés, le téléchargement des listes de filtrage, et la vérification de version accompagnée de la statistique anonyme. La cinquième fait exception : l'application ne télécharge jamais une mise à jour d'elle-même, c'est vous qui la déclenchez et Android qui l'installe.
Le repli existe sur Android, et sur un téléphone ce n'est pas toujours « la box ». Quand vos résolveurs chiffrés ont tous échoué trois fois de suite, l'application pose vos questions au résolveur du réseau auquel le téléphone est relié, en clair, le temps de la panne : la box en Wi-Fi, le relais de votre opérateur en données mobiles, celui de l'exploitant sur un Wi-Fi public. C'est donc lui qui voit ces noms-là — sur un réseau mobile, votre opérateur ; sur un Wi-Fi public, celui qui le tient. Ce repli contourne le chiffrement que vous avez choisi : c'est un pis-aller, pour ne pas vous laisser sans résolution de noms. L'application revient au chiffré dès qu'un résolveur répond, et le filtrage ne s'arrête pas pendant ce temps. Elle suit le réseau : quand le téléphone passe du Wi-Fi aux données mobiles, c'est le résolveur du nouveau réseau qui prend la place.
La statistique anonyme est identique — un numéro tiré au hasard et renouvelé chaque mois, la
version, le système, ici android (ou android-tv sur un boîtier), et le nombre de requêtes
bloquées depuis l'envoi précédent, qui alimente le total affiché sur le site. Elle est active par
défaut et se coupe dans les réglages de l'application : le numéro est alors effacé de l'appareil, et
ce nombre cesse de partir.
Vous pouvez couper le filtrage à tout moment, depuis l'écran d'accueil de l'application ou en retirant son autorisation dans les réglages d'Android. Le trafic de l'appareil reprend aussitôt son cours normal. Vous pouvez aussi ne couper que le nettoyage des pages, par son interrupteur dans les réglages : le filtrage par nom de domaine continue, et plus aucune page n'est ouverte.
Désinstaller l'application emporte son dossier de données, donc la clé privée. Le certificat
racine que vous avez installé, lui, reste dans le magasin d'Android : Android ne permet pas à une
application de l'en retirer. Retirez-le dans Réglages → Sécurité → Identifiants utilisateur, puis
adhole Root CA.
Sur iPhone et iPad
L'application iPhone et iPad ne filtre pas sur l'appareil. Elle inscrit dans les réglages DNS chiffrés d'iOS un filtre que l'éditeur fait fonctionner sur son serveur, et c'est vous qui l'activez dans les Réglages d'iOS. Les noms des sites que demande l'appareil passent alors, chiffrés, par ce serveur, avec l'adresse IP de votre connexion. Le serveur n'écrit ni ces noms ni votre adresse IP ; il ne conserve, sous un identifiant tiré au hasard sur l'appareil, que le nombre de demandes bloquées et deux dates, jusqu'à la remise à zéro du compteur ou 90 jours après la dernière demande comptée. La statistique anonyme et la vérification de version ne partent pas de cette application.
Le détail — chaque traitement avec sa base légale et sa durée, les destinataires, vos droits — est dans l'annexe de confidentialité livrée avec l'application, à la suite de ce document. Pour l'application iPhone et iPad, cette annexe prévaut sur ce document quand ils se contredisent.
Qui est responsable de quoi
Sur ordinateur et sur Android, l'éditeur n'est responsable d'aucun traitement relatif à votre navigation, au sens du règlement (UE) 2016/679 : aucune donnée de navigation ne lui parvient, et il n'a aucun moyen technique d'en obtenir. Il y est responsable d'un seul traitement : la statistique anonyme décrite plus haut. Sur iPhone et iPad, il est en outre responsable des traitements que fait le serveur du filtre : la résolution des noms demandés, un compteur par identifiant tiré au hasard et la limite de débit (voir « Sur iPhone et iPad »).
Sur ordinateur et sur Android, vous restez maître des données qui transitent par votre machine. Tant que l'usage reste strictement personnel ou domestique, il échappe au règlement européen par son article 2, paragraphe 2, point c. Dès que le filtre sert ailleurs — un commerce, une association, un poste professionnel, le réseau d'un tiers —, c'est vous qui devenez responsable du traitement des requêtes des appareils concernés, et à vous d'informer les personnes qui les utilisent.
Les sites laissés chiffrés
Certains sites ne sont jamais déchiffrés : AdHole ouvre un simple tunnel et ne voit rien de leur contenu. Une liste par défaut est livrée avec le programme ; elle couvre notamment les mises à jour du système, les magasins de jeux, les services de stockage, les messageries chiffrées, les services de paiement et les flux vidéo.
Cette liste ne peut pas être exhaustive, et l'éditeur ne prétend pas qu'elle le soit : aucun
éditeur ne peut recenser toutes les banques, mutuelles ou administrations du monde. La liste
réellement appliquée sur votre machine est consultable et modifiable dans les réglages du tableau de
bord, rubrique des sites laissés chiffrés (no_decrypt dans le fichier de configuration) ; sur
Android, dans les réglages de l'application, rubrique « Sites laissés chiffrés ». La liste de départ
y est la même que sur ordinateur, et elle s'applique de la même façon : ces sites ne sont jamais
ouverts, même dans un navigateur.
Il vous revient d'y ajouter les sites que vous ne voulez pas voir déchiffrés — banque, santé, impôts, employeur. Prenez cette minute avant votre prochaine connexion sensible.
Tout effacer
Sur ordinateur, désinstaller retire le service, le certificat et le proxy. Sous Windows, l'installateur propose ensuite de supprimer le dossier de données ; si vous refusez, la clé privée du certificat y reste. Sous Linux, il n'y a pas d'installateur : la remise en état se fait à la main, et le dossier de données reste tant que vous ne l'effacez pas.
Sur Android, désinstaller l'application emporte son dossier de données, clé privée comprise. Il reste un geste à faire : retirer le certificat racine du magasin d'Android, dans Réglages → Sécurité → Identifiants utilisateur.
adhole teardown (Windows, invite de commande administrateur)
sudo adhole teardown (Linux)
puis supprimez le dossier de données.
Sur iPhone et iPad : désactivez AdHole dans Réglages → Général → VPN et gestion de l'appareil → DNS, remettez le compteur à zéro dans l'application, puis supprimez-la. Le détail est dans l'annexe.
Contact
Pour toute question relative aux données personnelles : contact@antoinemoury.fr.
Identité complète de l'éditeur : MENTIONS-LEGALES.txt.