Heim  >  Artikel  >  Betrieb und Instandhaltung  >  [Defect Weekly] Problem 31: Falsche Speicherfreigabe

[Defect Weekly] Problem 31: Falsche Speicherfreigabe

WBOY
WBOYnach vorne
2023-05-23 23:07:351396Durchsuche

1. Falsche Speicherfreigabemethode

Zu den allgemeinen Speicheranwendungsfunktionen in der C-Sprache gehören malloc(), realloc(), calloc(), obwohl sie unterschiedliche Funktionen haben, entsprechen sie alle derselben Speicherfreigabefunktion free(), Speicheranwendung und -freigabe in C++ übernehmen die Methoden new/delete, new []/delete[]. Unabhängig davon, ob es sich um eine C-Sprache oder eine C++-Sprache handelt, müssen Sie beim Schreiben von Quellcode die Speicherfreigabemethode entsprechend den verschiedenen Speicheranwendungsmethoden auswählen, um die Verwendung der falschen Speicherfreigabe zu vermeiden. Zum Beispiel: gemischte Verwendung der C/C++-Speicherzuweisung/-freigabe oder gemischte Verwendung der Skalar- und Vektorspeicherzuweisung/-freigabe. malloc()realloc()calloc(),它们虽然功能不同,但都对应同一个内存释放函数 free(),C++中对内存的申请和释放采用new/delete、new []/delete[] 方式。不管是 C 语言还是 C++ 语言,当编写源代码时要根据内存申请的方法不同来对应地选择内存释放方法,避免使用错误的内存释放。例如:混合使用C/C++的内存申请/释放,或混合使用标量和矢量的内存申请/释放。

2、 错误的内存释放方法的危害

错误地释放内存可能会导致程序出现意料之外的错误行为,甚至导致程序崩溃。在《effective C++(第二版)》条目5“对应的 new 和 delete 要采用相同形式”中指出:“如果错误地释放对象中的元素,可能造成整个对象、甚至整个堆上的内存结构都发生损坏,从而发生内存泄漏,甚至导致程序崩溃”。

在CVE数据库中,也有与此相关的漏洞信息。自2018年1月至2019年4月,CVE数据库中共有3条相关漏洞信息。漏洞信息如下:

CVE 漏洞概况
CVE-2018-14948 dilawar sound2017-11-27 及之前版本中的 wav-file.cc文件存在错误的内存释放方法漏洞 (new[]/delete)。
CVE-2018-14947 PDF2JSON 0.69 版本中的 XmlFonts.cc 文件的‘XmlFontAccu::CSStyle’函数存在错误的内存释放漏洞(new[]/delete)。
CVE-2018-14946 PDF2JSON 0.69 版本中的 ImgOutputDev.cc 文件的 HtmlString 类存在错误的内存方法漏洞 (malloc/delete)。

3、示例代码

