web-dev-qa-db-fra.com

Pourquoi certaines DLL ne sont-elles pas randomisées? Qu'est-ce qui rend difficile de déployer Full ASLR pour toutes les DLL?

L'un des défis portant le déploiement d'ASLR pour tout est que, du moins sous Windows, certaines DLL (bibliothèques) ne sont pas compilées d'une manière compatible avec ASLR. (Ils ne sont pas compilés comme code indépendant de la position, et donc l'endroit où ils sont chargés en mémoire ne peuvent pas être randomisés.)

C'est problématique, car si une application charge même une seule dll non randomisée, elle n'est effectivement pas randomisée. Arrêter des attaques standard (par exemple, des attaques de rops), tout le code doit être randomisé : même un seul non randomisé DLL est suffisant d'une prise de pied que des attaques de rops peut devenir possible. Donc, à une approximation de premier ordre, ASLR n'est utile que pour protéger une application particulière si Tout de ses DLL est randomisée. Applications Souvent Chargez de nombreuses dlls et, étant donné que tout ce qu'il faut est une DLL non randomisée, cela le rend particulièrement important pour que toutes les DLL soient randomisées.

Généralement, l'industrie se déplace vers une utilisation accrue de la randomisation, mais lentement : Je suppose que cela prend du temps pour apporter ceci à tous DLL Tout programme utilisera jamais. Par exemple , il a été récemment révélé que la Dropbox DLL n'utilise pas de randomisation , donc tout programme utilisant la Dropbox DLL n'est pas protégé Contre les attaques de rops (tout programme utilisant le Dropbox DLL perd l'avantage de l'ASLR).

Ma question: Quelles sont les raisons typiques pour lesquelles certaines DLL ne sont pas randomisées? Est-ce typiquement une sorte de barrière technique ou une question technique qui rend difficile ou impossible de compiler le DLL comme code indépendant de la position? Est-ce que cela manque de sensibilisation/d'attention à la sécurité, de la part de Les développeurs construisant la DLL? Est-ce que les dlls hérités qui sont très anciens et n'ont pas été recompantés pour tirer parti de la randomisation? Microsoft Visual C++ est-il échoué à faire la bonne chose par défaut (ne compile-t-il pas à compiler des DLL comme code indépendant de la position Par défaut)? Est-ce quelque chose d'autre entièrement?

Existe-t-il des avancées techniques ou des outils qui aideraient à faciliter un plus grand déploiement d'ASLR/Randomization pour les DLL qui ne prennent actuellement pas en charge la randomisation?

Ressources connexes: SlopeFinder est un outil permettant de numériser votre système pour les DLL qui ne prennent pas en charge ASLR.

12
D.W.

Il y a une bonne information ici . Apparemment, A DLL== peut être soumis à ASLR uniquement s'il est étiqueté comme tel, en raison de "problèmes de compatibilité en arrière". Bien que A DLL soit, par nature , destiné à être déplacé, je peux imaginer que certains logiciels écrits (mal) peuvent faire des astuces qui s'appuient sur le DLL se retrouver dans une plage relativement petite de l'espace d'adresses (un candidat éventuel serait Soyez un peu collectionneur de déchets qui doit distinguer des "pointeurs vers des données" et des "pointeurs à coder" - je sais que de tels problèmes sont survenus avec certaines versions de l'interprète JavaScript de Chrome lorsqu'elles sont lancées sur OpenBSD avec une émulation Linux) .

Si Microsoft s'est allé à la mise en œuvre d'un drapeau supplémentaire, il est plausible, s'il n'est pas probable, qu'ils ont rencontré au moins un cas de ce logiciel qu'ils ne pouvaient pas ignorer (la compatibilité en arrière est très importante dans le monde des fenêtres).

SO DLL permettra à ASLR de se produire si la liaison statique le disait, lorsque le DLL était construit en dernier. Il s'agit d'utiliser le /DYNAMICBASE drapeau. La Documentation indique que:

Par défaut,/dynamicbase est activé.

Les documentations pour Visual Studio 2010 et 2012 contiennent cette phrase, mais pas la documentation pour Visual Studio 2008. Donc, il faut supposer que la plupart des personnes qui utilisent Visual Studio 2010+ produisent une DLL compatible Visual Studio 2010+, mais la plupart des personnes qui utilisent Visual Studio 2008 ou Une version précédente produit DLL qui sont non sous réserve de l'ASLR.

Dans la page I du premier lien ci-dessus, l'un des commentaires indique:

Vous pouvez toujours utiliser Microsoft Linker pour le faire, une fois que votre image PE est construite. Utilisez Lien/Edit/DynamicBase (ou Editbin/DynamicBase).

Donc, vous pouvez "corriger" une DLL, mais cela suppose que le DLL== ne cassera pas avec ASLR, c'est-à-dire que le manque de drapeau était juste en raison de la configuration par défaut de Visual Studio, telle que celle utilisée par le DLL Vendeur.

9
Thomas Pornin