J'ai activé le -Wstack-protector
avertissement lors de la compilation du projet sur lequel je travaille (un moteur de jeu C++ multi-plateforme commercial, compilation sur Mac OS X 10.6 avec GCC 4.2). Cet indicateur met en garde contre les fonctions qui ne seront pas protégées contre l'écrasement de la pile même si -fstack-protector
est autorisé. GCC émet quelques avertissements lors de la construction du projet:
fonction non protectrice: pas de tampon d'au moins 8 octets
ne protège pas les variables locales: tampon de longueur variable
Pour le premier avertissement, j'ai constaté 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 l'écrasement de la pile: --param ssp-buffer-size=X
peut être utilisé, où X est 8 par défaut et peut être aussi faible que 1.
Pour le deuxième avertissement, je ne peux pas supprimer ses occurrences sauf si j'arrête d'utiliser -Wstack-protector
.
-fstack-protector
être utilisé? (comme dans, par exemple, tout le temps pendant le développement, ou juste lors du suivi des bogues?)-fstack-protector-all
être utilisé?-Wstack-protector
me disant? Cela signifie-t-il que je diminue la taille minimale du tampon?-Wstack-protector
n'est pas le type d'indicateur que vous souhaitez activer à tout moment si vous voulez une version sans avertissement. Est-ce correct?La protection contre la pile est une stratégie de renforcement, pas une stratégie de débogage. Si votre jeu est compatible avec le réseau ou contient des données provenant d'une source non contrôlée, activez-le. S'il ne contient pas de données provenant d'un endroit non contrôlé, ne l'activez pas.
Voici comment cela se produit: si vous avez un bogue et effectuez un changement de tampon basé sur quelque chose qu'un attaquant peut contrôler, cet attaquant peut écraser l'adresse de retour ou des parties similaires de la pile pour lui faire exécuter son code au lieu de votre code. La protection de la pile interrompra votre programme s'il 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 type de piratage qui consiste à utiliser une vulnérabilité dans votre code pour créer un exploit qui infecte potentiellement votre utilisateur.
Pour les solutions axées sur le débogage, regardez des choses comme bavette.
Quant à vos questions spécifiques:
Les protections de pile pour tous les tampons peuvent être utilisées si vous voulez une protection supplémentaire en échange d'un coup de performance. De manuel gcc4.4.2 :
-fstack-protector
Emettez du code supplémentaire pour vérifier les débordements de tampon, tels que les attaques par écrasement de pile. Cela se 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 supérieurs à 8 octets. Les protections sont initialisées lorsqu'une fonction est entrée, puis vérifiées à la sortie de la fonction. Si une vérification de garde échoue, un message d'erreur est imprimé et le programme se ferme.
-fstack-protector-all
Comme -fstack-protector sauf que toutes les fonctions sont protégées.
Les avertissements vous indiquent quels tampons la protection de pile ne peut pas protéger.
En effet, vous ne devriez pas vous soucier de l'avertissement pour les versions normales. C'est vraiment plus 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; vous vous trompez dans le calcul de la taille et vous ouvrez un grand trou.