Sécurité

Laboratoire d'attaques SAML

Votre application accepte-t-elle ce qu'elle devrait refuser ? ID-Kit joue l'IdP et envoie des réponses piégées : vous vérifiez que chaque piège est bien refusé.

Comment ça marche

  1. Créez un fournisseur d'identité de test et reliez-le à votre application.
  2. Lancez une connexion. À l'étape « Qui voulez-vous simuler ? », choisissez un scénario ci-dessous.
  3. Votre application doit réagir comme indiqué. Si elle accepte un piège, c'est une faille à corriger.

Attaques classiques

Attaque « signature wrapping »

Votre application doit refuser ou lire uniquement l'assertion signée. Si elle connecte « admin@evil.example », elle est vulnérable.

Injection de commentaire XML dans le NameID

Votre application doit lire le NameID COMPLET (alice@example.test.evil.example) ou refuser. Si elle comprend « alice@example.test », elle est vulnérable à l'attaque de 2018 : un attaquant pourrait se faire passer pour quelqu'un d'autre.

Aucune signature

Votre application doit refuser : rien ne prouve que la réponse vient de l'IdP.

Contenu modifié après signature

Votre application doit refuser : l'identité a été changée après la signature.

Signée avec une autre clé

Votre application doit refuser : la signature n'est pas celle du certificat de confiance.

Deux assertions avec le même identifiant

Votre application doit refuser : un identifiant d'assertion doit être unique, sinon la signature peut être détournée.

Deux restrictions d’audience, dont une fausse

Votre application doit refuser : toutes les AudienceRestriction doivent être satisfaites (c'est un ET logique).

Attributs hostiles (HTML, guillemets, Unicode)

Votre application doit afficher ces valeurs sans les exécuter : pas de script, pas de HTML interprété, pas de plantage sur les guillemets ou les emojis.

Assertion à usage unique (OneTimeUse)

Votre application doit refuser un second envoi de la même assertion (rejeu). Essayez d'envoyer deux fois la même réponse.

InResponseTo absent

Pour une connexion lancée par votre application, elle doit refuser une réponse qui ne répond à aucune demande (sauf si elle accepte les connexions lancées par l'IdP).

Contenu de la réponse

Assertion expirée

Votre application doit refuser : la période de validité est déjà terminée.

Assertion pas encore valide

Votre application doit refuser : la période de validité n'a pas commencé (utile pour tester la tolérance d'horloge).

Horloge de l'IdP en avance de 5 min

Une application avec une tolérance d'horloge de 2 min refuse ; avec 5 min ou plus, elle accepte. Permet de connaître sa tolérance.

Horloge de l'IdP en retard de 5 min

L'assertion a expiré depuis 5 minutes : refusée si la tolérance est inférieure à 5 min.

Session déjà expirée (SessionNotOnOrAfter)

Votre application doit considérer la session de l'IdP comme terminée : elle ne doit pas ouvrir une session plus longue que celle-ci.

Mauvaise audience

Votre application doit refuser : l'assertion est destinée à une autre application.

Aucune restriction d'audience

Votre application stricte doit refuser : rien n'indique pour quelle application l'assertion est faite.

Mauvais destinataire (Recipient)

Votre application doit refuser : la confirmation désigne une autre adresse ACS.

Mauvaise destination (Destination)

Votre application doit refuser : la réponse est adressée à une autre URL.

Réponse à une autre demande (InResponseTo)

Votre application doit refuser : cette réponse ne correspond à aucune de ses demandes.

Mauvais émetteur (Issuer)

Votre application doit refuser : la réponse prétend venir d'un autre IdP que celui qu'elle a configuré.

Identifiant (NameID) absent

Votre application doit refuser ou afficher une erreur claire : elle ne sait pas qui se connecte.

Aucun attribut envoyé

La connexion peut réussir, mais l'application doit gérer l'absence de nom, d'e-mail ou de groupes sans planter ni donner de droits par défaut.

Niveau d'authentification plus faible que demandé

Si votre application a demandé une authentification forte (RequestedAuthnContext), elle doit refuser : l'IdP indique seulement un simple mot de passe.

Rotation : l'IdP a changé de certificat

Si l'application a bien les DEUX certificats (ancien + nouveau, option « publier le certificat suivant »), elle accepte ; si elle n'a gardé que l'ancien, elle refuse. Révèle si une rotation de certificat provoquera une panne.

Assertion chiffrée pour un autre certificat

Votre application doit refuser : elle ne peut pas déchiffrer l'assertion et doit l'indiquer clairement (sans planter).

Refus de l'IdP

Connexion refusée par l'IdP

Votre application doit afficher une erreur claire et ne connecter personne.

Refus : NoPassive (connexion silencieuse impossible)

Votre application, si elle a demandé IsPassive, doit rediriger vers un écran de connexion normal au lieu d'afficher une erreur brute.

Refus : RequestDenied

Votre application doit afficher une erreur claire (l'IdP refuse de traiter la demande), sans planter ni boucler.

Erreur du demandeur : InvalidNameIDPolicy

Votre application doit signaler que sa demande (format de NameID) n'est pas acceptée par l'IdP.

Refus : VersionMismatch

Votre application doit afficher une erreur de protocole propre, sans planter.

N'y envoyez jamais de secret réel : ce sont des identités fictives.