Qu'est-ce que Stack Smashing? Il peut être corrigé?

Contenu

balle casser tas de pièces de monnaie

Chaque minute d'arrêt de production coûtera généralement de l'argent à l'entreprise. Si votre application a un obstacle sérieux provoquant la rupture de la batterie, il est en voyage. Apprenez à l'avance ce qu'est le déchiquetage de batterie et ce qui peut être fait à ce sujet !!

Qu'est que c'est Pile fracassante?

Travailler en tant qu'ingénieur assurance qualité, tôt ou tard on rencontrera le terme pile écraser. En tant que développeur, ce terme est susceptible d'être découvert encore plus tôt, surtout si une erreur a été saisie dans le code, ce qui cause une batterie cassée. C'est relativement facile (comme dans 'quelque chose de facile’) pour un développeur de faire une erreur qui introduit une rupture de batterie. En tant qu'utilisateur, quand j'apprends à casser les piles, le mal est probablement déjà fait.

La rupture de la batterie peut se produire involontairement, par exemple, lorsque le développeur a introduit un bogue qui a fait planter la pile, ou malicieusement, un attaquant qui essaie en quelque sorte de déborder ou de corrompre la pile d'un programme.

Stack smashing est une définition avec une définition quelque peu vague qui peut indiquer divers problèmes et peut provenir de diverses sources. Les deux problèmes les plus importants qui peuvent provoquer la rupture de la batterie sont; 1) Écrire / sur-allouer trop de données dans une partie donnée de la pile, écrasant ainsi une autre partie de la pile, et 2) où une source externe (malveillant ou pas) écrasé la pile d'un autre programme, même si c'est beaucoup moins courant .

Ensuite, Qu'est-ce qu'une pile? C'est aussi une définition vaguement définie. En termes générales, une pile fait référence à une pile de traitement de programme, une pile de fonctions définies dans un programme / code logiciel donné.

Commencez par imaginer une pile de carreaux de salle de bain empilés, prêt à être utilisé par un carreleur. C'est une assez bonne représentation d'une pile d'ordinateurs., avec quelques modifs. Si chaque mosaïque était un peu décalée de la précédente, ce serait une meilleure image, et bientôt nous verrons pourquoi.

Imaginez que chaque tuile empilée est une fonction dans le programme informatique. La fonction la plus basique est en bas et pourrait être, par exemple, la main() fonction dans un programme C ou C ++. C y C ++ sont deux langages de programmation qui utilisent beaucoup la pile.

Chacune de ces fonctions dans le programme C / C ++ aura un nom et probablement un ensemble de variables entrantes et sortantes. En termes simplifiés, imaginez si l'une de ces variables avait une longueur de 10 caractères et une autre fonction tapés accidentellement 100 caractères dans cette variable. Cela peut endommager la pile entière..

En ce qui concerne l'exemple de tuile ci-dessus, imaginez quelqu'un avec un marteau frappant trop fort la première tuile et cassant ainsi toutes les autres tuiles. Eh voila; rupture de pieux 😉

L'analogie fonctionne parce que, tout comme toutes les tuiles sont maintenant brisées dans notre image mémoire fictive, une batterie cassée entraînera 'Fonctions cassées’ Si tu fais semblant. Chaque décalage de tuile est une fonction plus profondément imbriquée; plus sur les fonctions cassées dans la section suivante.

Dépuration Batterie (s) éclaté

Alors que techniquement une référence à 'Fonctions cassées’ peut ne pas être tout à fait correct, En d'autres termes, il n'y a probablement qu'une seule fonction cassée, et même il peut ne pas y avoir de fonction cassée lorsqu'il y a une attaque externe ou un programme défectueux, c'est une excellente façon de penser à une batterie cassée.

Soudain, les noms de variables et de fonctions peuvent être modifiés, y un backtrace (le flux de fonctions que l'ordinateur a pris pour arriver à une fonction donnée qui s'est écrasée, et (dans notre exemple) a cassé la pile) ça n'a plus de sens.

En termes générales, quand on regarde une trace, aura un flux clair de fonctions qui ont été appelées. Bien qu'un programme défaillant ne puisse pas être immédiatement qualifié de « sain », en termes de recul / dépuration, voici à quoi ressemble un retour "sain":

Une pile « saine » via le backtrace (bt) en utilisant GDB

Malgré cela, quand une batterie est mauvaise, le débogage devient beaucoup plus difficile. La pile peut ressembler à ceci:

Un vidage de pile écrasant généré par mysqld, le serveur de base de données MySQL

Ceci est un exemple d'un problème de rupture de pile qui s'est produit dans MySQL, le serveur de base de données (Demande à log.txt attaché à Erreur de MySQL 37815 pour une sortie complète) au 2008, qui a causé le démon du serveur de base de données (mysqld) pour terminer.

