Plus haut, j'ai parlé de "compatibilité" et non dit que Linux le fournissait. Il y a Red Hat/Fedora qui fournit des fonctionnalités de "random address". Peut-être d'autre, je l'ignore.
En fait, ça dépend de ce que tu appelles randomization.
Depuis la version 2.6.11 (je crois) du kernel, on a une randomization partielle:
exemple:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n;
int *c = malloc(sizeof(int));
Donc, il y a bien "randomizaton" au niveau de la pile (en fait, aussi au niveau des appels à mmap()), mais pas au niveau du tas.
Mais faut pas croire que c'est la panacée: en effet, enfin la dernière fois que j'ai vérifié, la plage de randomization n'est pas énorme (64 kb pour la pile je crois). Quand tu enlèves les adresses quivontpas (alignement), bah en fait il te reste un ensemble assez restreint de valeurs, du coup rien ne t'empêche de faire une boucle au début de ton exploit.
Kernel facilities supplying address space layout randomization for libraries cannot be used in conjunction with prelink; to do so would require relocating the libraries, defeating the purpose of prelinking.
Quand tu y penses, c'est carrément logique.
Néanmoins, voici ce qu'on peut lire:
In an attempt to restore some of the benefits of address space randomization, prelink is capable of randomly selecting the addresses used for prelinking. This makes it more difficult to perform certain attacks on a system, because the addresses used are unique to that system. This approach is, however, less effective than per-process randomization because the addresses stay constant until prelink is run again.
Voilà voilà.
Enfin, je crois qu'on se retrouve toujours face au dilemme rapidité/sécurité. Entre les deux, il te faut choisir :-)
[^] # Re: Prelink
Posté par neologix . En réponse à la dépêche Sortie d'OpenBSD 4.0. Évalué à 6.
En fait, ça dépend de ce que tu appelles randomization.
Depuis la version 2.6.11 (je crois) du kernel, on a une randomization partielle:
exemple:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n;
int *c = malloc(sizeof(int));
printf("Pile: %p\n", (void *) &n);
printf("Tas: %p\n", (void *) c);
return 0;
}
Sur mon noyau 2.6.17, j'obtiens ça:
Donc, il y a bien "randomizaton" au niveau de la pile (en fait, aussi au niveau des appels à mmap()), mais pas au niveau du tas.
Mais faut pas croire que c'est la panacée: en effet, enfin la dernière fois que j'ai vérifié, la plage de randomization n'est pas énorme (64 kb pour la pile je crois). Quand tu enlèves les adresses quivontpas (alignement), bah en fait il te reste un ensemble assez restreint de valeurs, du coup rien ne t'empêche de faire une boucle au début de ton exploit.
Pour en revenir à la randomization et prelink:
http://lwn.net/Articles/121845/
Quand tu y penses, c'est carrément logique.
Néanmoins, voici ce qu'on peut lire:
Voilà voilà.
Enfin, je crois qu'on se retrouve toujours face au dilemme rapidité/sécurité. Entre les deux, il te faut choisir :-)