web-dev-qa-db-fra.com

Comment les "pointeurs qui fuient" pour contourner le DEP / ASLR fonctionnent

Je me demandais si quelqu'un pourrait me donner des indices sur la façon dont les "pointeurs qui fuient" pour contourner le travail DEP/ASLR. J'ai lu ici :

La seule façon de contourner de manière fiable DEP et ASLR est par une fuite de pointeur. Il s'agit d'une situation où une valeur sur la pile, à un emplacement fiable, peut être utilisée pour localiser un pointeur de fonction utilisable ou un gadget ROP. Une fois cela fait, il est parfois possible de créer une charge utile qui contourne de manière fiable les deux mécanismes de protection.

comment cela est accompli est une sorte de mystère pour moi. J'ai un débordement de tampon .. donc je peux écraser jusqu'à EIP et le contenu de la pile .. J'ai un pointeur de fonction fiable ou un pointeur de code dans la pile, et je sais où cela est stocké .. aussi si je connais cet emplacement .. comment faire J'ai mis cette adresse dans EIP? Je ne peux pas contrôler le flux d'exécution si je ne peux pas changer EIP vers cet emplacement fiable

18
John Smith

"Leaky Pointers" ou plus communément appelé "Dangling Pointers" est utile pour créer une chaîne d'attaque pour contourner un système de sécurité en couches.

L'idée derrière DEP est que vous rendez les régions de mémoire non exécutables, de sorte que le shellcode dans cette zone ne peut pas être exécuté. Le DEP seul est vraiment facile à contourner, vous pouvez simplement ret-to-lib, et appeler n'importe quelle fonction que vous souhaitez, system() est un favori.

Cependant, sous Windows, ASLR les bibliothèques activées auront un espace mémoire aléatoire, donc l'attaquant ne connaîtra pas l'adresse mémoire de la system() fonction, et là pour ne peut pas l'appeler. L'idée derrière ASLR est que Peu importe si vous pouvez contrôler l'EIP si vous ne savez pas où aller.

La possibilité de lire l'emplacement d'une région de mémoire aléatoire sape la protection de l'ASLR, car vous disposez désormais d'un emplacement de saut fiable. Cela peut être accompli grâce à une grande variété de méthodes. Utiliser un débordement de tampon pour simplement écraser le terminateur nul et lire après la fin d'un tableau a été utilisé dans pwn2own contre IE. Mais vraiment la technique la plus courante utilise un Dangling Pointer qui peut être utilisé pour lire/écrire ou même exécuter un emplacement mémoire valide malgré ASLR.

Même avec ASLR, tous les emplacements mémoire ne sont pas randomisés. En fait, le binaire exécutable a une disposition prévisible, vous pouvez donc utiliser l'exécutable contre lui-même dans un chaîne ROP . Cependant, il est parfois difficile de trouver des gadgets ROP utiles, surtout si le binaire cible est très petit. Si vous ne parvenez pas à créer une chaîne ROP utile, une vulnérabilité de divulgation de la mémoire, comme un pointeur suspendu, est une excellente méthode d'attaque. Il est important de noter que ASLR ne randomise que l'emplacement de la page (les premiers octets de l'adresse mémoire), si vous pouvez remplir une région de cette page avec votre shellcode, il peut être possible d'exécuter avec précision votre shellcode en utilisant la mémoire perdue l'adresse comme base, puis, espérons-le, votre shellcode se trouve à un certain décalage de cet emplacement aléatoire.

L'utilisation de chaînes de vulnérabilités de manipulation de mémoire n'est exceptionnellement possible qu'à l'intérieur d'un environnement de script, tel que JavaScript.

13
rook

ASLR implique de randomiser l'emplacement des objets en mémoire. Par exemple, le tas peut être déplacé vers un décalage aléatoire en mémoire.

Si vous parvenez d'une manière ou d'une autre à apprendre l'adresse d'un objet dans le tas, alors vous avez obtenu beaucoup d'informations sur l'emplacement du tas en mémoire. Cela peut être suffisant pour vous permettre de prédire l'emplacement d'autres objets dans le tas. À ce stade, la randomisation de l'ASLR devient inutile. Ainsi, les vulnérabilités de divulgation d'informations qui révèlent la valeur d'un pointeur (son adresse) peuvent potentiellement être utilisées pour renverser ASLR.

Comment l'adresse d'un pointeur peut-elle fuir? Une façon consiste à utiliser une vulnérabilité de chaîne de format. Supposons que votre fait quelque chose comme ceci:

printf(msg);

msg est un message contrôlé par l'attaquant et où l'attaquant peut lire stdout. Ensuite, l'attaquant peut spécifier que le message doit être la chaîne "%d", Et cela révèlera la valeur de certaines données aléatoires sur la pile, ce qui pourrait bien être un pointeur valide. (Pourquoi? Parce que printf() pense que vous avez passé un autre argument et va chercher dans la pile pour trouver et imprimer la valeur de cet argument supplémentaire. Il n'a aucune idée que vous n'avez pas réellement passé un autre argument et c'est en fait chalutage à travers une mémoire sans rapport.)

Il existe d'autres façons de divulguer ce type d'informations, mais lorsque c'est le cas, vous pouvez souvent contourner ASLR. Une fois que vous pouvez contourner ASLR, vous pouvez ensuite utiliser des techniques standard pour exploiter une vulnérabilité de saturation de tampon. Ainsi, ces types de vulnérabilités de divulgation d'informations ne sont pas une bonne chose à avoir dans votre application.

5
D.W.