Heim > Artikel > Betrieb und Instandhaltung > Was bedeutet Pufferunterlauf in C/C++-Programmen?
In diesem Artikel wird eine andere Pufferüberlaufsituation beschrieben, nämlich der Pufferunterlauf. Der Pufferüberlauf wurde im vorherigen Thema analysiert (siehe Problem 7). Die gleichen Gründe gelten für Pufferunterläufe, daher werden die Faktoren, die zu Pufferüberläufen führen, in diesem Artikel nicht wiederholt. Vereinfacht ausgedrückt bezieht sich Pufferunterlauf auf die Situation, in der der Puffer der nächsten Ebene überschrieben wird, wenn die Fülldaten überlaufen. In diesem Artikel werden die Gefahren eines Pufferunterlaufs, seine Anzeichen im Quellcode und die Behebung des Problems beschrieben.
In C/C++-Programmen ist Pufferunterlauf eine schwerwiegende Art von Sicherheitslücke, die zu Programmabstürzen oder der Ausführung von Schadcode führen kann. Von Januar bis Oktober 2018 waren insgesamt 494 Informationen zu CVE-Schwachstellen betroffen. Einige der Schwachstellen sind wie folgt:
CVE | Schwachstellenübersicht |
---|---|
CVE-2018-1000001 | Libc Realpath Buffer Underflow Schwachstelle, die. Schwachstelle Die Stabilität wird durch die GNU-C-Bibliothek verursacht Der vom Systemaufruf getcwd() zurückgegebene relative Pfad wird nicht korrekt verarbeitet. Andere Bibliotheken sind wahrscheinlich ebenfalls davon betroffen. Auf betroffenen Systemen können Root-Rechte über die SUID-Binärdatei erlangt werden. |
CVE-2018-1000637 | zutils ist ein Dienstprogramm zur komprimierten Dateiverarbeitung. Das Programm unterstützt Komprimierung/Dekomprimierung, Vergleich komprimierter Dateien und Überprüfung der Integrität komprimierter Dateien. zcat ist eines der Dekomprimierungsdienstprogramme. In zcat besteht in Versionen vor Zutils 1.8-pre2 eine Pufferüberlauf-Schwachstelle. Ein Angreifer könnte diese Sicherheitslücke ausnutzen, um einen Denial-of-Service auszulösen oder beliebigen Code mithilfe einer speziell gestalteten komprimierten Datei auszuführen. |
CVE-2018-5388 | strongSwan 5.6.3 und frühere Versionen weisen eine Pufferunterlauf-Schwachstelle in der Implementierung auf, die ein Angreifer ausnutzen kann, um Ressourcen zu erschöpfen und einen Denial-of-Service auszulösen. |
Das Beispiel stammt aus der Samate Juliet Test Suite für C/C++ v1.3 (https://samate.nist.gov/SARD/testsuite.php), Quelldateiname: CWE121_Stack_Based_Buffer_Overflow__CWE193_char_alloca_cpy_01 .c.
Im obigen Beispielcode wird dem Zeiger data
in Zeile 36 ein Wert zugewiesen. Durch die Zuweisung Operation. Es ist ersichtlich, dass der Zeiger data
auf dataBadBuffer
zeigt. wenn Zeile 41 strcpy()
verwendet. Beim Durchführen einer Speicherkopie ist die Länge des Quellpuffers größer als die Länge des Zielpuffers, was zu einem Überlauf führt. und der Überlaufteil überschreitet die untere Grenze von dataBadBuffer
, was zu Pufferunterlaufproblemen führt. data
进行赋值,通过赋值操作可以看出指针 data
指向 dataBadBuffer
,当第41行使用 strcpy()
进行内存拷贝时,源缓冲区长度大于目的缓冲区长度从而产生溢出,溢出部分超出了 dataBadBuffer
的下边界,导致缓冲区下溢问题。
使用360代码卫士对上述示例代码进行检测,可以检出“缓冲区下溢”缺陷,显示等级为高。如图1所示:
图1:缓冲区下溢检测示例
在上述修复代码中,Samate 给出的修复方式为:在第37行对指针 data
进行赋值,将 data
指向 dataGoodBuffer
,此时 data
的长度与 source
一致,当第42行使用 strcpy()
Abbildung 1: Beispiel für die Pufferunterlauferkennung
Daten
auf dataGoodBuffer, zu diesem Zeitpunkt ist die Länge der <code class="prettyprint code-in-text Prettyprinted">Daten
dieselbe wie die der Quelle code> ist konsistent. Wenn Zeile 42 <code class="prettyprint code-in-text Prettyprinted">strcpy()
verwendet, um einen Kopiervorgang auszuführen, haben der Quellpuffer und der Zielpuffer die gleiche Länge, wodurch vermieden wird Problem mit Pufferunterlauf behoben. Dieses Problem kann auch durch andere Methoden wie z. B. Grenzüberprüfungen vermieden werden. 🎜4. So vermeiden Sie einen Pufferunterlauf🎜🎜🎜Um einen Pufferunterlauf zu vermeiden, müssen Sie auf die folgenden Punkte achten: 🎜🎜🎜 ( 1) Vermeiden Sie die Verwendung unsicherer Speichermanipulationsfunktionen. 🎜🎜🎜 (2) Bei Speicheroperationsfunktionen, die einen klaren Hinweis auf den Rückgabewert haben, sollte der Rückgabewert der Funktion effektiv beurteilt werden, um festzustellen, ob die Operation erfolgreich ist. 🎜🎜(3) Beim Füllen von Daten in den Puffer muss eine Grenzüberprüfung durchgeführt werden. 🎜🎜Verwenden Sie 360 Code Guard, um den reparierten Code zu erkennen, und Sie können sehen, dass der Fehler „Pufferunterlauf“ nicht mehr besteht. Wie in Abbildung 2 dargestellt:
Abbildung 2: Erkennungsergebnisse nach der Reparatur
Das obige ist der detaillierte Inhalt vonWas bedeutet Pufferunterlauf in C/C++-Programmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!