Maison  >  Article  >  Opération et maintenance  >  Que signifie le dépassement de tampon dans les programmes C/C++ ?

Que signifie le dépassement de tampon dans les programmes C/C++ ?

王林
王林avant
2023-05-29 12:22:561708parcourir

1, Buffer Underflow

Cet article décrira une autre situation de débordement de tampon, c'est-à-dire un sous-débordement de tampon. Le débordement de tampon a été analysé dans la rubrique précédente (voir numéro 7). Les mêmes raisons s’appliquent aux dépassements de capacité de tampon, donc les facteurs qui provoquent des dépassements de tampon ne seront pas répétés dans cet article. Pour faire simple, le débordement de tampon fait référence à la situation dans laquelle le tampon de niveau suivant est écrasé lorsque les données de remplissage débordent. Cet article décrit les dangers du dépassement de capacité de mémoire tampon, ses signes dans le code source et comment résoudre le problème.

2. Les dangers du dépassement de tampon

Dans les programmes C/C++, le dépassement de tampon est un type grave de vulnérabilité qui peut provoquer des plantages de programmes ou l'exécution de code malveillant. De janvier à octobre 2018, un total de 494 informations sur les vulnérabilités CVE ont été impliquées. Certaines des vulnérabilités sont les suivantes :

CVE Vulnérabilité aperçu
CVE-2018-1000001 Libc Realpath buffer underflow La vulnérabilité est causée. par la bibliothèque GNU C pas correctement Traiter Le chemin relatif renvoyé par l'appel système getcwd(), d'autres bibliothèques sont également susceptibles d'être affectées par cela. Sur les systèmes concernés, les privilèges root peuvent être obtenus via le binaire SUID.
CVE-2018-1000637 zutils est un package utilitaire de traitement de fichiers compressés. Le programme prend en charge la compression/décompression, la comparaison de fichiers compressés et la vérification de l'intégrité des fichiers compressés. zcat est l'un des utilitaires de décompression. Une vulnérabilité de débordement de tampon existe dans zcat dans les versions antérieures à zutils 1.8-pre2. Un attaquant pourrait exploiter cette vulnérabilité pour provoquer un déni de service ou exécuter du code arbitraire à l'aide d'un fichier compressé spécialement conçu.
CVE-2018-5388 strongSwan 5.6.3 et les versions précédentes présentent une vulnérabilité de dépassement de tampon dans l'implémentation. Un attaquant peut exploiter cette vulnérabilité pour épuiser les ressources et provoquer un déni de service.

3. Exemple de code

L'exemple provient de Samate Juliet Test Suite pour C/C++ v1.3 (https://samate.nist.gov/SARD/testsuite.php), nom du fichier source : CWE121_Stack_Based_Buffer_Overflow__CWE193_char_alloca_cpy_01 .c.

3.1 Code de défaut

C/C++ 程序中的缓冲区下溢指的是什么

Dans l'exemple de code ci-dessus, le pointeur data se voit attribuer une valeur à la ligne 36. Grâce à l'affectation opération, On peut voir que le pointeur data pointe vers dataBadBuffer, lorsque la ligne 41 utilise strcpy() Lors de l'exécution d'une copie mémoire, la longueur du tampon source est supérieure à la longueur du tampon de destination, ce qui entraîne un débordement, et la partie de débordement dépasse la limite inférieure de dataBadBuffer, provoquant des problèmes de sous-débordement de tampon. data 进行赋值,通过赋值操作可以看出指针 data 指向 dataBadBuffer,当第41行使用 strcpy() 进行内存拷贝时,源缓冲区长度大于目的缓冲区长度从而产生溢出,溢出部分超出了 dataBadBuffer 的下边界,导致缓冲区下溢问题。

使用360代码卫士对上述示例代码进行检测,可以检出“缓冲区下溢”缺陷,显示等级为高。如图1所示:

C/C++ 程序中的缓冲区下溢指的是什么

图1:缓冲区下溢检测示例

3.2 修复代码

C/C++ 程序中的缓冲区下溢指的是什么

在上述修复代码中,Samate 给出的修复方式为:在第37行对指针 data 进行赋值,将 data指向 dataGoodBuffer,此时 data 的长度与 source 一致,当第42行使用 strcpy()

Utilisez 360 ​​Code Guard pour détecter l'exemple de code ci-dessus, vous pouvez détecter le défaut de "sous-débordement du tampon" et le niveau d'affichage est élevé. Comme le montre la figure 1 :

Sous-dépassement de tampon dans les programmes C/C++. À quoi ça sert Mean

C/C++ 程序中的缓冲区下溢指的是什么Figure 1 : Exemple de détection de sous-débordement de tampon

3.2 Code de réparation

Que signifie le dépassement de tampon dans les programmes C/C++ ?

Dans le code de réparation ci-dessus, la méthode de réparation donnée par Samate est : à la ligne 37 du pointeurdonnées pour l'affectation, pointez données vers dataGoodBuffer, à l'heure actuelle, la longueur des <code class="prettyprint code-in-text Prettyprinted">données est la même que celle de la source code> est cohérent. Lorsque la ligne 42 utilise <code class="prettyprint code-in-text Prettyprinted">strcpy() pour effectuer une opération de copie, le tampon source et le tampon de destination ont la même longueur, évitant ainsi. Correction d'un problème de dépassement de tampon. Ce problème peut également être évité par d'autres méthodes telles que les contrôles de limites.

Utilisez 360 ​​Code Guard pour détecter le code réparé, et vous pourrez voir que le défaut "buffer underflow" n'existe plus. Comme le montre la figure 2 :

Figure 2 : Résultats de détection après réparation

🎜4. Comment éviter un sous-débordement de tampon🎜🎜🎜Pour éviter un sous-débordement de tampon, vous devez faire attention aux points suivants : 🎜🎜🎜 ( 1) Essayez d’éviter d’utiliser des fonctions de manipulation de mémoire non sécurisées. 🎜🎜🎜 (2) Pour les fonctions d'opération de mémoire qui ont une indication claire de la valeur de retour, la valeur de retour de la fonction doit être efficacement jugée pour déterminer si l'opération est réussie. 🎜🎜(3) La vérification des limites doit être effectuée lors du remplissage des données dans le tampon. 🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer