• [^] # Re: Prelink

    Posté par . En réponse à la dépêche Sortie d'OpenBSD 4.0. Évalué à 6.

    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));

    printf("Pile: %p\n", (void *) &n);
    printf("Tas: %p\n", (void *) c);

    return 0;
    }


    Sur mon noyau 2.6.17, j'obtiens ça:

    $ for i in `seq 1 10`; do ./test; done
    Pile: 0xbf85db6c
    Tas: 0x804a008
    Pile: 0xbf85735c
    Tas: 0x804a008
    Pile: 0xbfb3487c
    Tas: 0x804a008
    Pile: 0xbf87db7c
    Tas: 0x804a008
    Pile: 0xbf90640c
    Tas: 0x804a008
    Pile: 0xbfb9369c
    Tas: 0x804a008
    Pile: 0xbfea89ac
    Tas: 0x804a008
    Pile: 0xbf906c0c
    Tas: 0x804a008
    Pile: 0xbfcfd7fc
    Tas: 0x804a008
    Pile: 0xbfb0e60c
    Tas: 0x804a008


    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/

    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 :-)