web-dev-qa-db-fra.com

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

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.

  1. Quand devrait -fstack-protector être utilisé? (comme dans, par exemple, tout le temps pendant le développement, ou juste lors du suivi des bogues?)
  2. Quand devrait -fstack-protector-all être utilisé?
  3. Quel est -Wstack-protector me disant? Cela signifie-t-il que je diminue la taille minimale du tampon?
  4. Si oui, y a-t-il des inconvénients à mettre la taille à 1?
  5. Il semble que -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?
59
Guillaume

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:

  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 ne disposez pas de données provenant de sources non contrôlées, vous le ferez probablement ou déjà et ne vous en rendrez pas compte.
  2. 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.

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

  4. Cela ne signifie pas nécessairement que vous réduisez votre taille de tampon minimale, et à une taille de 0/1, c'est la même chose que stack-protector-all. Il vous le signale uniquement pour que vous puissiez le faire, si vous décidez de reconcevoir le code afin que le tampon soit protégé.
  5. Non, ces avertissements ne représentent pas des problèmes, ils vous indiquent simplement des informations. Ne les utilisez pas régulièrement.
64
brantgurga

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.

1
MSalters