Alors que la bibliothèque du système d'exploitation libc.so.6, dans cette circonstance, semble avoir assez bien géré la pile de rupture (en utilisant certaines fonctionnalités de fortification dans le __fortify_fail fonction), le problème existait quelque part dans le code et a depuis été résolu.

Notez également que dans cette circonstance, nous ne voyons pas les noms de fonction résolus, on ne nous montre que le nom binaire (avec curiosité, le problème semble venir du client (mysql) provoquant le serveur (mysqld) pour terminer) Qu'est que c'est mysql, avec une adresse mémoire de la fonction: mysql[0x8051565], mysql[0x80525c7] et mysql(main+0x4f8)[0x8053198].

Régulièrement, lorsque nous utilisons des symboles de débogage (voir ci-dessous un article sur GDB qui explique en détail quels sont les symboles de débogage), nous verrions des noms de fonctions avec des variables, et même avec quelques niveaux d'optimisation / minification binaire implémentée, au moins on verrait les noms des fonctions, comme ce que l'on voit dans le premier backtrace ‘sain’ antérieur.

Malgré cela, en cas de batterie cassée, la sortie des noms de fonction, les noms ou les valeurs des variables ne sont jamais garantis et, souvent, un verbiage est terminé 🙂 On peut même voir différents noms de fonctions ou un tas brisé (un autre jargon souvent utilisé par les informaticiens) des noms de fonctions différents qui n'ont pas beaucoup de sens (et ils sont probablement fictifs / false car la pile a été écrasée d'une manière ou d'une autre).

Cela rend plus difficile à la fois pour l'ingénieur de test (qui peut aboutir à de nombreux résultats différents pour une seule erreur, ce qui complique la gestion du mécanisme de filtrage d'erreurs connu) quant au développeur (que vous devrez probablement utiliser une trace pas à pas ou un débogueur inversé comme RR pour découvrir l'erreur en question).

Que faire lorsque vous affrontez Stack Smashing?

Si vous rencontrez des piles cassées, la première chose à faire est de comprendre un peu mieux le problème et l'environnement pour en connaître la source. Si vous avez un serveur Web populaire exposé sur Internet avec de nombreux utilisateurs de jeux essayant de gagner un tournoi alors que le serveur exploite également Bitcoin, vous voudrez saisir une opportunité de jeu déloyal et découvrir si quelqu'un joue avec le serveur.

Malgré cela, dans la majorité des cas, le problème sera juste une erreur d'application. Pendant que je dis 'solo’, le problème peut être très important, peut entraîner une interruption des services, cela peut coûter beaucoup d'argent et, pour terminer, ça ne peut pas être réparé. Par exemple, un serveur de base de données peut échouer de manière persistante lorsqu'il est démarré en raison d'un certain état des données associé à une déficience ou à une limitation du code.

Si une telle situation est aggravée en ne cassant pas la batterie, ou autrement dit, ne pas être en mesure de générer un suivi propre du problème, le débogage sera plus compliqué et, parfois, presque impossible. Malgré cela, ne t'en fais pas, le même débogage de base que pour tout bogue ou erreur / échec / problème d'application reste le même.

Veuillez lire attentivement tous les fichiers journaux avant, pendant et après l'apparition du problème. Faites quelques sauvegardes puis réessayez l'opération. Est-ce que ça échoue à nouveau ou pas? Enquêter sur les bogues, les parties de la pile et même les cadres (En d'autres termes, les fonctions individuelles de la pile affichées, comme lui do_the_maths fonction dans notre « trace de pile saine’ original) peut être placé dans vos moteurs de recherche préférés.

Concaténar (avec un espace) les cadres verrouillés les plus sélectifs (supérieur) et la recherche du même en ligne vous donne souvent un rapport de bogue existant pour le problème auquel vous êtes confronté. Même comme ça, en cas de coupure de batterie, ces cadres sont probablement (noms de fonction) ont été gâtés et, pour cela, ne peut plus être utilisé de la même manière. Si vous voyez un message d'affirmation (une assertion instituée par le développeur dans le code) de tout genre, regarde aussi.

Déposez toujours un nouveau rapport de bogue si le problème ne semble toujours pas être enregistré en ligne (Vous aidez peut-être d'autres personnes qui voient la même chose!) Et fournissez autant d'informations sur le problème que vous pouvez trouver. Des centaines de rapports de bogues concernant tant d'applications sont enregistrés en ligne chaque jour. Avec chance, l'équipe de support de votre application de destruction de pile est habilitée à vous aider rapidement.

Vous pouvez également lire notre article Débogage avec GDB: Présentation ci-dessous, car il est basé sur la façon dont les programmes C et C peuvent être débogués ++ (et autres) avec le débogueur GDB. Il explique également plus en détail les concepts d'une pile.

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.