Un chercheur en sécurité a découvert une grave vulnérabilité de pollution de prototype dans le langage de programmation Python. L’exploitation de la faille entraîne des plantages d’applications, permettant potentiellement d’autres impacts également.
Variante de pollution de prototype trouvée dans Python
Un chercheur en sécurité indépendant, Abdulraheem Khaled, a récemment partagé des détails sur une vulnérabilité de pollution prototype affectant Python.
La pollution des prototypes est une vulnérabilité commune au langage de programmation JavaScript, qui permet aux attaquants de s’immiscer dans les prototypes existants. Un attaquant peut injecter des valeurs dans le prototype d’un objet de base (“polluer” le prototype) pour perturber les autres objets, et finalement compromettre l’application. De telles exploitations peuvent conduire à divers impacts, du déni de service à l’exécution de code à distance.
Dans son billet de blog, Khaled explique que la plupart des vulnérabilités de pollution de prototype sont souvent signalées pour les apps JavaScript. Et d’autres langages basés sur des classes, comme Python, semblent immunisés contre de telles vulnérabilités.
Cependant, Khaled a expliqué comment il a pu observer des variantes de pollution de prototype dans Python, où la faille existe typiquement dans polluant l’attribut modifiable “_class_
” dans les objets.
Comme indiqué dans son post,
Du point de vue d’un attaquant, nous sommes davantage intéressés par les attributs que nous pouvons remplacer/écrire pour pouvoir exploiter cette vulnérabilité plutôt que par les méthodes magiques. Comme notre entrée sera toujours traitée comme des données (str, int, etc.) et non comme du code réel à évaluer. Par conséquent, si nous essayons d’écraser l’une des méthodes magiques, cela entraînera le plantage de l’application lorsque nous essaierons d’invoquer cette méthode, car les données telles que les chaînes de caractères ne peuvent pas être exécutées.
Brièvement, pour démontrer la faille qu’il appelle “pollution de classe”, le chercheur a créé une instance de Employee
class – une classe vide, puis a tenté de la polluer de manière à polluer également la classe parente. Pour cela, il a défini le __qualname__
à l’intérieur de __class__
en une chaîne de caractères et a ensuite pollué le __base__
attribut. Finalement, cela lui a permis de polluer le parent Employee
classe. C’est ainsi qu’un adversaire peut polluer n’importe quelle classe parentale.
Le chercheur a expliqué que Python applique certaines restrictions sur la modification des object
attributs de classe – la classe parente de toutes les classes. Par conséquent, un attaquant doit procéder en conséquence, en exploitant les fonctions de fusion non sécurisées, pour réaliser une pollution de classe dans Python.
Et maintenant ?
Pour l’instant, le chercheur a confirmé n’avoir trouvé aucun exploit complet avec un impact autre que DoS. Néanmoins, il pense qu’un adversaire peut exploiter la faille pour obtenir divers autres résultats, comme l’écrasement de la clé secrète dans l’application Web Flask pour la signature des sessions, ou le détournement de chemin.
Fais-nous part de tes réflexions dans les commentaires.