2015-04-25 1 views
5

Je suis assez familier avec ASLR, mais aujourd'hui j'ai entendu un nouveau fait intéressant sur l'implémentation de ASLR dans Windows.Contourner Windows ASLR en déterminant l'adresse de la bibliothèque en utilisant des pages partagées

Afin d'optimiser les performances si les processus A et B charge la même DLL Windows ne le chargera qu'une seule fois en mémoire physique et les deux processus partageront la même instance via des pages partagées.

Ceci est une vieille information .. Mais la partie intéressante est que les deux processus A et B vont charger la bibliothèque partagée dans la même adresse virtuelle (pourquoi ??).

Il me semble que toute attaque locale (par exemple une escalade de privilège) peut facilement contourner ASLR par la manière suivante:

1. Create a new dummy process 
2. Check the address of dlls of interest (kernel32, user32 ..) 
3. Attack the privileged process and bypass ASLR with the information from step 2. 

Je l'ai fait quelques tests simples à l'aide Olly et a constaté que les bibliothèques partagées sont bien chargées dans la même adresse virtuelle.

Si c'est vraiment le cas, l'ASLR est-il inutile pour l'exploitation locale?

+2

Si la DLL serait chargée à une adresse différente, alors il doit être déplacé et les pages de RAM ne peuvent plus être partagés. Le point majeur de ASLR est que lorsqu'il est chargé sur votre machine n'est pas le même que celui où il est chargé sur le mien. Et quand vous redémarrerez, ce sera différent aussi. –

+0

Autant que je me souvienne .. Chaque processus a une table qui traduit les adresses de pages virtuelles en pages physiques. Chaque processus a sa propre table. Microsoft ne peut-il pas charger la DLL une fois dans le RAM physique et pour chaque processus charger la DLL dans une adresse virtuelle différente? – Michael

+2

Non, la relocalisation modifie le code afin qu'une copie ne soit plus valide. –

Répondre

5

Vous avez raison, ASLR est peu de défense contre un attaquant local. Il est principalement conçu pour contrecarrer les adresses codées en dur dans les exploits distants.

Éditer: Certains détails dans ma réponse précédente étaient incorrects, bien que le point ci-dessus reste. Une adresse de base de DLL compatible ASLR est en fait une fonction des deux: (1) un décalage aléatoire choisi par Windows à partir d'un ensemble de 256 valeurs possibles au moment du démarrage; et (2) l'ordre dans lequel la DLL est chargée, qui pour les DLL connues est randomisée par le gestionnaire de session lors du démarrage du système. Connaître juste le décalage aléatoire n'est donc pas suffisant pour calculer l'adresse de base d'une DLL ASLR'd arbitraire. Cependant, si vous êtes en mesure d'observer directement l'adresse d'une DLL cible dans la mémoire partagée, comme vous le décrivez, alors tous les paris sont désactivés de toute façon.

Sources: http://www.symantec.com/avcenter/reference/Address_Space_Layout_Randomization.pdf Windows Internals, 6e édition

+1

Très intéressant .. Cette "technique" est-elle utilisée à l'état sauvage? Je lis quelques études de cas sur les exploits locaux et jamais vu un attaquant utilisant cette technique .. – Michael

+1

@MichaelEngstler excuses, je crois que je me trompais complètement sur ce détail. J'ai modifié ma réponse pour réfléchir. – peterdn