Parasoft C/C++test 2022.2 unterstützt das neue MISRA C:2012 Amendment 3 und eine Entwurfsversion von MISRA C++ 202x. Erfahren Sie mehr >>

Verschieben Sie Ihre sicherheitskritischen Softwaretests mit Testautomatisierung nach links

Von Parasoft

8. September 2017

7  min lesen

Wir befinden uns mit sicherheitskritischer Software in einer Kostenkrise, was bedeutet, dass die erforderliche erhöhte Funktionalität über die Zahlungsfähigkeit für ihre Entwicklung hinaus gewachsen ist. Das Boeing 787 Programm, zum Beispiel, erforderte 6.5 Millionen Codezeilen, deren Design, Entwicklung und Test 4 Milliarden US-Dollar kosteten. Der Trend bei großen sicherheitskritischen Projekten zeigt ein exponentielles Wachstum der Gesamtkosten, wobei Software im Jahresvergleich einen größeren Teil des gesamten Entwicklungsbudgets ausmacht. Das nächste große Luft- und Raumfahrtprogramm wird wahrscheinlich unerschwinglich sein, wenn dieselben Techniken verwendet werden, die in früheren Programmen verwendet wurden. Also was können wir tun?


 

Die Sicherheitszertifizierung und die erforderlichen Tests und Überprüfungen machen einen großen Teil des Softwareentwicklungsbudgets aus. Shift-Left-Test Der Einsatz von Software (dh früher im Softwareentwicklungszyklus) bei gleichzeitiger Nutzung der Automatisierung zahlt sich in Bezug auf Kosten, Risiko und Zeitplan aus. Abbildung 1 unten zeigt die Kosten in Millionen Dollar pro tausend Codezeilen für die Softwareentwicklung kommerzieller Fluggesellschaften (Boeing- und Airbus-Daten), was den exponentiellen Anstieg deutlich zeigt.

Abbildung 1: Kosten für die Softwareentwicklung pro Codezeile in kommerziellen Luftfahrtprojekten. Daten aus Airbus- und Boeing-Projektmetriken.

Wo Fehler erstellt und gefunden werden und welche Auswirkungen dies auf die Kosten hat

Es überrascht nicht, dass die meisten Fehler zu Beginn in ein Projekt eingeführt werden, noch bevor die erste Codezeile geschrieben wird. Die meisten Fehler werden während des Tests gefunden und behoben, aber ein guter Prozentsatz (bis zu 20%!) Wird während des Betriebs entdeckt, nachdem das Produkt verkauft und versendet wurde. In zertifizierten Systemen bedeutet dies entweder einen extrem teuren Fix-Test-Re-Certification-Zyklus oder eine Problemumgehung für das Problem durch den Bediener. Abbildung 2 zeigt den relativen Prozentsatz der Fehler, die in jeder Phase des Softwareentwicklungslebenszyklus eingeführt und erkannt wurden.

Abbildung 2: Grafik, die den Prozentsatz der in verschiedenen Entwicklungsphasen eingeführten und festgestellten Mängel zeigt.

Fehler lassen sich am günstigsten zu Beginn des Lebenszyklus beheben und sind über die gesamte Projektdauer exponentiell teurer zu finden und zu beheben. Im Betrieb ist die Reparatur eines Produkts nach dem Versand in die Hände des Kunden am teuersten. Die Kosten für die Fehlerbehebung nach der Bereitstellung sind konservativ und beinhalten keine Schäden an Ihrer Marke und keine Haftung aufgrund von Sicherheitsvorfällen vor Ort. Abbildung 3 zeigt die relativen Kosten für die Behebung eines Fehlers in jeder Phase des Lebenszyklus. Es ist klar, dass das Ziel darin besteht, die erkannten und behobenen Fehler zu einem früheren Zeitpunkt im Lebenszyklus zu verschieben, dh nach links zu verschieben. Darüber hinaus ist es wünschenswert, die Anzahl der Fehler zu reduzieren, die zum Kunden gelangen (eine Realität in jeder Domäne).

