Es gibt keinen guten Grund, CERT C ++ zu ignorieren
Von Miroslaw Zielinski
20. Dezember 2018
4 min lesen
Es ist wirklich schwierig, eine Rechtfertigung dafür zu finden, dass ein Sicherheitscodierungsstandard wie CERT C ++ nicht befolgt wird. Hier erfahren Sie, worum es geht.
Sicherheit wird zu einem neuen Mantra für Softwareentwicklungsteams, insbesondere für diejenigen, die für die Sicherheit oder unternehmenskritische Software verantwortlich sind. In der Vergangenheit war Sicherheit oft ein „Feature“, das Teams am Ende des Entwicklungszyklus (häufig durch Drehen in Teufelskreisen von Stifttests und Korrekturen) zu bereits erstellten Systemen hinzufügen wollten, aber heute wissen wir das Sicherheit ist eine solide technische Disziplin, die durch mehrere Forschungsprogramme und -standards unterstützt wird.
Wenn Sie möchten, dass Ihr System vom Design her sicher ist, müssen Sie ganz am Anfang des Entwicklungsprozesses beginnen und sicherstellen, dass jede Zeile des erstellten Codes den bewährten Sicherheitsmethoden entspricht. Für Teams, die in C ++ entwickeln, ist der SEI CERT C ++ - Standard eine der besten Optionen, auf die Sie sich verlassen können. Parasoft C / C ++ test ist das einzige Tool, das diesen Standard umfassend unterstützt, und es ist die umfassendste Lösung für Sicherheitstests und Compliance auf dem Markt für C- und C ++ - Code.
CERT C ++ - Codierungsrichtlinien in Zahlen
Der SEI CERT C ++ - Standard führt eine Sammlung von Regeln ein, um sichere Codierungspraktiken durchzusetzen und anfällige Codekonstrukte zu beseitigen. Der Standard ist in 11 Kapitel unterteilt, die Regeln in bestimmten Themenbereichen enthalten. Im Gegensatz zu CERT C enthält der CERT C ++ - Codierungsstandard nur Regeln und keine Empfehlungen (weitere Überprüfungen und Entwicklungen stehen 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 (denken Sie daran, dass CERT Lebensstandards sind) gibt es 83 CERT C ++ - Regeln und 80 Regeln, die von CERT C geerbt wurden. Die Übersicht über den Standard ist in der folgenden Tabelle dargestellt:
Ab Version 10.4.1 unterstützt der Parasoft C / C ++ - Test die CERT C ++ - Codierungsrichtlinien vollständig. 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 ++ gelten, genau so, wie CERT es definiert, 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 jetzt auf ein einziges Tool mit konsistenter Berichterstellung verlassen.
Die 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 einen dynamischen Überblick über den Compliance-Prozess erhalten und die Verstöße überprüfen, die gemäß dem CERT-Risikobewertungsrahmen priorisiert wurden.
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 Ebenen unterteilt: L1, L2 und L3. L1 steht für Verstöße mit hohem Schweregrad, hoher Wahrscheinlichkeit und geringen Sanierungskosten. Dies sind diejenigen, an deren Behebung wir 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 der Bemühungen und ermöglicht es den Teams, ihre Zeitbudgets optimal zu nutzen.
Neben Widgets, Explorations-Explorern und einem Framework zur Risikobewertung, mit dem Sie sich schnell an der Weiterentwicklung des Compliance-Prozesses orientieren können, spart Ihnen das Berichts-Framework von Parasoft Zeit, indem automatisch Compliance-Berichte erstellt werden, die für Code-Audits geeignet sind. Dies ist eine aufregende Funktion, wenn Ihre Organisation den Entwicklungsprozess formeller gestaltet. Erfahren Sie mehr über die CERT Compliance Reporting Framework bei Arthur verwandter Blog.
Wie können Sie von CERT C ++ profitieren?
C ++ ist eine großartige Sprache, die zwar viele Funktionen der modernen OO-Sprache bietet und es ermöglicht, komplexe Systeme mit erweiterten OO-Entwurfsmustern zu entwerfen. Sie bietet jedoch auch eine hohe Effizienz, da Sie direkt über Zeiger auf den Speicher zugreifen können, ohne zu prüfen, ob dieser Zugriff erfolgt ist richtig.
Natürlich sind diese Vorteile mit einem Preis verbunden. Mit C ++ können selbst sehr erfahrene Softwareentwickler anfälligen Code erstellen, am häufigsten aufgrund von Speicherzugriffs- und Verwaltungsproblemen. Pufferüberläufe, die Verwendung baumelnder Referenzen und Ganzzahlüberläufe können zu undefiniertem Verhalten führen, das auf verschiedene Arten ausgenutzt werden kann. Ein Angreifer kann es versuchen Lichtbogeninjektion (böswillige Übertragung der Kontrolle auf den Code im Prozessspeicher, der nicht beabsichtigt ist) oder Code-Injektion (Einfügen von Code in den Speicher des laufenden Systems), um die Kontrolle über ein System mit den Berechtigungen des gefährdeten Programms oder, noch schlimmer, mit einer Kernel-Zugriffsebene zu erlangen. Sobald diese Kontrolle übernommen wurde, können Verluste verheerend sein.
Wie können wir also verhindern, dass Angreifer in unser System eindringen? Es ist nicht möglich, eine vorhandene Codebasis zu verwenden und zu versuchen, alle möglichen Sicherheitsverletzungen zu erraten. Die beste derzeit für C / C ++ - Programmierer verfügbare Option besteht darin, zunächst Code zu erstellen, der frei von bestimmten Konstrukten ist, die nachweislich zu Sicherheitsverletzungen führen.
Schauen wir uns also eine einfache Illustration an. Das folgende Quellcode-Snippet 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 Aufruf von g () zurückgegeben wird. Die erfasste Referenz bezieht sich auf eine Variable, deren Lebensdauer abgelaufen ist (die Funktion g ist weg). Wenn das Lambda in f () ausgeführt wird, wirkt sich daher die Verwendung der baumelnden Referenz im Lambda auf ein 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 Funktion g mit „i“ belegt war, ist bereits freigegeben, und dieser Stapelblock wird wahrscheinlich bereits für andere Zwecke wiederverwendet, möglicherweise für eine Rücksprungadresse aus dem Funktionsaufruf, die beim Überschreiben zur Ausführung verwendet werden kann beliebiger Code.
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 daher keine Vorkommen dieses Problems enthalten.
CERT C ++ enthält viele weitere Regeln, die potenzielle Probleme erkennen und Ihnen helfen können, sichere Codierungspraktiken zu fördern. Richtlinien für die Sicherheitscodierung können bei konsequenter Anwendung dazu beitragen, Ihren Quellcode zu verbessern, und sind die effektivste Strategie zur Gewährleistung der Gesamtsystemsicherheit. Und heutzutage ist es wirklich schwierig, eine Rechtfertigung dafür zu finden, dass ein Sicherheitscodierungsstandard wie CERT C ++ nicht befolgt wird.