Question

J'ai activé l'avertissement -Wstack-protector lors de la compilation du projet sur lequel je travaille (un moteur de jeu commercial multiplate-forme C ++, compilé sous Mac OS X 10.6 avec GCC 4.2). Cet indicateur met en garde sur les fonctions qui ne seront pas protégées contre le bris de pile, même si -fstack-protector est activé. GCC émet des 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 découvert qu'il était possible d'ajuster la taille minimale d'un tampon lorsqu'il était utilisé dans une fonction. Pour que cette fonction soit protégée contre le fracas de la pile: - param ssp-buffer-size = X peut être utilisé, où X est 8 par défaut et peut aller jusqu'à 1.

Pour le deuxième avertissement, je ne peux supprimer ses occurrences que si j'arrête d'utiliser -Wstack-protector .

  1. Quand -fstack-protector doit-il être utilisé? (comme dans, par exemple, tout le temps pendant le dev ou juste quand on traque les bugs?)
  2. Quand -fstack-protector-all doit-il être utilisé?
  3. Qu'est-ce que -Wstack-protector me dit? Est-ce que cela suggère que je diminue la taille minimale du tampon?
  4. Si oui, y a-t-il des inconvénients à ce que la taille soit égale à 1?
  5. Il semble que -Wstack-protector ne soit pas le type d'indicateur que vous souhaitez activer à tout moment si vous souhaitez une génération sans avertissement. Est-ce vrai?
Était-ce utile?

La solution

La protection de pile est une stratégie de renforcement, pas une stratégie de débogage. Si votre jeu est compatible avec le réseau ou que les données proviennent d'une source incontrôlée, activez-le. Si les données ne proviennent pas d’un endroit incontrôlé, ne les activez pas.

Voici comment cela se passe: si vous rencontrez un bogue et modifiez le tampon en fonction de 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. code. La protection de pile interrompra votre programme s'il détecte que cela se produit. Vos utilisateurs ne seront pas contents, mais ils ne seront pas non plus piratés. Ce n'est pas le genre de piratage qui consiste à tricher dans le jeu, c'est à quelqu'un qui utilise 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, observez des éléments tels que les bavettes.

En ce qui concerne vos questions spécifiques:

  1. Utilisez le protecteur de pile si vous obtenez des données provenant de sources non contrôlées. La réponse à cette question est probablement oui. Alors utilisez-le. Même si vous ne possédez pas de données provenant de sources non contrôlées, vous le ferez probablement déjà ou ne le réalisez pas.
  2. Vous pouvez utiliser les protections d'empilement pour tous les tampons si vous souhaitez une protection supplémentaire en échange d'une baisse des performances. Du manuel de gcc4.4.2 :

      
        
          

    -fstack-protecteur

                 

    Émettez du code supplémentaire pour vérifier les débordements de mémoire tampon, tels que les attaques par destruction 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 mémoires tampons supérieures à 8 octets. Les gardes sont initialisés lorsqu'une fonction est entrée, puis vérifiés lorsque la fonction est fermée. Si une vérification de garde échoue, un message d'erreur s'affiche 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 diminuez la taille minimale de votre tampon. Si vous utilisez une taille de 0/1, cela revient à empiler le protecteur de pile. Si vous décidez de modifier la conception du code de sorte que le tampon soit protégé, il vous le signale simplement pour que vous le puissiez.
  5. Non, ces avertissements ne représentent pas un problème, ils vous indiquent simplement des informations. Ne les utilisez pas régulièrement.

Autres conseils

Vous ne devriez en effet pas vous soucier de l’avertissement concernant 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 des tampons de taille variable sur la pile; obtenez un calcul de taille erroné et ouvrez un grand trou.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top