2 votes

Est-ce plus sûr d'écrire un programme en utilisant des variables globales?

Je lisais à propos des dépassements de tampon, de pile et de tas. J'ai lu également ce post. Ma question est la suivante : si j'utilise uniquement des variables globales dans mon code, est-ce que je peux dire que cela prévient toutes les attaques de dépassement de tampon ?

disons que j'ai ces tampons dans le code déclarés dans la portée globale :

char buf1[10];
char buf2[100];

Si j'envoie buf1 comme tampon à recv(int s, char *buf, int len,int flags);

  1. Je vais écraser le segment de données et je pourrais ruiner le contenu de buf2, non ?
  2. Serais-je capable d'exécuter du code à partir de là car, d'après ce que je sais, ce n'est pas un segment de code et le segment de données n'est pas exécutable.

Pouvons-nous en conclure que l'utilisation des variables globales est la manière la plus sûre ?

7voto

Oli Charlesworth Points 148744

Non, pas du tout. Bien qu'il soit plus difficile de modifier directement les adresses de retour, etc. sur la pile, il est toujours possible de corrompre ou d'attaquer de manière malveillante un tel programme (s'il est négligeant à propos des débordements de mémoire tampon).

3voto

Andrew Tomazos Points 18711

Puis-je dire que cela empêche toutes les exploitations du débordement ?

Non, les variables globales peuvent être débordées.

si je dis, par exemple, que j'envoie ceci comme tampon à recv(int s, char *buf, int len,int flags); je vais écraser le segment de données et je pourrais ruiner le contenu de buf2, mais je ne pourrais pas exécuter de code à partir de cela. Est-ce que j'ai raison ? Utiliser des variables globales est la manière la plus sûre ?

Non, la durée de stockage d'une variable n'a aucun impact sur le fait qu'elle puisse être débordée ou non.

3voto

Ricibob Points 2503

La meilleure façon d'éviter le débordement de tampon est d'éviter l'utilisation de tampons statiques et d'utiliser des bibliothèques comme STL, boost, etc. pour tout objet nécessitant une allocation de mémoire, par exemple utiliser un vecteur STL à la place d'un tableau.

2voto

Amardeep Points 10417

Les vulnérabilités de débordement de tampon existent depuis qu'un tampon sur la pile est co-implanté avec une adresse de retour plus loin sur la pile. Finalement, la fonction doit retourner et utilise cette adresse pour continuer l'exécution. En écrivant intentionnellement un tampon, on peut déposer une adresse de retour différente, peut-être vers un code déposé par l'attaquant.

Utiliser des tampons globaux réduit certainement la possibilité de ce type spécifique d'exploit. Cependant, cela ne réduit pas la possibilité d'échec de l'application en raison de données endommagées en dehors des limites de l'opération en cours.

Les données globales ont également leurs inconvénients et ne constituent pas une solution complète. La meilleure approche serait donc de concevoir votre code de manière défensive de sorte qu'un dépassement de tampon ne puisse tout simplement pas se produire, peu importe l'emplacement du tampon.

Les langages C et C++ proposent tous deux des versions sécurisées des fonctions de tampon et celles-ci devraient être utilisées en combinaison avec une bonne conception comme principale protection contre les exploits de sécurité.

2voto

Martin James Points 15655

Peu importe où se trouvent vos données. Si vous essayez assez fort, vous pouvez écrire en dehors de celles-ci. Que ce soit ou non une débordement de tampon de pile puisse être utilisé pour écraser une adresse de retour et provoquer l'exécution de code dans le tampon, cela dépend de l'architecture. À mon avis, les données dans le segment de pile ne devraient pas être exécutables et toute tentative de les exécuter devrait entraîner une interruption de gestion de la mémoire.

Utiliser des "globales" à la place de variables de pile n'est de toute façon pas une solution saine pour autre chose que des applications triviales.

Je charge uniquement des données dans des tampons alloués dynamiquement à l'intérieur des classes de tampon, donc les débordements de tampons de pile n'ont jamais été un problème dans mes applications (et d'ailleurs, je ne dépasse tout simplement pas les tampons!)

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