Les fournisseurs SaaS tiers se voient attribuer un rôle dont la politique de confiance nomme le compte AWS du fournisseur comme principal. AWS a conçu la condition external ID pour restreindre cette confiance à votre tenant spécifique ; lorsqu'elle est absente, tout client de ce fournisseur (ou quiconque peut faire assumer le rôle au fournisseur) profite de l'accès du fournisseur pour entrer dans le compte. C'est le problème du confused deputy.
Repérer la faille#
aws iam get-role --role-name <vendor-role> --query 'Role.AssumeRolePolicyDocument'
# Principal.AWS = the vendor account, and NO Condition on sts:ExternalId
Une confiance qui nomme un compte de fournisseur sans StringEquals sur sts:ExternalId est assumable par ce fournisseur pour le compte de n'importe quel tenant, y compris un que l'attaquant contrôle dans le produit du fournisseur.
Notes d'exploitation#
- L'attaque passe par la plateforme du fournisseur : vous configurez le fournisseur pour qu'il pointe vers le rôle victime, et le fournisseur (le deputy) l'assume pour vous.
- Même avec un external ID, une valeur devinable ou fuitée rouvre la voie : les external ID faibles valent donc autant qu'aucun.
- Croisez avec cross-account pour le cas plus simple où la confiance nomme directement un compte entier.
Outils#
- AWS CLI (
iam get-role) : lire le document de confiance. - PMapper : signale les rôles qui font confiance à des comptes externes.