Gehen Sie einen schnelleren, intelligenteren Weg zur KI-gestützten C/C++-Testautomatisierung. Erfahren Sie mehr >>
Was ist CERT C++?
Bei der Softwareentwicklung ist Sicherheit eine Schlüsselkomponente, und CERT C++ ist eine der besten Optionen, wenn Sie ordnungsgemäße Sicherheitsstandards für die Codierung einhalten möchten. Lesen Sie weiter, um zu erfahren, warum Sie CERT C++ nicht außer Acht lassen sollten.
Bei der Softwareentwicklung ist Sicherheit eine Schlüsselkomponente, und CERT C++ ist eine der besten Optionen, wenn Sie ordnungsgemäße Sicherheitsstandards für die Codierung einhalten möchten. Lesen Sie weiter, um zu erfahren, warum Sie CERT C++ nicht außer Acht lassen sollten.
Sicherheit wird zu einem neuen Mantra von Softwareentwicklungsteams, insbesondere für diejenigen, die für Sicherheit oder geschäftskritische Software verantwortlich sind. In der Vergangenheit war Sicherheit oft eine Funktion, die Teams ganz am Ende des Entwicklungszyklus zu bereits erstellten Systemen hinzuzufügen versuchten, oft indem sie sich in einem Teufelskreis aus Penetrationstests und Korrekturen drehten. Heute wissen wir, dass Sicherheit eine solide technische Disziplin ist, die durch zahlreiche Forschungsprogramme und Standards unterstützt wird.
Wenn Sie möchten, dass Ihr System von Anfang an sicher ist, müssen Sie ganz am Anfang des Entwicklungsprozesses beginnen und sicherstellen, dass jede Zeile des erstellten Codes den Best Practices für Sicherheit folgt. Für Teams, die in C++ entwickeln, ist dies eine der besten Optionen, auf die man sich verlassen kann CERT-Standard für sichere Codierung. Parasoft C/C++test ist das einzige Tool, das diesen Standard umfassend unterstützt. Sicherheitstests von Parasoft und Compliance ist die umfassendste Lösung auf dem Markt für C- und C++-Code.
Der 2006 erstmals veröffentlichte SEI CERT C++-Standard ist eine Erweiterung des CERT C-Standards. Beide stammen aus der Computer-Notfallteam (CERT) des Software Engineering Institute der Carnegie Mellon University.
Das Hauptziel von CERT C++ besteht darin, sichere Codierungspraktiken zu fördern, indem Entwicklern eine sicherere Teilmenge der C++-Sprache zur Verfügung gestellt wird, die Softwareschwächen vermeidet, die zu Sicherheitslücken führen. Darüber hinaus tragen diese Codierungsregeln und -praktiken dazu bei, die Zuverlässigkeit und Wartbarkeit der Software zu verbessern. Der CERT C++-Standard wird häufig als Codierungsstandard verwendet, um Unternehmen dabei zu helfen, Compliance-Ziele für Sicherheit und Schutz zu erreichen.
Vor C++11 veranlasste das Fehlen oder die Trennung der Standardisierung für Ganzzahltypen in C++ einige Entwickler dazu, die Sprache C zu verwenden Datei für Typdefinitionen. Dies führte zu Kompatibilitätsproblemen beim Codieren, Erstellen portabler Programme und der Integration mit C++-Funktionen. in C++ ist ein wertvolles Werkzeug, da es Integer-Typen mit präziser Größe bietet, die Portabilität des Codes verbessert und die Wahrscheinlichkeit von Sicherheitsproblemen im Zusammenhang mit Integers verringert. Dennoch ist es wichtig zu beachten, dass die bloße Verwendung beseitigt nicht automatisch Schwachstellen wie Ganzzahlüberläufe, Typverwechslungen, Pufferüberläufe, Schwachstellen bei Formatzeichenfolgen und Big/Little-Endian-Probleme, die zu Schwachstellen bei der Dateninterpretation führen können.
Um eine sichere Codebasis aufrechtzuerhalten, müssen Sie sich an etablierte Best Practices für die CERT C++-Codierung halten, wie z. B. die gründliche Überprüfung von Grenzen, die Auswahl der richtigen Ganzzahltypen und die Validierung von Eingabedaten. Diese Vorsichtsmaßnahmen sind entscheidend, um die Wahrscheinlichkeit von Sicherheitsproblemen zu verringern.
Primäre Ausdrücke in C++ sind die Bausteine der Sprache und umfassen Variablen, Literale, Funktionsaufrufe usw. Im Kontext der sicheren Codierung mit CERT C++ stehen primäre Ausdrücke im Fokus, da diese Vorgänge potenzielle Schwachstellenquellen sein können. Der Codierungsstandard bietet Regeln und Richtlinien für die sichere Verwendung von Primärausdrücken, wie zum Beispiel:
Der SEI CERT C++-Standard führt eine Sammlung von Regeln ein, um sichere Codierungspraktiken durchzusetzen und anfällige Codekonstrukte zu eliminieren. Der Standard ist in 11 Kapitel gegliedert, die Regeln zu bestimmten Themenbereichen enthalten. Im Gegensatz zu CERT C enthält der Codierungsstandard CERT C++ nur Regeln und keine Empfehlungen. Eine weitere Prüfung und Entwicklung steht noch aus.
SEI CERT C++ basiert auf dem CERT C-Standard und umfasst die Teilmenge der CERT C-Regeln, die für C++ gelten. Derzeit gibt es – bedenken Sie, dass es sich bei CERT um lebende Standards handelt – 143 CERT C++-Regeln und 136 von CERT C geerbte Regeln. Eine Übersicht über den CERT C++-Standard wird in der folgenden Tabelle dargestellt, gefolgt von einer Liste seiner Kapitel.

