web-dev-qa-db-fra.com

Comment les dépassements de tampon peuvent-ils être nocifs dans Android?

Comment les dépassements de tampon peuvent-ils être potentiellement dangereux dans Android?

Plus précisément, si chaque application a son propre identifiant utilisateur et qu'elle est exécutée dans Dalvik VM qui a le même identifiant. Je pensais que même si le débordement se produit, le shellcode écrit sur la page mem de l'application ne sera que ont les mêmes privilèges que l'application elle-même?

16
shura

Prenons l'exemple de Stagefright, la bibliothèque multimédia écrite en C++

La façon dont les débordements contournent les privilèges attribués est simple; Le code C peut directement écrire dans la mémoire. C'est votre travail en tant que développeur de vous assurer que ce que vous mettez en place, sinon il remplira volontiers les autres instructions du même privilège. Stagefright a beaucoup de privilèges. Et les informations qui sortent du tampon pourraient être une vidéo aléatoire de chat provenant d'Internet (qui gagne alors les privilèges de la médiathèque)

Il serait donc naïf de supposer que les débordements ne sont pas nocifs. Stagefright contenait des débordements de tampon, ce qui est extrêmement dangereux. Android les développeurs ont rendu l'exploitation plus difficile en implémentant (entre autres mesures) la randomisation de la disposition de l'espace d'adressage (ASLR), ce qui rend les décalages à utiliser imprévisibles, provoquant une erreur plutôt que l'exécution de code. Mais en combinant cela avec les vulnérabilités du navigateur, des informations peuvent être divulguées sur l'emplacement actuel des pages de mémoire, de sorte que l'exécution de code est toujours possible.

Je recommanderais de lire Metaphor, une implémentation Stagefright incluant le contournement ASLR, le papier et le code PoC sont disponibles en ligne

20
J.A.K.

Permettez-moi de paraphraser la question de l'op: Android avoir un modèle d'isolement d'application basé sur l'ID utilisateur et comment un débordement pourrait-il contourner cela?

La réponse est que vous débordez les parties partagées entre les applications: les services, les applications système et le noyau Linux lui-même. Beaucoup de ces composants sont écrits en C/C++, ils sont donc vulnérables.

C'est effectivement ainsi que vous effectuez l'escalade de privilèges dans tous les systèmes multi-utilisateurs et Android n'a rien de spécial.

9
billc.cn

Je pensais que même si le débordement se produit, le shellcode écrit sur la page mem de l'application n'aura que les mêmes privilèges que l'application elle-même?

À moins que le débordement ne soit dans le noyau ou dans quelque chose exposé par la communication inter-processus (Android fournit beaucoup de choses en tant que services), oui.

Notez cependant que les trois applications clés: messagerie, e-mail et navigateur, ont assez de privilèges. De quoi voler des données privées importantes. Ces applications sont également celles qui interprètent un contenu extérieur non fiable. Il appartient donc à ces applications de s'assurer que le contenu extérieur (comme les pages Web) ne peut pas utiliser les autorisations qu'il ne devrait pas.

Ces applications exécutent également beaucoup de code C ou C++ potentiellement vulnérable, car l'interprétation d'une partie du contenu (en particulier la vidéo et le javascript) est gourmande en CPU et en mémoire au point Java et la JVM (la = Android JVM est inférieur à celui de bureau) ne sont pas à la hauteur, et aussi avant que le code ne soit réutilisé à partir d'autres plates-formes. Ce sont les vulnérabilités de ce code que la plupart des exploits sérieux ciblent.

2
Jan Hudec

