Il bloque les pubs YouTube sur Apple TV en modifiant un seul octet de Protobuf
Les Protocol Buffers (Protobuf) inventés par Google sont une merveille d’ingénierie. C’est un format de sérialisation de données binaire, compact et performant qui alimente une grande partie de l’infrastructure moderne du web. Pour faire simple, Protobuf permet de transformer des données structurées en une séquence d’octets ultra-compacte, beaucoup plus légère et rapide à traiter que du XML ou du JSON. C’est comme si vous compressiez un fichier texte en binaire, mais avec la possibilité de le lire sans le décompresser complètement. Ce truc sert notamment aux échanges client-serveur à grande échelle, comme ceux de… YouTube.
Cependant, comme toute technologie complexe, Protobuf présente des particularités qui peuvent être exploitées. Ça tombe bien, Eric Draken a justement trouvé comment exploiter à son compte Protobuf pour se débarrasser une bonne fois pour toute des pubs de YouTube présentes sur les apps de l’Apple TV et de l’iPhone.
Lassé par l’abus de pub sur Youtube (qu’on pourrait renommé Youpub finalement…), Eric a décidé de creuser un peu l’architecture du système publicitaire du site. Son aventure a commencé par la mise en place d’un routeur pfSense sur du matériel dédié (un mini PC avec processeur J4125 supportant les instructions cryptographiques AES-NI, 32 Go de RAM et un SSD de 128 Go). Objectif, avoir assez de puissance pour intercepter et modifier le trafic HTTPS en temps réel.
Sa première stratégie a été de bloquer les publicités au niveau DNS avec pfBlockerNG. Sauf que YouTube est malin, les vidéos publicitaires viennent du même domaine que les vidéos normales. Échec et mat donc pour le blocage DNS classique !
Il a alors tenté de tromper l’algorithme publicitaire de YouTube en se faisant passer pour un Italien de 70 ans via un tunnel VPN. Pourquoi me direz vous ? Et bien parce que les annonceurs dépensent moins pour cibler ce public, mais même si les publicités italiennes étaient moins nombreuses, elles restaient quand même présentes.
C’est là que les choses deviennent hardcore. Eric a décidé alors de configurer un proxy MITMProxy pour intercepter et déchiffrer tout le trafic HTTPS entre ses appareils Apple et YouTube. Il a alors dû installer un certificat CA de confiance sur son Apple TV et son iPhone, permettant ainsi d’espionner les échanges et après analyse du trafic, il a découvert que YouTube utilisait Protobuf pour transmettre les données, y compris les informations publicitaires.
Après plusieurs tentatives infructueuses pour bloquer les URL publicitaires (ce qui faisait planter l’application) ou modifier les réponses JSON (trop lourd en ressources), il a alors trouvé la faille ultime : le format Protobuf est conçu pour être rétrocompatible ! Ce qui signifie en clair qu’il ignore les champs qu’il ne reconnaît pas. Du coup, en changeant simplement un octet dans la clé d’un champ spécifique (de 49399797 à 49399796), toute la section contenant les informations publicitaires est devenue “invisible” pour l’application !
Cool ! Comme ça, terminé les pubs pour Eric !
Maintenant, si vous voulez faire pareil chez vous, c’est possible. Je vous invite d’abord à lire son article complet qui détaille toute l’opération. Mais voici comment procéder, si vous avez un niveau technique solide et quelques heures devant vous.
Attention quand même, cette solution n’est pas sans risques. Vous interceptez et modifiez du trafic chiffré, ce qui pourrait avoir des implications en termes de sécurité. Ne l’utilisez que sur votre réseau personnel et comprenez ce que vous faites !
Pour commencer, il vous faudra le même genre de mini PC que lui, avec support AES-NI (comme un J4125), au moins 8 Go de RAM (idéalement 16+ pour être tranquille), un SSD de 64 Go minimum, plusieurs ports réseau et des connaissances en réseau et systèmes Linux / Unix.
Téléchargez ensuite l’image pfSense et installez le sur votre mini PC. Configurez ensuite les interfaces réseau (WAN pour Internet, LAN pour votre réseau principal) puis activez l’instruction AES-NI dans System > Advanced > Miscellaneous. Créez ensuite un réseau dédié pour vos appareils Apple (par exemple 172.31.1.0/24) et configurez les règles de pare-feu pour permettre la communication entre les réseaux. L’idée est d’isoler ces appareils pour mieux contrôler leur trafic.
La partie délicate arrive… créez une jail FreeBSD sur pfSense et installez MITMProxy avec les commandes pkg install mitmproxy
et pkg install sudo
. Générez ensuite un certificat CA avec MITMProxy et installez-le sur vos appareils Apple. Pour l’Apple TV, accédez à Réglages > Général > Confidentialité > Gérer les profils et certificats. Sur iPhone, allez dans Réglages > Général > Profil ou Gestion des profils.
Créez ensuite des règles NAT dans pfSense pour rediriger le trafic HTTP/HTTPS de vos appareils Apple vers le proxy MITMProxy. Ceci permettra d’intercepter les communications.
Voici maintenant la partie fun. Vous devez créer un fichier youtube.py dans la jail FreeBSD avec le script suivant.
Lancez ensuite MITMProxy avec ce script :
mitmdump --listen-port 8080 --listen-host 127.0.0.1 -s "youtube.py"
À ce stade, toutes les pubs YouTube devraient disparaître de vos appareils Apple. Comme je vous le disais, cette technique fonctionne en modifiant un seul octet dans les messages Protobuf, ce qui fait que l’application YouTube “oublie” qu’elle devait vous montrer des publicités. L’avantage c’est que contrairement aux solutions qui bloquent simplement les URL publicitaires, cette méthode évite que l’application YouTube ne plante ou ne se mette en boucle d’attente.
Malin ! Mais c’est quand même beaucoup de boulot. J’espère que lui ou un autre mettra à dispo une image Docker ou équivalent pour refaire tout ça en quelques minutes plus simplement.
Maintenant comme toujours avec le blocage publicitaire, c’est l’escalade technologique. Et une fois encore il y a des sociétés qui peuvent abuser comme c’est le cas pour Google, mais la pub c’est aussi un moyen simple de financer la création sur le net. D’ailleurs, en compensation pour ne pas léser Google, Eric a quand même souscrit un abonnement premium.
Je trouve ça bien de soutenir autrement quand on bloque la pub, car depuis la démocratisation des adblocks, je suis triste de voir tous ces sites français bien de chez nous qui n’ont pas réussi à survivre car la pub était leur seule source de revenu. Je pense par exemple à Hardware.fr, AnandTech, JackyPC… paix à leur âme. Et je vous parle pas de tous ces contenus qui se sont retrouvés derrière un paywall.
Malheureusement, tous les sites de par leur contenu n’ont pas vocations à fonctionner avec des abonnements ("payer pour ça ?") et n’ont pas forcement de communauté assez forte pour être portée par elle. Il n’y a pas de recette magique. Même ceux qui se sont lancé là dedans ont vite réintroduit de la publicité par la suite. C’était prévisible mais je trouve ça regrettable car même si la pub quand c’est mal fait et que ça n’apporte pas d’information intéressante, c’est pas ouf, voir le paysage web français s’éclaircir c’est encore moins ouf.
Mais bon, j’ai l’impression que tout le monde est bien plus heureux à s’informer via de grandes plateformes américaines ou chinoises qui les matraques de pub comme Twitter, TikTok ou YouTube plutôt que d’aller sur des sites web indépendants.
Je me fais vieux, je sais.