Empfohlenes Webinar: Vorstellung von Parasoft C/C++test CT für kontinuierliche Tests und Compliance-Exzellenz | Zum Video

Was ist CERT C++?

Headshot von Miroslaw Zielinski, Direktor Produktmanagement bei Parasoft
27. Oktober 2023
7 min lesen

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.

Was ist CERT C++?

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.

Die Rolle von „cstdint“ in CERT C++

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++

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:

  • Vermeiden Sie nicht initialisierte Variablen, um undefiniertes Verhalten zu verhindern.
  • Verwendung geeigneter Datentypen und sicherer Typkonvertierungen zur Vermeidung datenbezogener Schwachstellen.
  • Stellen Sie sicher, dass Funktionsaufrufe mit ordnungsgemäßer Fehlerbehandlung und Parametervalidierung durchgeführt werden, um Probleme wie Pufferüberläufe zu verhindern.
  • Zeiger und Referenzen ordnungsgemäß verwalten, um speicherbezogene Schwachstellen zu verhindern.

CERT C++-Codierungsrichtlinien

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.

Diagramm, das die Anzahl der CERT C++-Regeln pro Kapitel zeigt, sowohl die ursprünglichen CERT C++-Regeln als auch die von CERT C geerbten.

Regel 01. Deklarationen und Initialisierung (DCL)

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.

Regel 02. Ausdrücke (EXP)

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.

Regel 03. Ganzzahlen (INT)

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.

Regel 04. Container (CTR)

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.

Regel 05. Zeichen und Zeichenfolgen (STR)

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.

Regel 06. Speicherverwaltung (MEM)

Konzentriert sich auf Regeln für eine effektive Speicherverwaltung, einschließlich dynamischer Speicherzuweisung und -freigabe, um Speicherlecks und andere speicherbezogene Probleme zu verhindern.

Regel 07. Input Output (FIO)

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.

Regel 08. Ausnahmen und Fehlerbehandlung (ERR)

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.

Regel 09. Objektorientierte Programmierung (OOP)

Bietet Richtlinien für die objektorientierte Programmierung, einschließlich Empfehlungen für Klassendesign, Vererbung und Polymorphismus.

Regel 10. Parallelität (CON)

Der Schwerpunkt liegt auf Regeln im Zusammenhang mit gleichzeitiger Programmierung, der Lösung von Problemen und Best Practices für Multithreading und Parallelität.

Regel 49. Verschiedenes (MSC)

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 bietet volle Unterstützung für die CERT C++-Codierungsrichtlinien. Die Testkonfiguration („SEI CERT C++-Regeln“) aktiviert alle Prüfer aus dem ursprünglichen CERT C++-Regelsatz und diejenigen aus CERT C, die für C++ anwendbar sind, was genau so ist, wie CERT es definiert, um die Sicherheit Ihrer C++-Codebasis zu gewährleisten. Organisationen, die mit C und C++ entwickeln, einschließlich Teams, die einen Wechsel zu C++ planen, können sich auf eine einzige Lösung mit konsistentem Reporting 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:

  • Schwere
  • Wahrscheinlichkeit
  • Sanierungskosten

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.

Profitieren Sie von CERT C++

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“ als Referenz erfasst. Dieser schlecht geschriebene Code weist mindestens eine Sicherheitslücke auf, wenn Lambda vom g()-Aufruf zurückgegeben wird. Die erfasste Referenz bezieht sich auf eine Variable, deren Lebensdauer abgelaufen ist (die g-Funktion ist nicht mehr vorhanden).

Wenn das Lambda in f() ausgeführt wird, wirkt sich die Verwendung der baumelnden Referenz im Lambda daher auf undefiniertes Verhalten aus. Dieses undefinierte Verhalten kann ausgenutzt werden, um die Kontrolle über das Programm zu erlangen. Der Speicher, der während der Lebensdauer der g-Funktion von „i“ belegt wurde, ist bereits freigegeben, und dieser Teil des Stapels wird wahrscheinlich bereits für andere Zwecke wiederverwendet, möglicherweise als Rücksprungadresse vom Funktionsaufruf, die beim Überschreiben verwendet werden kann beliebigen Code ausführen.

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.

  • Erhöht die Sicherheit. Die Einhaltung des Standards führt zu sichererem Code, wodurch Schwachstellen und das Risiko von Sicherheitsverletzungen verringert werden.
  • Verbessert die Zuverlässigkeit. Es fördert Best Practices, die die Zuverlässigkeit und Robustheit des Codes verbessern und die Wahrscheinlichkeit von Fehlern und Ausfällen verringern.
  • Wartbarkeit. Die Regeln fördern den Code, der leichter zu verstehen und zu warten ist, und vereinfachen so den laufenden Entwicklungs- und Wartungsaufwand.
  • Beachtung. Der Standard hilft Organisationen und Entwicklern, Sicherheitsnormen, Vorschriften und branchenspezifische Anforderungen einzuhalten.
  • Reduziert Debugging und Tests. Durch die Vermeidung häufiger Codierungsfehler können Entwickler weniger Zeit mit Debuggen und Tests verbringen und haben mehr Zeit für die produktive Entwicklung.
  • Sicherere Parallelität. Der Standard enthält Richtlinien für sichere gleichzeitige Programmierung (Multiprozess und Multithreading), wodurch das Risiko von Race Conditions und Thread-bezogenen Problemen verringert wird.
  • Sicherheitsbewusstsein. Entwickler werden sicherheitsbewusster und lernen, Sicherheitsrisiken in ihrem Code proaktiv zu erkennen und zu mindern.

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.

So beschleunigen Sie die Einhaltung von MISRA C und SEI CERT C