Autor:in:
Dr. Daniel Kästner | AbsInt GmbH | Germany
Sprache:
deutsch
Zielgruppe:
Software-Entwickler, Software-Architekten, Software-Tester, FuSi-Manager
Voraussetzungen:
Informatik-Studium oder Programmiererfahrung mit eingebetteten Systemen
Überblick und Zusammenfassungen:
Stacküberläufe in sicherheitskritischen Systemen können schwere Fehler verursachen. Gemeint ist hierbei der Laufzeitstack, in dem dynamische Daten über die derzeit ausgeführten Funktionen gespeichert sind, z.B. Werte von lokalen Variablen, Rücksprungadressen und Zwischenergebnisse von Ausdrucksauswertungen. Der maximale Speicherbedarf des Stacks muss statisch bekannt sein: zur Konfigurationszeit des Systems muss ausreichend viel Stackplatz für jede Task reserviert werden. Die maximale Stacktiefe ist nicht einfach vom Quellcode abzulesen, da sie von der dynamischen Aufruftiefe von Funktionen abhängt, aber auch von Compiler- und Linkeroptimierungen. Wird der verfügbare Speicherplatz unterschätzt, können Stacküberläufe auftreten. Eine Überschätzung des Stackverbrauchs ist ebenfalls unerwünscht, da Speicher verschwendet wird.
Stacküberläufe sind schwerwiegende Fehler, die dazu führen können, dass das System abstürzt, bzw. fehlerhaft oder erratisch reagiert. Ein Beispielfall sind die Unfälle durch unbeabsichtigte Beschleunigung beim Toyota Camry Modell 2014, die aller Wahrscheinlichkeit nach von Stacküberläufen ausgelöst wurden [1]. Die Ermittlung oberer Schranken des maximalen Stackbedarfs wird von allen aktuellen Sicherheitsnormen gefordert, darunter ISO 26262, IEC 61508, DO-178C.
Garantierte obere Schranken des maximalen Stackverbrauchs können durch sichere statische Analysatoren auf Binärcode berechnet werden. Hierbei wird die formale Methode der statischen Analyse, Abstrakte Interpretation, eingesetzt, die einen formalen Beweis ermöglicht, dass der maximale Stackverbrauch nicht unterschätzt wird. Im Gegensatz zur statischen Analyse von Codierrichtlinien wird dabei nicht der Quellcode analysiert, sondern der ausführbare Binärcode. Der Maschinencode wird disassembliert, und der Aufrufgraph berechnet, in dem die Stackeffekte jeder Maschineninstruktion auf jedem möglichen Ausführungspfad zur Berechnung des Maximums berücksichtigt werden. Eine wichtige Anforderung an statische Binärcodeanalysatoren ist die Minimierung der erforderlichen Benutzerinteraktionen, z.B. zur Angabe der möglichen Ziele von Funktionszeigeraufrufen. Die Analyse sollte hochpräzise sein, um möglichst viele Funktionszeigerziele automatisch zu bestimmen, der Annotationsmechanismus sollte flexibel und einfach zu bedienen sein, und es sollte die Möglichkeit bestehen, fehlende Informationen automatisch von Quellcode-Analysatoren oder Trace-Informationen zu übernehmen.
In diesem Vortrag stellen wir die Methodik der statische Stack-Analyse vor, erläutern Automatisierungs-Konzepte, diskutieren automatische Tool-Qualifizierung gemäß Safety-Normen, und stellen praktische Erfahrungen aus industriellen Luftfahrt- und Automobilprojekten vor.
[1] M. Barr. Bookout v. Toyota, 2005 Camry software Analysis by Michael Barr, 2013, http://www.safetyresearch.net/Library/BarrSlides_FINAL_SCRUBBED.pdf.
Art der Vermittlung:
Vortrag mit Methodenerklärung und Beispielen, sowie Erfahrungen aus der Industrie-Praxis
Nutzen:
Der Vortrag erklärt das Problem von Stacküberläufen, und erläutert die Methodik statischer Analysen des Stackverbrauchs. Eine Abgrenzung zu anderen Verfahren wird hergestellt. Auch die Integration in existierende Tool- und Prozessketten, sowie die Einbindung in automatisierte Systeme zur kontinierlichen Verifikation wird besprochen. Der Vortrag zeigt verständliche Beispiele und berichtet über praktische Erfahrungen aus Industrieprojekten.