
Le Security Assertion Markup Language (SAML) est un standard ouvert permettant d'échanger des données d'authentification et d'autorisation entre parties dans un système d'identité fédérée. Il permet l'authentification unique (SSO) entre domaines. Les composants clés sont :
Dans un flux SAML typique, le SP redirige l'utilisateur vers l'IdP pour l'authentification. L'IdP renvoie une réponse SAML signée contenant des assertions sur l'utilisateur (par exemple, e-mail, nom). Le SP valide la signature et provisionne ou connecte l'utilisateur.
CVE-2021-21239 est une vulnérabilité de contournement de la validation de signature dans la bibliothèque pysaml2 (versions <6.5.0), utilisée par Redash <=10.1.0 pour le SSO SAML. À un niveau élevé, elle permet à un attaquant de falsifier une réponse SAML avec une clé publique intégrée arbitraire, permettant l'usurpation d'identité d'un utilisateur et l'élévation de privilèges via le provisionnement juste-à-temps (JIT).
La vulnérabilité provient de la façon dont pysaml2 invoque xmlsec1 pour vérifier les signatures SAML. Par défaut, Xmlsec1 privilégie les clés publiques intégrées dans <ds:KeyInfo> de la réponse SAML plutôt que le certificat IdP configuré. Un attaquant peut élaborer une réponse SAML avec une paire de clés RSA auto-générée, intégrer la clé publique dans <ds:RSAKeyValue> et signer l'assertion avec la clé privée. Étant donné que pysaml2 ne restreint pas xmlsec1 à n'utiliser que le certificat IdP de confiance, la signature falsifiée est considérée comme valide, ce qui permet à l'attaquant de se connecter en tant que n'importe quel utilisateur (par exemple, admin) et d'obtenir les plus hauts privilèges.
Au niveau du code, la vulnérabilité se trouve dans sigver.py de pysaml2 (fonction check_signature). La liste de commandes xmlsec1 ne contient pas l'option --enabled-key-data raw-x509-cert, ce qui permet à xmlsec1 d'utiliser des clés intégrées non fiables :
com_list = [
self.xmlsec, '--verify', '--enabled-reference-uris', 'empty,same-doc',
'--pubkey-cert-pem', cert_file_name,
'--id-attr:%s' % id_attr, node_name,
'--node-id', nodeid, '--output', output_file_name, xml_file_name
]
Cela permet des attaques où l'attaquant modifie l'e-mail dans <saml:NameID> pour usurper l'identité de n'importe quel utilisateur, en tirant parti du provisionnement JIT.
Pour tester l'exploit, une instance Redash locale (v10.1.0 ou antérieure) est déployée à l'aide de Docker Compose. La configuration implique la mise en place du SSO SAML avec l'IdP de Google :
Cette configuration permet de tester la réponse SAML falsifiée envoyée via un script Python ou Burp Suite, en vérifiant l'élévation de privilèges.
La vulnérabilité découle du fait que l'invocation de xmlsec1 par pysaml2 permet d'utiliser des clés intégrées pour la vérification, contournant ainsi le certificat IdP de confiance. Un attaquant génère une paire de clés RSA, élabore une réponse SAML avec la clé publique dans <ds:RSAKeyValue>, modifie les attributs (par exemple, l'e-mail pour celui de l'admin) et signe l'assertion. Xmlsec1 vérifie à l'aide de la clé intégrée et la considère comme valide.
Le correctif a été implémenté dans pysaml2 v6.5.0 (commit initial le 17 janvier 2021) dans src/saml2/sigver.py. La liste de commandes xmlsec1 a été mise à jour pour inclure --enabled-key-data raw-x509-cert, limitant la vérification au certificat IdP configuré :
com_list = [
self.xmlsec, '--verify', '--enabled-reference-uris', 'empty,same-doc',
'--pubkey-cert-pem', cert_file_name,
'--enabled-key-data', 'raw-x509-cert',
'--id-attr:%s' % id_attr, node_name,
'--node-id', nodeid, '--output', output_file_name, xml_file_name
]
Cela impose la validation de la chaîne de confiance, empêchant l'utilisation de clés intégrées. Redash a corrigé ce problème en mettant à niveau pysaml2 dans les versions ultérieures (par exemple, v11+). Les versions vulnérables n'utilisaient pas --insecure ; le bug était l'absence de l'option de restriction.
Le code de l'exploit est implémenté dans cve-2021-21239.py. Ce script Python automatise le processus de falsification d'une réponse SAML pour exploiter CVE-2021-21239 dans Redash <=10.1.0, permettant l'usurpation d'identité d'un utilisateur et l'élévation de privilèges via le provisionnement JIT. L'exploit cible l'IdP SAML de Google Workspace, mais l'attaque a été testée avec d'autres IdP (keycloak). Le script effectue les étapes suivantes :
email="[email protected]").idpid à partir du point de terminaison de connexion SAML de Redash s'il n'est pas fourni, garantissant la compatibilité avec la configuration de la cible.SAMLResponseTempalte.xml) avec des espaces réservés pour l'e-mail, les noms, les horodatages et l'ID d'assertion. Des horodatages UTC dynamiques sont générés avec une fenêtre de validité de 5 minutes pour passer la validation de Redash.xmlsec pour signer l'élément <saml:Assertion> avec RSA-SHA256, en intégrant la clé publique dans <ds:RSAKeyValue> pour exploiter la vulnérabilité./saml/callback?org_slug=default).L'exploitation de CVE-2021-21239 a nécessité l'élaboration d'une réponse SAML falsifiée que Redash accepte via le provisionnement JIT. Difficultés clés et contournements :
<ds:RSAKeyValue>, avec signature à l'aide de la clé privée.xmlsec1 ont fonctionné, mais la bibliothèque Python xmlsec a provoqué des incohérences de digest en raison de problèmes d'espacement/canonicalisation. Contourné en sérialisant le XML sur une seule ligne (etree.tostring(..., pretty_print=False)) avant la signature.NotOnOrAfter trop lointain provoquait le rejet ; contourné en utilisant des horodatages UTC dynamiques avec une validité de 5 minutes.SAMLResponse, provoquant des échecs d'analyse ; contourné en envoyant des données de formulaire brutes.Ces difficultés soulignent la nécessité d'une manipulation précise du XML et d'une configuration d'environnement adéquate pour exploiter efficacement la vulnérabilité. Le code d'exploit fourni le démontre avec succès, en falsifiant une réponse SAML pour usurper l'identité d'utilisateurs et obtenir un accès.