Je ne suis pas un Android expert en sécurité mais je pense que je peux répondre à la question disons pour un scénario Apache/Linux et je pense que des menaces équivalentes existent également pour Android (laissons de côté la question pour le moment si des débordements de buffer sont possibles en Android ou pas).

  1. Un débordement de tampon permet à un attaquant d'injecter du code dans la mémoire d'un processus en cours d'exécution. Habituellement, l'attaquant tenterait d'injecter du code qui démarre un Shell (/ bin/bash, par exemple) qui envoie sa sortie standard à sa zone d'attaque à distance et reçoit stdin de cette zone. Le résultat est une fenêtre de terminal sur l'ordinateur de l'attaquant mais le processus Shell s'exécute sur la zone attaquée. Maintenant, comme vous le dites dans Android le processus s'exécute dans l'espace utilisateur. La même chose est vraie pour un scénario de serveur Web normal sous Linux. C'est-à-dire que vous injectez du code dans une mémoire de processus dont le propriétaire ne fonctionne pas) t ont beaucoup de privilèges (www-data ou Apache ne sont pas du tout puissants sur Linux). À ce stade, vous ne pouvez effectuer des actions à distance à partir de la boîte de votre attaquant que l'utilisateur est autorisé à faire dans le système d'exploitation. Sous Linux, c'est assez limité et comme vous le dites dans Android ainsi.
  2. La prochaine étape qu'un attaquant vise est une élévation de privilèges. C'est à dire. trouver une autre faille dans le système d'exploitation/tout ce qui vous permet de sortir du type de "bac à sable" dans lequel vous avez acheté. Il existe des centaines/milliers de bogues dans Windows/Linux/quoi que ce soit qui permettent une élévation de privilèges d'un utilisateur limité à root/Administrateur (compté au cours des 15 dernières années). Pour Android cela signifie que vous devez trouver un tel bogue dans le système d'exploitation Android qui vous permet de sortir de l'espace utilisateur. Étant donné que la perfection ne existe dans ce monde il y a très probablement des bugs qui permettent de le faire. Cela dépend juste de votre temps et de votre énergie que vous les trouviez ou non.
  3. Des débordements de tampon peuvent-ils exister dans Android? Bien sûr, ils le peuvent. Android est écrit en C comme la plupart des systèmes d'exploitation. Chaque fournisseur de téléphone apporte sa propre saveur du système d'exploitation, donc ce qui vous rend certain qu'aucun développeur Samsung/LG/quel que soit le développeur n'introduit une faille dans le code ? Sur l'interface entre Java et C, la partie C doit encore vérifier les limites, sinon vous écrasez toujours la mémoire. Cependant, en tant que développeur d'application, vous n'avez pas à vous soucier de ce problème. plus parce que l'écriture directement dans des adresses mémoire n'est pas possible en Java.
1
kaidentity

Disons que vous avez injecté votre code dans un processus. Maintenant vous pouvez:

  • Jouez avec les données et les autorisations accessibles au processus (volez les détails de votre compte de l'application, accédez à vos photos si l'application dispose des autorisations, postez un message Twitter à votre nom si l'application attaquée était Twitter, ...)
  • Utilisez une attaque par élévation de privilèges pour obtenir des privilèges plus élevés
  • Parfois, certaines parties de l'application (en particulier les bibliothèques multimédias) s'exécutent avec des privilèges plus élevés. Si vous les attaquez, vous pouvez obtenir des privilèges plus élevés. Stagefright l'a utilisé si je me souviens bien.
  • Attaquez une autre application/processus sur le téléphone (également ceux qui ne sont pas accessibles à distance) et répétez le tout jusqu'à ce que vous atteigniez votre cible

Donc, même si vous ne pouvez (initialement) accéder qu'à votre propre espace d'adressage, vous avez beaucoup de possibilités.

Pour clarification: le processus de l'application s'exécute avec l'ID utilisateur. Le processus pourrait être la machine virtuelle Dalvik. Il peut également s'agir de code natif utilisant le NDK Android Android écrit en C/C++. Il est souvent utilisé par les bibliothèques multimédias, les jeux et les fonctionnalités de système d'exploitation de bas niveau.

En général, seules les vulnérabilités critiques de débordement de tampon sont discutées dans les médias, ce ne sont qu'une petite partie de toutes les vulnérabilités.

0
H. Idden