Une compréhension simple de la version secondaire est que la mémoire pointée par le même pointeur est libérée deux fois pour le code source du langage C, les opérations free() sont effectuées deux fois sur le même pointeur, ce qui peut en résulter. dans deux Release, le code défectueux du chapitre 3.1 de cet article décrit ce type de situation. Dans le langage C++, une opération de copie superficielle inappropriée est l’une des causes courantes de publication secondaire. Par exemple : appeler une fois l’opérateur d’affectation ou le constructeur de copie fera pointer les données membres des deux objets vers la même mémoire dynamique. À ce stade, le mécanisme de comptage de références devient très important lorsque le comptage de références est incorrect et qu'un objet sort de la portée, le destructeur libère la mémoire partagée par les deux objets. Le membre de données correspondant dans un autre objet pointera vers l'adresse mémoire qui a été libérée. Lorsque cet objet sort également de la portée, son destructeur tente à nouveau de libérer la mémoire, provoquant un problème de libération secondaire. Veuillez consulter CWE ID 415 : Double gratuit pour plus de détails.
La deuxième libération de mémoire peut entraîner des plantages d'applications, des attaques par déni de service et d'autres problèmes. De janvier à novembre 2018, il y avait un total de 38 informations de vulnérabilité associées dans CVE. Certaines des vulnérabilités sont les suivantes :
CVE Number | Overview |
---|---|
CVE-2018-18751 | 'def of read-catalog.c file in GNU gettext version 0.19. 8 Fonction aultaddmessage Il existe une vulnérabilité de version secondaire. |
CVE-2018-17097 | Olli Parviainen SoundTouch version 2.0 contient une vulnérabilité de sécurité dans la classe WavFileBase du fichier WavFile.cpp qui pourrait permettre à un attaquant distant de provoquer un déni de service (version secondaire). |
CVE-2018-16425 | OpenSC dans les versions antérieures à 0.19.0-rc1 présente une vulnérabilité gratuite secondaire dans la fonction 'scpkcs15emuschsminit' du fichier libopensc/pkcs15-sc-hsm.c. Un attaquant pourrait exploiter cette vulnérabilité pour provoquer un déni de service (plantage de l'application) à l'aide d'une carte à puce spécialement conçue. |
CVE-2018-16402 | elfutils version 0.173 contient un problème de sécurité dans le fichier libelf/elf_end.c qui pourrait permettre à un attaquant distant de provoquer un déni de service (version secondaire et crash de l'application). |
L'exemple provient de Samate Juliet Test Suite pour C/C++ v1.3 (https://samate.nist.gov/SARD/testsuite.php), nom du fichier source : CWE415_Double_Free__malloc_free_char_17 .c.
Dans l'exemple de code ci-dessus, utilisez malloc()
pour l'allocation de mémoire à la ligne 32, et dans ligne 36, utilisez free()
pour libérer la mémoire allouée. À la ligne 38, for
instruction de boucle, la mémoire libérée data
est à nouveau libérée, provoquant un problème de version secondaire. malloc()
进行内存分配,并在第36行使用 free()
对分配的内存进行了释放,在第38行 for
循环语句中,又对已经释放的内存 data
进行了一次释放,导致二次释放问题。
使用360代码卫士对上述示例代码进行检测,可以检出“二次释放”缺陷,显示等级为中。如图1所示:
图1:二次释放检测示例
在上述修复代码中,Samate 给出的修复方式为: 在第32行使用 malloc()
进行内存分配,并在第36行处使用 free()
进行释放,释放后不在对该内存进行释放操作。
使用360代码卫士对修复后的代码进行检测,可以看到已不存在“二次释放”缺陷。如图2:
图2:修复后检测结果
4 、如何避免二次释放
要避免二次释放,需要注意以下几点:
🎜🎜3.2 Code de réparation🎜🎜🎜🎜🎜🎜Dans le code de réparation ci-dessus, la méthode de réparation donnée par Samate est : Utilisez(1)野指针是导致二次释放和释放后使用的重要原因之一,消除野指针的有效方式是在释放指针之后立即把它设置为
Utilisez 360 Code Guard pour détecter l'exemple de code ci-dessus. Vous pouvez détecter le défaut de "version secondaire", et le niveau d'affichage est moyen. Comme le montre la figure 1 : Figure 1 : Exemple de détection de version secondaireNULL
malloc()
pour allouer de la mémoire, et utilisez free()
pour la libérer à la ligne 36. Après la sortie , ce ne sera plus le cas. La mémoire est libérée. 🎜🎜Utilisez 360 Code Guard pour détecter le code réparé, et vous pourrez voir qu'il n'y a pas de défaut de "version secondaire". Comme le montre la figure 2 : 🎜🎜🎜🎜🎜Figure 2 : Résultats de détection après réparation🎜🎜🎜4. Comment éviter une version secondaire🎜🎜🎜Pour éviter une version secondaire, vous devez faire attention aux points suivants :🎜🎜(1 ) Les pointeurs sauvages provoquent des versions secondaires. L'une des raisons importantes de la publication et de l'utilisation après la publication. Un moyen efficace d'éliminer les pointeurs sauvages est de le définir sur NULL
ou. définissez-le sur pointeur immédiatement après l'avoir relâché. Un autre objet légal. 🎜🎜(2) Pour le problème de version secondaire causé par la copie superficielle C++, toujours effectuer une copie approfondie est une bonne solution. 🎜🎜(3) À l'aide des outils d'analyse statique du code source, vous pouvez découvrir automatiquement d'éventuels problèmes de version secondaire dans le programme. 🎜🎜
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!