Abbildung 3: Relative Kosten für das Auffinden und Beheben von Fehlern während jeder Entwicklungsphase. Während der Anforderungen und des Designs ist die Basislinie (1x) und der kostengünstigste Ort, um Fehler zu beheben. Quelle für die Abbildungen 2 und 3: SAVI-Präsentation zur INCOSE SE-Konferenz 2012.

Die Rolle der Testautomatisierung bei Linksverschiebung

Die sicherheitskritische Softwareindustrie erkennt die Notwendigkeit an, die Art und Weise zu ändern, wie Dinge getan werden. Zu viele Projekte erfinden das Rad neu und die Zertifizierung brandneuer Software ist zeitaufwändig und teuer. Das Wachstum der Konnektivität und Funktionalität neuer Produkte bedeutet, dass sich die Methoden ändern müssen. In diesem Beitrag werden wir nicht alle vorgeschlagenen Techniken behandeln, sondern uns auf die Rolle konzentrieren, die die Testautomatisierung bei der Verlagerung, Erkennung und Behebung von Fehlern und Sicherheitslücken nach links spielt.

Ein großer Teil jedes sicherheitskritischen Projekts besteht aus Tests. Eine Automatisierung ist unbedingt erforderlich, um die Sicherheits- und Qualitätsziele zu erreichen. Hier ist ein Beispiel dafür, wie Testautomatisierungstools neue Softwareentwicklungsmethoden unterstützen und die Produktivität von Tests und Dokumentationen steigern:

Unterstützung agiler und iterativer Entwicklungsmethoden: Die Probleme mit der Wasserfallmethode sind bekannt und viele Teams verwenden modernere Entwicklungsmethoden, um Qualität und Sicherheit zu verbessern. Die Testautomatisierung ist ein wichtiger Bestandteil jeder iterativen Entwicklungsmethode, da Testsuiten für jede neue Iteration eines Moduls, einer Komponente usw. ausgeführt werden. Die Testautomatisierung unterstützt diese Methoden mit wiederholbaren automatisierten Tests und bietet Berichte auf verschiedenen Ebenen für jeden Test, aber auch akkumulativ Ergebnisse im Laufe der Zeit. Dynamische Analysetools sind für die Erkennung schwer zu erkennender Laufzeitfehler von entscheidender Bedeutung. Die statische Analyse spielt eine wichtige Rolle bei der Erkennung von Fehlern, bevor der Test beginnt.

Unterstützende Software-Inspektionen: Inspektionen gehören zu den bewährten Methoden, um Fehler frühzeitig im Entwicklungslebenszyklus zu beseitigen. Inspektionen bedeuten, alles zu überprüfen, nicht nur den Quellcode. Beispielsweise ist die Überprüfung der Anforderungen und des Designs entscheidend, um die Hauptquelle von Fehlern im System zu verhindern (siehe Abbildung 2). Viele Fehler sind buchstäblich in das System eingebaut. Tools spielen in dieser Phase eine geringere Rolle, erhöhen aber die Effektivität von Code-Reviews. Automatisierte Komponententests, dynamische Fehlererkennung und statische Analyse bieten eine stark verbesserte Fehlererkennung in den frühen Codierungsphasen eines Projekts. Die Ergebnisse automatisierter Tests können in Code-Reviews präsentiert werden, wodurch die Abhängigkeit von der manuellen Fehlererkennung verringert wird und mehr Zeit für die Erkennung falscher Anforderungen und Designentscheidungen bleibt. 

Steigerung der Testproduktivität: Manuelle Tests sind langwierig und weniger wiederholbar. Die Ergebniserfassung kann ad hoc erfolgen und Fehler können trotz „korrekter“ Ergebnisse übersehen werden. Es ist schwierig, die erforderliche Codeabdeckung zu erreichen, die je nach Sicherheitsstandard und Kritikalität des Projekts variiert. Durch die Testautomatisierung wird das Testen nicht nur weniger langwierig und wiederholbar, sondern durch die Berichtsfunktionen fortschrittlicher Testtools werden auch wichtige Verwaltungsinformationen zum Projektstatus erstellt. Durch Hinzufügen einer dynamischen Analyse, die den Code während der Ausführung analysiert (um knifflige Laufzeitfehler zu erkennen), und einer statischen Analyse, die den Code vor der Ausführung analysiert, wird die Fehlererkennungsfähigkeit von Testtools erheblich verbessert.

