2012-02-22 2 views
13

Par hasard j'ai trébuché sur un article mentionnant que vous pouvez "activer" ASLR avec -pie -fPIE (ou, plutôt, rendre votre application ASLR-conscient). -fstack-protector est également couramment recommandé (bien que je vois rarement des explications comment et contre quels types d'attaques il protège).Drapeaux GCC utiles pour améliorer la sécurité de vos programmes?

Existe-t-il une liste d'options et d'explications utiles pour augmenter la sécurité?

...

Et comment ces mesures utiles de toute façon, lorsque votre application utilise environ 30 bibliothèques qui utilisent aucune de ces? ;)

+0

qu'est-ce que c'est ASLR? Où pouvons-nous trouver une explication détaillée de ces drapeaux et de leurs impacts sur les performances? – sree

Répondre

4

Quant à votre dernière question:

Et l'utilité de telles mesures sont de toute façon, lorsque votre application utilise environ 30 bibliothèques qui utilisent aucune de ces? ;)

PIE est nécessaire uniquement pour le programme principal pour pouvoir être chargé à une adresse aléatoire. ASLR fonctionne toujours pour les bibliothèques partagées, donc le bénéfice de PIE est le même que vous utilisiez une bibliothèque partagée ou 100.

Stack Protector ne bénéficiera que du code compilé avec stack protector, donc l'utiliser seulement dans votre main programme n'aidera pas si vos bibliothèques sont pleines de vulnérabilités.

Dans tous les cas, je vous encourage à ne pas considérer ces options comme faisant partie de votre application, mais comme faisant partie de l'intégration complète du système. Si vous utilisez plus de 30 bibliothèques (probablement la plupart du temps indésirables pour la qualité et la sécurité du code) dans un programme qui s'interface avec des données non fiables et potentiellement malveillantes, ce serait une bonne idée de construire votre système entier avec protecteur de pile et autres options de durcissement de sécurité. Gardez à l'esprit, cependant, que les plus hauts niveaux de _FORTIFY_SOURCE et peut-être d'autres nouvelles options de sécurité briseront des choses valides qui justifient les programmes corrects, et vous devrez peut-être analyser s'il est sécuritaire de les utiliser . Une chose connue dangereuse que l'une des options fait (j'oublie laquelle) fait en sorte que le spécificateur %n à printf ne fonctionne pas, au moins dans certains cas. Si une application utilise %n pour obtenir un décalage dans une chaîne générée et doit utiliser ce décalage pour y écrire ultérieurement, et que la valeur n'est pas renseignée, il s'agit d'une vulnérabilité potentielle en soi ...

5

Le Hardening page on the Debian wiki explique au moins les plus communs qui sont utilisables sous Linux. Manquant de votre liste est au moins -D_FORTIFY_SOURCE = 2, -Wformat, -Wformat-sécurité, et pour le chargeur dynamique le relro et maintenant fonctionnalités.

+0

Assurez-vous de ne jamais utiliser -D_FORTIFY_SOURCE = 2 sans -O1 (ou -O2, -O3, etc.). Debian l'a corrigé, mais certaines distributions ne l'ont pas fait, et là il va casser la construction sur -O0. IOW, n'ajoutez pas -D_FORTIFY_SOURCE à CPPFLAGS où il devrait appartenir. Ajoutez-le à CFLAGS/CXXFLAGS avec l'option -O1/-O2/-O3/-O6. – anonymous

5

Hardened Gentoo utilise ces drapeaux:

CFLAGS="-fPIE -fstack-protector-all -D_FORTIFY_SOURCE=2" 
LDFLAGS="-Wl,-z,now -Wl,-z,relro" 

je vis environ 5-10% baisse de performance par rapport à linux Gentoo optimisé (y compris PaX/SELinux et d'autres mesures, non seulement CFLAGS.) en défaut suite de tests de phoronix.

+1

Juste pour quelque peu mettre à jour cette réponse, il est préférable d'utiliser "-fstack-protector-strong" qui n'insère que des canaris de pile dans les fictions où le débordement pourrait se produire plutôt que partout. Cela se traduit par une réduction du SO aussi efficace que possible, à moindre coût en termes de frais généraux. – AoeAoe

Questions connexes