Nouvelle attaque de clickjacking SVG moderne trompant les utilisateurs et contournant les alertes
(lyra.horse)- Une nouvelle technique de clickjacking basée sur les filtres SVG a été proposée, étendant les attaques classiques de clic forcé en attaques interactives plus complexes
- Les éléments de filtre SVG tels que
feColorMatrix,feDisplacementMapet autres peuvent être appliqués à des iframes cross-origin, ce qui rend possibles des manipulations visuelles et l’exfiltration de données - En combinant ces filtres, des opérations de lecture de pixels, de logique et de manipulation d’interface conditionnelle deviennent possibles, permettant des scénarios de clickjacking multi-étapes ou d’incitation de saisie
- Un cas réel a prouvé l’attaque via une vulnérabilité de Google Docs, pour laquelle le chercheur a reçu une récompense de 3133,70 $ du programme Google VRP
- Cette technique met au jour une nouvelle surface d’attaque dans le modèle de sécurité des navigateurs et montre comment l’usage logique des filtres SVG peut devenir une menace
Vue d'ensemble du clickjacking SVG
- Le clickjacking traditionnel consiste à superposer une iframe pour pousser un utilisateur à cliquer sans le vouloir
- Le clickjacking SVG récemment proposé exploite des filtres SVG pour permettre des interactions et des fuites de données plus complexes
- Des filtres comme
feColorMatrixetfeDisplacementMaps’appliquent aussi aux documents cross-origin, permettant de manipuler visuellement du contenu externe
Composition des filtres SVG
- Les principaux éléments de filtre sont
<feImage>,<feFlood>,<feOffset>,<feDisplacementMap>,<feGaussianBlur>,<feTile>,<feMorphology>,<feBlend>,<feComposite>, **<feColorMatrix> - Ils combinent et transforment des images d’entrée pour produire de nouvelles images, et peuvent être chaînés entre eux
- Cette combinaison offre une grande liberté pour implémenter des effets visuels, masquages et manipulations de couleurs
Exemples d'attaque
- Fausse captcha : utilisation de
feDisplacementMappour déformer du texte et amener l’utilisateur à entrer un code sensible - Masquage de texte gris (grey text hiding) : suppression d’indices et de messages d’erreur dans les champs via
feCompositeetfeMorphology, afin d’inciter l’utilisateur à saisir le mot de passe choisi par l’attaquant - Lecture de pixels : détection de la couleur de pixels précis pour contrôler le comportement des filtres, permettant des attaques réactives détectant clics, survols et état des saisies
Logique booléenne et attaques composées
- En combinant
feBlendetfeComposite, il est possible d’implémenter des portes logiques telles que AND, OR, XOR, NOT - Cela permet de construire une circuiterie logique complète directement dans le filtre SVG et d’automatiser des scénarios de clickjacking en plusieurs étapes
- Dans l’exemple d’attaque de l’application Securify, l’ouverture de boîtes de dialogue, les clics sur cases à cocher et les clics sur boutons sont contrôlés de façon logique pour tromper l’utilisateur
Cas réel : vulnérabilité Google Docs
- Détection et manipulation via la logique de filtre SVG des popups et champs de saisie apparus après un clic sur le bouton « Generate Document » de Google Docs
- L’état de focus des champs, les textes gris et les écrans de chargement sont détectés en temps réel pour piloter le déroulement de l’attaque
- Cette attaque a été signalée à Google et a donné lieu à une prime de bug bounty de 3133,70 $
Application aux QR codes
- Une logique de génération de QR code peut être implémentée dans un filtre SVG, en encodant des données de pixels puis en les affichant sous forme de code QR
- Quand l’utilisateur scanne le QR code, les données sont envoyées au serveur contrôlé par l’attaquant
- L’usage de
feDisplacementMapet de la correction d’erreur Reed–Solomon permet de générer des QR codes lisibles
Potentiel d’usages supplémentaires
- Des usages variés sont possibles, comme la lecture de texte, l’exfiltration de données basée sur les clics, l’insertion de faux curseurs de souris
- Les attaques peuvent être mises en place sans JavaScript, avec seulement CSS/SVG, ce qui laisse entrevoir des possibilités de contournement du CSP
Intérêt de la recherche
- Le clickjacking logique basé sur les filtres SVG est une nouvelle technique non couverte par les travaux antérieurs
- Les travaux précédents présentaient SVG comme un simple outil de dissimulation visuelle ; cette recherche démontre au contraire l’exécution logique et le contrôle d’interactions
- L’auteur la présente comme une nouvelle classe de vulnérabilité, insistant sur la nécessité de revoir les mécanismes de sécurité des navigateurs
Conclusion
- Cette recherche est saluée comme le premier cas d’attaque de sécurité exploitant des filtres SVG comme un langage de programmation
- L’auteur prévoit d’en parler à la fin de 2025 lors de 39c3 et Disobey 2026
- Le billet a été rédigé avec 42 Ko de HTML/CSS/SVG uniquement, sans images ni JS, montrant la créativité possible en recherche de sécurité expérimentale
1 commentaires
Commentaire Hacker News
Si les développeurs configurent correctement l’en-tête X-Frame-Options, ce problème est résolu
Mais dans la pratique, j’ai l’impression qu’on réagira plutôt en supprimant la moitié de la spec SVG dans les navigateurs au nom de la sécurité
Et ce type d’attaque reste possible sur des sites où l’on peut faire de l’injection HTML sans passer par une frame
J’ai déjà désactivé SVG pour des raisons de sécurité
Mais ces jours-ci, je me demande s’il ne faudrait pas aussi désactiver le CSS
J’aurais aimé que le CSS reste un outil servant simplement à mettre en forme du texte, mais il s’est transformé en sorte de langage de programmation facile à détourner par les hackers ou les annonceurs
Aujourd’hui, c’est presque impossible
En voyant « l’exemple qui détecte si un pixel est d’un noir pur pour activer ou désactiver un filtre », j’étais complètement perdu
Je ne comprends pas pourquoi HTML/CSS est devenu aussi complexe
Il y a un
<checkbox>caché et un<label>; quand on clique, la case se coche ou se décoche, puis le style change selon l’état uniquement via le CSSLe SVG ne dessine en fait rien du tout et ne fait que définir des filtres
Le fait qu’il y ait deux
<feTile>pour séparer la zone de mosaïque et la zone de sortie est aussi étrangeEt c’est quoi encore ces éléments comme
<fake-frame>ou<art-frame>?Le fait qu’un clic sur
<label>bascule l’état de la case à cocher est un comportement natif du HTMLL’état est détecté avec le sélecteur CSS
:has()<feTile>est un unique élément de filtre, utilisé pour mettre l’image d’entrée en mosaïque ou la rogner<fake-frame>et<art-frame>sont des éléments personnalisés définis par l’auteurLe sujet est résumé dans ce billet de blog
Le clic sur
<label>qui déplace le focus reprend une tradition des interfaces desktopLa possibilité de changer le style selon l’état d’une case à cocher existe depuis l’époque de Firefox 1
L’intégration directe de filtres SVG dans du HTML est elle aussi une vieille fonctionnalité
Autrement dit, le problème n’est pas un nouvel HTML, mais une combinaison de vieilles fonctionnalités
Cette démo m’a rappelé les anciens hacks de Flash Player
C’est similaire à la façon dont on trompait les utilisateurs pour qu’ils autorisent l’accès au stockage système
Les graphismes vectoriels donnent vraiment l’impression d’être incapables de se contrôler eux-mêmes
Le SVG adder ressemble à une œuvre d’art. Vraiment superbe
J’ai pris comme référence ce post Stack Overflow
Sur mon Chrome Android, enfin plus précisément le navigateur Kiwi, l’affichage semble cassé ou bizarre, peut-être à cause du mode sombre
Je me demande si d’autres voient la même chose
Cet article m’a rappelé cette ancienne démo de calcul en CSS
Travail vraiment impressionnant. Je ne sais pas comment corriger ça, mais il faut un correctif rapidement
C’était un post vraiment excellent. J’ai pris beaucoup de plaisir à le lire