Bietet Regeln und Richtlinien zum Deklarieren und Initialisieren von Variablen und Objekten auf eine Weise, die einen gültigen, initialisierten Zustand gewährleistet und häufige Fallstricke vermeidet.
Behandelt Regeln im Zusammenhang mit Ausdrücken, betont die Notwendigkeit einer ordnungsgemäßen Handhabung von Ausdrucksergebnissen, der Vermeidung unbeabsichtigter Nebenwirkungen und der Sicherstellung, dass Ausdrücke wohlgeformt und wartbar sind.
Der Schwerpunkt liegt auf Regeln für den Umgang mit Ganzzahlen, wobei der Schwerpunkt auf der Verhinderung von Ganzzahlüberläufen, -unterläufen und anderen Problemen im Zusammenhang mit Ganzzahloperationen liegt.
Dieses Kapitel befasst sich mit Regeln für die Verwendung von C++-Standardbibliothekscontainern wie Vektoren und Arrays und fördert eine sichere und effiziente Containerverwaltung und -nutzung.
Bietet Richtlinien für den ordnungsgemäßen Umgang mit Zeichen und Zeichenfolgen, einschließlich der Gewährleistung einer ordnungsgemäßen Nullterminierung und der Vermeidung häufiger Sicherheitslücken im Zusammenhang mit Zeichenfolgen.
Konzentriert sich auf Regeln für eine effektive Speicherverwaltung, einschließlich dynamischer Speicherzuweisung und -freigabe, um Speicherlecks und andere speicherbezogene Probleme zu verhindern.
Behandelt Regeln für sichere Eingabe- und Ausgabevorgänge und hebt die Bedeutung der Validierung von Eingabedaten und der sicheren Handhabung von Dateivorgängen hervor.
Behandelt Regeln für die Verwaltung von Ausnahmen und Fehlern und legt den Schwerpunkt auf Best Practices für die Behandlung von Ausnahmen und Fehlern in C++-Code.
Bietet Richtlinien für die objektorientierte Programmierung, einschließlich Empfehlungen für Klassendesign, Vererbung und Polymorphismus.
Der Schwerpunkt liegt auf Regeln im Zusammenhang mit gleichzeitiger Programmierung, der Lösung von Problemen und Best Practices für Multithreading und Parallelität.
Enthält verschiedene Regeln, die nicht genau in die anderen Kategorien passen, aber wichtig sind Sicheres und zuverlässiges Schreiben C++-Code.
Wie die obige Tabelle zeigt, enthält jede dieser Regeln der obersten Ebene spezifischere Regeln, von denen einige spezifisch für C++ sind und einige auch von CERT C gelten.
Parasoft C / C ++ test unterstützt die CERT C++-Programmierrichtlinien vollständig. Die Testkonfiguration („SEI CERT C++ Rules“) aktiviert alle Prüfer des ursprünglichen CERT C++-Regelsatzes und die für C++ anwendbaren CERT C-Regeln. Dies entspricht genau der CERT-Definition, um die Sicherheit Ihrer C++-Codebasis zu gewährleisten. Unternehmen, die mit C und C++ entwickeln, einschließlich Teams, die einen Wechsel zu C++ planen, können sich auf eine einheitliche Lösung mit konsistenter Berichterstattung verlassen.
Teams profitieren außerdem von speziellen Compliance-Berichten für CERT C und C++, um einen nachhaltigen Compliance-Prozess aufzubauen. Mit Berichtserweiterungen können Benutzer eine dynamische Ansicht des Compliance-Prozesses erhalten und die Verstöße nach Priorität gemäß dem CERT-Risikobewertungsrahmen überprüfen.
CERT schreibt jedem Verstoß eine Bewertung für die folgenden drei Faktoren zu:
Die Priorität wird als Produkt dieser drei Faktoren berechnet und in die Stufen L1, L2 und L3 unterteilt. L1 steht für Verstöße mit hohem Schweregrad, hoher Wahrscheinlichkeit und geringen Sanierungskosten. Dies sind diejenigen, an deren Behebung die Teams am meisten interessiert sind, da sie auf schwerwiegende Probleme hinweisen, deren Behebung nicht kompliziert ist. Die Verwendung des Bewertungsrahmens von CERT bietet eine große Hilfe bei der Fokussierung ihrer Bemühungen und ermöglicht es Teams, ihre Zeitbudgets optimal zu nutzen.
Neben Widgets, Verstöße-Explorern und einem Risikobewertungs-Framework, das Ihnen hilft, sich schnell an der Weiterentwicklung des Compliance-Prozesses zu orientieren, spart Ihnen das Reporting-Framework von Parasoft auch Zeit, indem es automatisch Compliance-Berichte generiert, die für Code-Audits geeignet sind. Dies ist eine spannende Funktionalität, wenn Ihre Organisation den Entwicklungsprozess formaler angeht.
C++ ist eine großartige Sprache. Obwohl es über viele Funktionen der modernen OO-Sprache verfügt und es ermöglicht, komplexe Systeme mit erweiterten OO-Entwurfsmustern zu entwerfen, bietet es auch große Effizienz, da es Ihnen ermöglicht, direkt über Zeiger auf den Speicher zuzugreifen, ohne zu prüfen, ob dieser Zugriff korrekt ist.
Natürlich haben diese Vorteile ihren Preis. Mit C++ können selbst sehr erfahrene Softwareentwickler anfälligen Code erstellen, meist aufgrund von Speicherzugriffs- und Verwaltungsproblemen. Pufferüberläufe, die Verwendung von Dangling-Referenzen und Integer-Überläufe können zu undefiniertem Verhalten führen, das auf verschiedene Arten ausgenutzt werden kann.
Ein Beispiel ist die Lichtbogeninjektion. Ein Angreifer kann versuchen, die Kontrolle über den im Prozessspeicher vorhandenen Code auf andere Weise als beabsichtigt zu übertragen.
Ein weiteres Beispiel ist die Code-Injection, bei der Code in den Speicher des laufenden Systems eingefügt wird, um die Kontrolle über ein System mit Privilegien des kompromittierten Programms oder noch schlimmer, mit einer Kernel-Zugriffsebene zu erlangen. Sobald diese Kontrolle übernommen ist, können Verluste verheerende Folgen haben.
Wie können wir verhindern, dass Angreifer in unser System eindringen? Es ist nicht möglich, eine vorhandene Codebasis zu nutzen und zu versuchen, alle möglichen Sicherheitsverletzungen zu erraten. Die beste derzeit für C/C++-Programmierer verfügbare Option besteht darin, von vornherein Code zu erstellen, der frei von bestimmten Konstrukten ist, die nachweislich eine Quelle von Sicherheitsverletzungen darstellen.
Schauen wir uns eine einfache Illustration an. Der folgende Quellcodeausschnitt stammt direkt aus dem CERT C++-Standard (Regel EXP61-CPP).
auto g() {
int i = 12;
return [&] {
i = 100; // Problem
return i;
};
}
void f() {
int j = g()();
}
In diesem Beispiel gibt die Funktion g() ein Lambda zurück, das implizit die automatische lokale Variable „i“ per Referenz erfasst. Dieser schlecht geschriebene Code weist mindestens eine Sicherheitslücke auf, wenn das Lambda vom g()-Aufruf zurückgegeben wird. Die erfasste Referenz verweist auf eine Variable, deren Lebensdauer abgelaufen ist (die g-Funktion ist nicht mehr verfügbar).
Wenn das Lambda in f() ausgeführt wird, führt die Verwendung der hängenden Referenz im Lambda zu undefiniertem Verhalten. Dieses undefinierte Verhalten kann ausgenutzt werden, um die Kontrolle über das Programm zu erlangen. Der Speicher, der während der Lebensdauer der Funktion g von "i" belegt war, ist bereits freigegeben, und dieser Teil des Stacks wird wahrscheinlich bereits für andere Zwecke wiederverwendet, möglicherweise als Rücksprungadresse des Funktionsaufrufs, die nach dem Überschreiben zur Ausführung beliebigen Codes verwendet werden kann.
Diese spezifische Sicherheitsanfälligkeit kann durch die Regel erkannt werden. EXP61-CPP Ein Lambda-Objekt darf keines seiner erfassten Referenzobjekte überleben. Quellcode, der mit CERT C++ kompatibel ist, sollte dieses Problem nicht enthalten.
CERT C++ enthält viele weitere Regeln, die potenzielle Probleme erkennen können und Ihnen dabei helfen, sichere Codierungspraktiken zu fördern. Der Einsatz von CERT C++ bietet Softwareentwicklern erhebliche Vorteile.
Sicherheitscodierungsrichtlinien können bei konsequenter Anwendung zur Absicherung Ihres Quellcodes beitragen und sind die effektivste Strategie zur Gewährleistung der allgemeinen Systemsicherheit. Heutzutage ist es wirklich schwierig, eine Rechtfertigung dafür zu finden, einem Sicherheitscodierungsstandard wie CERT C++ nicht zu folgen.
Weiterführende Inhalte