Automatisierung der Einhaltung von Codierungsstandards: Viele sicherheitskritische Projekte erfordern Quellcodestandards. MISRA ist beispielsweise in der Automobilsoftware weit verbreitet, hat sich jedoch in anderen Branchen durchgesetzt. Einige Standards verlangen, dass der Code einem Unternehmensstandard entspricht, der bestimmte Ziele erfüllt. In jedem Fall ist das manuelle Durchsetzen der Codierungskonformität mühsam und fehleranfällig. Statische Analysetools sind ideal für die Durchsetzung der Compliance, und erweiterte Tools erkennen Fehler, die über Formatverletzungen hinausgehen.

Automatisierung der Zertifizierungsdokumentation: Ein großer Teil des Arbeitsaufwands beim Erreichen von Software-Sicherheitszertifizierungen besteht in der Dokumentation von Prozessen, der Validierung und Verifizierung. Durch die Testautomatisierung werden die Kosten für die Dokumentation der Testergebnisse und die Abdeckungsanalyse erheblich gesenkt. 

Beschleunigung der Wiederverwendung von Software von Drittanbietern: Eine Schlüsselstrategie zur Steigerung der Produktivität ist die Wiederverwendung von Software. Im Idealfall können bereits zertifizierte Komponenten verwendet werden, um die Entwicklungskosten für diese Untereinheiten zu senken. Projekte müssen COTS-Software (Commercial Off-the-Shelf) und möglicherweise Open Source- und anderen Quellcode verwenden. Durch die Automatisierung der Evaluierung dieser Software mit statischen und dynamischen Analysetools wird das Risiko der Verwendung dieser Komponenten verringert.

Verbesserung von Qualität, Sicherheit und Schutz: Selbst strenge Testpläne können kritische Fehler übersehen. Die Codeabdeckung allein reicht nicht aus, um beispielsweise bei Sicherheitsangriffen oder Multithread-Code ein ordnungsgemäßes Verhalten sicherzustellen. Statische Analysetools können Fehler im Quellcode erkennen, ohne einen bestimmten Test auszuführen, und können Fehler wie Sicherheitslücken finden, die bei Unit- oder Systemtests schwer zu entdecken sind. Dynamische Analysetools können Fehler beim Ausführen von Code während Tests erkennen, die sich in Testergebnissen widerspiegeln können (z. B. ein langsamer Speicherverlust). Durch Fuzzing- und Penetrationstests während Systemtests können Fehler festgestellt werden, die unter normalen Betriebsbedingungen übersehen wurden. Insgesamt tragen die zusätzlichen Mängel und Sicherheitslücken, die mit modernsten Tools festgestellt wurden, dazu bei, Kosten, Risiken und viele der rund 20% Fehler zu reduzieren, die es in die Produktion schaffen.

Welchen Einfluss hat Linksverschiebung?

Es ist klar, dass etwas getan werden muss, um die in Abbildung 2 so deutlich gezeigten Probleme zu lösen. Zu Beginn des Lebenszyklus werden zu viele Fehler eingeführt und bleiben unentdeckt, und zu viele bleiben im Produkt zurück, wenn es hergestellt wird und in den Händen der Kunden (oder in Flugzeugen oder Autos). Die Einführung neuer Entwicklungsmethoden, die Wiederverwendung von Komponenten, die Nutzung von COTS und Open Source sowie die Automatisierung von Tools sind wichtige Schritte zur Verbesserung der Entwicklungsproduktivität.

Unter der Annahme eines Entwicklungsprozesses mit modernsten Tools, bei dem mehr Fehler früher im Lebenszyklus erkannt und behoben werden, sind Unit-Tests äußerst effektiv und tragen dazu bei, dass weniger Fehler in die Produktion gelangen. In Abbildung 4 zeigt ein hypothetisches Beispiel die Änderung der Fehlererkennung über den Lebenszyklus - wobei der Großteil der Fehlererkennung und -behebung früher im Lebenszyklus nach links verschoben wird.

