API6:2019 - Mass Assignment
Facteurs de menace / Vecteurs d'attaque | Faille de sécurité | Impact |
---|---|---|
Spécifique API : Exploitabilité 2 | Prévalence 2 : Détectabilité 2 | Technique 2 : Spécifique à l'organisation |
L'exploitation requiert généralement une compréhension de la logique métier, des relations entre objets, et de la structure de l'API. L'exploitation de l'assignation massive est plus facile dans les API, car par conception elles exposent l'implémentation sous-jacente de l'application ainsi que les noms des attributs. | Les frameworks modernes encouragent les développeurs à utiliser des fonctions qui lient automatiquement les entrées du client aux variables du code et aux objets internes. Des attaquants peuvent utiliser cette méthodologie pour modifier ou écraser des attributs d'objets sensibles que les développeurs n'avaient jamais eu l'intention d'exposer. | L'exploitation peut conduire à l'élévation des privilèges, la falsification des données, au contournement de mécanismes de sécurité, et plus encore. |
L'API est-elle vulnérable ?
Les objets des applications modernes peuvent posséder de nombreux attributs.
Certains de ces attributs doivent pouvoir être actualisés par le client (ex :
user.first_name
ou user.address
) et d'autres ne doivent pas pouvoir l'être
(ex : drapeau user.is_vip
).
Un point d'accès d'API est vulnérable s'il convertit automatiquement des paramètres client en attributs objet internes, sans prendre en compte la sensibilité et le niveau d'exposition de ces attributs. Ceci pourrait permettre à un attaquant d'actualiser des attributs d'objets auxquels il ne devrait pas avoir accès.
Exemples d'informations sensibles :
- Attributs liés à des permissions :
user.is_admin
,user.is_vip
doivent être définis uniquement par des administrateurs. - Attributs dépendant de processus :
user.cash
ne doit être défini au
niveau interne qu'après vérification du paiement. - Attributs internes :
article.created_time
doit être défini uniquement par l'application.
Exemples de scénarios d'attaque
Scénario #1
Une application de covoiturage permet à l'utilisateur de modifier les
informations de base de son profil. Au cours de ce processus, un appel d'API
est envoyé à PUT /api/v1/users/me
avec l'objet JSON légitime suivant :
{"user_name":"inons","age":24}
La requête GET /api/v1/users/me
comporte un attribut supplémentaire sur le
solde du compte :
{"user_name":"inons","age":24,"credit_balance":10}
L'attaquant rejoue la première requête avec la charge utile suivante :
{"user_name":"attacker","age":60,"credit_balance":99999}
Le point d'accès étant vulnérable à l'assignation massive, l'attaquant dispose du crédit sans avoir payé.
Scénario #2
Un portail de partage de vidéos permet aux utilisateurs de téléverser et de
télécharger du contenu dans différents formats. Un attaquant qui explore l'API
découvre que le point d'accès GET /api/v1/videos/{video_id}/meta_data
retourne un objet JSON avec les attributs de la vidéo. L'un des attributs est "mp4_conversion_params":"-v codec h264"
, qui indique que l'application
utilise une commande shell pour convertir la vidéo.
L'attaquant a également découvert que le point d'accès
POST /api/v1/videos/new
est vulnérable à l'assignation massive et permet au
client de définir n'importe quel attribut de l'objet vidéo. L'attaquant définit
une valeur malveillante de la manière suivante :
"mp4_conversion_params":"-v codec h264 && format C:/"
. Cette valeur va
entrainer une injection de commande shell quand l'attaquant chargera la vidéo
au format MP4.
Comment s'en prémunir
- Si possible, évitez d'utiliser des fonctions qui lient automatiquement une saisie client à des variables du code ou des objets internes.
- Autorisez uniquement les attributs qui doivent pouvoir être actualisés par le client.
- Utilisez les fonctionnalités natives pour interdire les attributs qui ne doivent pas être accessibles aux clients.
- Si applicable, définissez et imposez des schémas pour la validation des données d'entrée de la charge utile .