71 votes

Quand et comment utiliser la fonction de protection de la pile de GCC ?

J'ai activé le -Wstack-protector lors de la compilation du projet sur lequel je travaille (un moteur de jeu commercial multiplateforme C++, compilé sur Mac OS X 10.6 avec GCC 4.2). Ce drapeau prévient des fonctions qui ne seront pas protégées contre le stack smashing même si -fstack-protector est activé. GCC émet quelques avertissements lors de la construction du projet :

fonction non protectrice : pas de tampon d'au moins 8 octets de long
ne pas protéger les variables locales : tampon de longueur variable

Pour le premier avertissement, j'ai découvert qu'il est possible d'ajuster la taille minimale qu'un tampon doit avoir lorsqu'il est utilisé dans une fonction, pour que cette fonction soit protégée contre le stack smashing : --param ssp-buffer-size=X peut être utilisé, où X est 8 par défaut et peut être aussi bas que 1.
Pour le deuxième avertissement, je ne peux pas supprimer ses occurrences à moins d'arrêter d'utiliser -Wstack-protector .

1/ Quand faut-il -fstack-protector être utilisé ? (par exemple, tout le temps pendant le développement, ou seulement lors du suivi des bogues ?)
2/ Quand faut-il -fstack-protector-all être utilisé ?
3/ Qu'est-ce que -Wstack-protector me dit-elle ? Est-ce qu'il me suggère de diminuer la taille minimale de la mémoire tampon ?
4/ Si oui, y a-t-il des inconvénients à mettre la taille à 1 ?
5/ Il apparaît que -Wstack-protector n'est pas le genre de drapeau que vous voulez activer à tout moment si vous voulez une construction sans avertissement. Est-ce correct ?

Merci !

78voto

brantgurga Points 438

La protection des piles est une stratégie de durcissement, pas une stratégie de débogage. Si votre jeu est sensible au réseau ou si des données proviennent d'une source non contrôlée, activez-la. S'il n'a pas de données provenant d'une source non contrôlée, ne l'activez pas.

Voici comment cela se passe : Si vous avez un bogue et que vous modifiez la mémoire tampon en fonction d'un élément qu'un attaquant peut contrôler, celui-ci peut écraser l'adresse de retour ou d'autres parties similaires de la pile pour que son code soit exécuté au lieu du vôtre. La protection de la pile interrompra votre programme si elle détecte que cela se produit. Vos utilisateurs ne seront pas contents, mais ils ne seront pas piratés non plus. Ce n'est pas le genre de piratage qui consiste à tricher dans le jeu, c'est le genre de piratage qui consiste à utiliser une vulnérabilité dans votre code pour créer un exploit qui infecte potentiellement votre utilisateur.

Pour des solutions orientées vers le débogage, regardez des choses comme mudflap.

Pour ce qui est de vos questions spécifiques :

  1. Utilisez le protecteur de pile si vous obtenez des données de sources non contrôlées. La réponse à cette question est probablement oui. Alors utilisez-le. Même si vous n'avez pas de données provenant de sources non contrôlées, vous finirez probablement par en avoir, ou vous en avez déjà, sans vous en rendre compte.

  2. Les protections de pile pour tous les tampons peuvent être utilisées si vous souhaitez une protection supplémentaire en échange d'une baisse des performances. À partir de Manuel de gcc4.4.2 :

    -fstack-protector

    Émettre du code supplémentaire pour vérifier les dépassements de tampon, tels que les attaques de type "stack smashing". Ceci est fait en ajoutant une variable de garde aux fonctions avec des objets vulnérables. Cela inclut les fonctions qui appellent alloca, et les fonctions avec des tampons de plus de 8 octets. Les gardes sont initialisées lors de l'entrée d'une fonction, puis vérifiées à la sortie de la fonction. Si la vérification d'une garde échoue, un message d'erreur est imprimé et le programme se termine.

    -fstack-protector-all

    Comme -fstack-protector sauf que toutes les fonctions sont protégées.

  3. Les avertissements vous indiquent quels tampons la protection de la pile ne peut pas protéger.

  4. Il ne vous suggère pas nécessairement de diminuer la taille minimale de votre tampon, et à une taille de 0/1, c'est la même chose que stack-protector-all. Il vous le signale seulement pour que vous puissiez, si vous le décidez, revoir la conception du code pour que le tampon soit protégé.

  5. Non, ces avertissements ne représentent pas des problèmes, ils vous signalent simplement des informations. Ne les utilisez pas régulièrement.

6voto

dirkgently Points 56879

Ces options tentent de prévenir les attaques basées sur le débordement de tampon/la corruption de pile. Ces articles devraient vous aider :

1voto

MSalters Points 74024

En effet, vous ne devriez pas vous soucier de l'avertissement pour les constructions normales. Il s'agit plutôt d'un message d'information. J'espère qu'il est évident que vous avez un problème de sécurité inhérent avec les tampons de taille variable sur la pile ; si vous vous trompez dans le calcul de la taille, vous ouvrez un grand trou.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X