Abbildung 4: Ein Diagramm, das einen verbesserten Entwicklungsprozess zeigt, der die Erkennung von Fehlern und Sicherheitslücken früher im Lebenszyklus verschiebt.

Aus Abbildung 3 oben wissen wir, dass die Kosten in jeder Entwicklungsphase erheblich steigen. Abbildung 5 unten zeigt den Vergleich der Kosten für die Behebung von Fehlern bei der herkömmlichen Methode mit der in Abbildung 4 gezeigten neuen, verbesserten Methode. Das frühere Auffinden und Beheben von Fehlern kostet weniger als die spätere Behebung. In der hier dargestellten Situation beträgt der Gesamtkostenunterschied etwa 40% zugunsten des Linksverschiebungsansatzes.

Abbildung 5: Ein Diagramm, das die relativen Kosten für die Behebung von Fehlern im herkömmlichen Ansatz im Vergleich zum Ansatz zur Verschiebung nach links zeigt. Selbst bei gleicher Anzahl von Gesamtfehlern reduziert die Früherkennung die Kosten erheblich.

Die Bedeutung zertifizierter Werkzeugketten und die Unterstützung bei der Qualifizierung

Die Verwendung automatisierter Tools in sicherheitskritischen Projekten erforderte Vertrauen in die Tools selbst. Es liegt in der Verantwortung des Herstellers des Produkts, darauf zu vertrauen, dass die zur Erstellung der Software verwendeten Prozesse und Tools den Anforderungen des Standards entsprechen. Werkzeughersteller können dabei helfen, indem sie Werkzeuge vor dem Verkauf an die Hersteller von Sicherheitsstandards zertifizieren lassen oder in Fällen, in denen eine solche Vorzertifizierung nicht möglich ist, Unterstützung bei der Qualifizierung leisten. Sie können dann die Zertifizierungsnachweise des Werkzeugherstellers in ihrer eigenen Einreichung zur Zertifizierung verwenden und den erforderlichen Aufwand reduzieren. (Zum Beispiel, Parasoft C / C ++ test wurde vom TÜV SÜD als qualifiziert für sicherheitsrelevante Softwareentwicklung nach IEC 61508 und ISO 26262 zertifiziert.)

In einigen Software-Sicherheitsstandards wie DO-178B und DO-178C erfolgt die Zertifizierung auf Systemebene, und einzelne Tools und Software werden nicht unabhängig voneinander zertifiziert. In diesen Fällen bietet der Werkzeughersteller Qualifizierungskits und Unterstützung in Bezug auf Dokumentation und professionelle Dienstleistungen an, wodurch die Kosten und der Aufwand für die Qualifizierung der Werkzeuge für die Verwendung im Projekt erheblich reduziert werden.


Fazit

Sicherlich steckt sicherheitskritische Software in einer Kostenkrise. Neue, große sicherheitskritische Projekte werden zu teuer in der Entwicklung, so dass sie möglicherweise nicht mehr rentabel sind. Für die Entwicklung sicherheitskritischer Software sind neue Methoden erforderlich, und dieser Aufwand muss die Anzahl der Fehler reduzieren, die spät im Softwareentwicklungslebenszyklus gefunden werden. Die Verlagerung der Erkennung und Behebung von Fehlern und Sicherheitslücken auf einen möglichst frühen Lebenszyklus reduziert die Kosten erheblich. Testautomatisierung spielt eine Rolle bei der Verbesserung der Testeffizienz und -ergebnisse und ist ein wichtiger Bestandteil eines neuen Ansatzes für die sicherheitskritische Softwareentwicklung.

„MISRA“, „MISRA C“ und das Dreieckslogo sind eingetragene Marken von The MISRA Consortium Limited. ©The MISRA Consortium Limited, 2021. Alle Rechte vorbehalten.

Von Parasoft

Die branchenführenden automatisierten Softwaretest-Tools von Parasoft unterstützen den gesamten Softwareentwicklungsprozess, vom Schreiben der ersten Codezeile über Unit- und Funktionstests bis hin zu Leistungs- und Sicherheitstests, wobei simulierte Testumgebungen genutzt werden.

Erhalten Sie die neuesten Nachrichten und Ressourcen zum Testen von Software sofort.