示例源于 Samate Juliet Test Suite for C/C++ v1.3 (https://samate.nist.gov/SARD/testsuite.php),源文件名:CWE762_Mismatched_Memory_Management_Routines__new_array_delete_char_01.cpp。

3.1缺陷代码

[Defect Weekly] Problem 31: Falsche Speicherfreigabe

在上述示例代码中,第31行使用 new[] 创建对象数组,在第34行使用 delete 进行释放,由于在释放对象数组时,没有使用 new[] 对应的 delete[],因此存在“错误的内存释放方法”问题。

使用代码卫士对上述示例代码进行检测,可以检出“错误的内存释放方法”缺陷,显示等级为中。如图1所示:

[Defect Weekly] Problem 31: Falsche Speicherfreigabe

图1:错误的内存释放方法的检测示例

3.2 修复代码

[Defect Weekly] Problem 31: Falsche Speicherfreigabe

在上述修复代码中,Samate 给出的修复方式为:在第31行通过 new[] 创建对象数组,并在第33行使用 delete[]

2. Der Schaden falscher Speicherfreigabemethoden

[Defect Weekly] Problem 31: Falsche SpeicherfreigabeEine falsche Speicherfreigabe kann zu unerwartetem fehlerhaftem Verhalten des Programms oder sogar zum Absturz des Programms führen. Punkt 5 von „Effective C++ (Second Edition)“ „Die entsprechenden Neu- und Löschvorgänge müssen dieselbe Form annehmen“ weist darauf hin: „Wenn die Elemente im Objekt falsch freigegeben werden, kann dies dazu führen, dass das gesamte Objekt oder sogar die gesamte Speicherstruktur beschädigt wird.“ Der Heap kann beschädigt werden, was zu Speicherverlusten oder sogar Programmabstürzen führt.

In der CVE-Datenbank gibt es auch diesbezügliche Schwachstelleninformationen. Von Januar 2018 bis April 2019 gab es in der CVE-Datenbank insgesamt drei verwandte Schwachstelleninformationen. Die Informationen zur Sicherheitslücke lauten wie folgt:

CVE Vulnerability Overview
CVE-2018-14948 In der Datei wav-file.cc in dilawar sound2017-11 liegt ein Fehler vor -27 und frühere Versionen: Sicherheitslücke bei der Speicherfreigabemethode (new[]/delete).
CVE-2018-14947 Die Funktion „XmlFontAccu::CSStyle“ der Datei XmlFonts.cc in PDF2JSON Version 0.69 weist eine Sicherheitslücke aufgrund falscher Speicherfreigabe auf ( neu[]/löschen).
CVE-2018-14946 Die Datei ImgOutputDev.cc in PDF2JSON Version 0.69 weist eine Sicherheitslücke bezüglich falscher Speichermethoden (malloc/delete) in der HtmlString-Klasse auf .

3. Beispielcode

Das Beispiel stammt aus der Samate Juliet Test Suite für C/C++ v1.3 (https://samate.nist.gov / SARD/testsuite.php), Name der Quelldatei: CWE762_Mismatched_Memory_Management_Routines__new_array_delete_char_01.cpp.

3.1 Fehlercode

【Defect Weekly Talk „ 】Problem 31: Falsche Speicherfreigabe“ /><p></p>Im obigen Beispielcode verwendet Zeile 31 <code class=new[], um ein Objektarray zu erstellen Zeile 34 verwendet <code class="prettyprint code-in-text Prettyprinted">delete zum Freigeben, da beim Freigeben des Objektarrays new nicht verwendet wird . [] entspricht delete[], es liegt also ein Problem mit der „falschen Speicherfreigabemethode“ vor. 🎜🎜Verwenden Sie Code Guard, um den oben genannten Beispielcode zu erkennen. Sie können den Fehler „Falsche Speicherfreigabemethode“ erkennen und die Anzeigeebene ist mittel. Wie in Abbildung 1 gezeigt: 🎜🎜[Defects Weekly] Problem 31: Fehler „Speicher release🎜🎜🎜Abbildung 1: Erkennungsbeispiel einer falschen Speicherfreigabemethode🎜

🎜3.2 Reparaturcode🎜

🎜[Defects Weekly] Problem 31: Falsche Speicherfreigabe🎜🎜Im obigen Reparaturcode lautet die von Samate angegebene Reparaturmethode: Zeile 31 erstellt ein Objektarray durch new[] und verwendet delete[ in Zeile 33 ] zum Freigeben. Dies vermeidet falsche Speicherfreigabemethoden. 🎜🎜Verwenden Sie Code Guard, um den reparierten Code zu erkennen, und Sie können sehen, dass der Fehler „Falsche Speicherfreigabemethode“ nicht mehr besteht. Wie in Abbildung 2 dargestellt: 🎜🎜🎜🎜🎜🎜Abbildung 2: Erkennungsergebnisse nach der Reparatur🎜🎜🎜4. So vermeiden Sie falsche Speicherfreigabemethoden🎜🎜🎜Um falsche Speicherfreigabemethoden zu vermeiden, müssen Sie auf die folgenden Punkte achten :🎜🎜(1) Klären Sie beim Freigeben von Speicher die für die Speicheranwendung verwendete Methode, um zu vermeiden, dass aufgrund komplexer Programmstruktur und Nachlässigkeit des Personals die falsche Freigabemethode verwendet wird. 🎜🎜(2) Mithilfe statischer Quellcode-Analysetools kann diese Art von Problem effektiv erkannt werden. 🎜

Das obige ist der detaillierte Inhalt von[Defect Weekly] Problem 31: Falsche Speicherfreigabe. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen