Maison >Opération et maintenance >Sécurité >Que signifie le dépassement de tampon dans les programmes C/C++ ?
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.
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. |
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.
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所示:
图1:缓冲区下溢检测示例
在上述修复代码中,Samate 给出的修复方式为:在第37行对指针 data
进行赋值,将 data
指向 dataGoodBuffer
,此时 data
的长度与 source
一致,当第42行使用 strcpy()
Figure 1 : Exemple de détection de sous-débordement de tampon
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. 🎜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. 🎜🎜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
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!