Pour permettre aux développeurs d’utiliser facilement certaines fonctionnalités dans les systèmes d’exploitation, les fournisseurs de systèmes mettent à la disposition des développeurs un certain nombre d’interfaces de programmation applicative également abrégées API en anglais. Elles peuvent être des classes, des méthodes ou des fonctions et permettent à un logiciel d’exploiter les services d’un autre logiciel. Dans le système d’exploitation macOS d’Apple, plusieurs API sont également disponibles. Parmi ces API, nous avons la fonction CGWindowListCreateImage qui permet de faire des captures d’écran des fenêtres ouvertes ou de tout le bureau en spécifiant certains paramètres. En faisant appel à cette API, les développeurs peuvent par exemple facilement avoir un instantané de leurs applications dans la fenêtre active. À priori, c’est donc une fonctionnalité excellente qui facilite la vie aux développeurs.
Mais après avoir mené des recherches sur les possibilités d’utilisation de cette fonction, Felix Krause, le fondateur des outils Fastlane qui permettent de concevoir rapidement des applications mobiles, rapporte que des personnes malveillantes pourraient concevoir des applications pour Mac et se servir de cette fonction pour faire des captures d’écran à l’insu de l’utilisateur. Certains avanceront que la fonctionnalité de bac à sable sur macOS pourrait en principe les protéger, car une telle éventualité ne devrait être possible qu’avec des autorisations supplémentaires. Mais Krause souligne que dans ce cas-ci, que l’application soit exécutée dans un sandbox ou pas, elle est en mesure de capturer silencieusement tout ce qui est affiché à l’écran en utilisant cette API. À partir de là, elle peut accéder à tous les moniteurs connectés au système sur lequel elle est installée. Et pour convaincre les sceptiques, Krause demande de créer un projet avec ces quelques lignes de code :
Code Objective-c : |
1 2 3 4 5 6 7 8 | CGImageRef screenshot = CGWindowListCreateImage( CGRectInfinite, kCGWindowListOptionOnScreenOnly, kCGNullWindowID, kCGWindowImageDefault); NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:screenshot]; |
En principe, le développeur ne devrait pas pouvoir lire le contenu du bureau en cours lorsque l’application Mac s’exécute dans le bac à sable. Mais contre toute attente, en intégrant ce bout de code dans une application, elle peut lire tout le contenu de l’écran affiché. Et pour aller encore plus loin, le développeur déclare qu’en utilisant un logiciel OCR pour la reconnaissance de texte, le développeur peut lire le texte affiché sur l’écran sans aucune difficulté. À partir de là, de pires scénarios peuvent être envisagés. Des applications peuvent exploiter ces failles pour lire les mots de passe ou les clés dans les gestionnaires de mots de passe. Elles peuvent également détecter quels services web une personne utilise ou encore parcourir avec l’utilisateur tous les emails ou messages qu’il ouvre sur sa machine. En outre, un pirate pourrait exploiter cette méthode pour obtenir des informations personnelles sur un utilisateur comme son adresse, son salaire, des informations bancaires, etc. Et dans le cas où un attaquant utiliserait cette méthode pour cibler un développeur, il pourrait accéder à certaines informations comme le code source du logiciel du développeur, des clés d’API et bien d’autres informations sensibles.
Bien évidemment, en parcourant tous les risques auxquels les utilisateurs sont exposés, la première chose qui vient à l’esprit est de savoir comment s’en prémunir. À cette préoccupation, Krause répond pour ce qui le concerne, qu’il ne connait aucun moyen de se protéger contre l’exploitation de cette faille.
Mais pour Krause, si Apple ajoute plus de contrôle pour pouvoir utiliser cette fonction, cela permettrait de réduire les risques liés à son exploitation. Après avoir informé Apple de sa trouvaille, Krause propose à Apple les différents points suivants :
- Le processus d’examen App Store pourrait vérifier les droits Sandbox pour l’accès à l’écran
- Exiger l’autorisation de l’utilisateur avec une boite de dialogue
- Avertir l’utilisateur à chaque fois qu’une application accède à l’écran.