Experience Embedded

Professionelle Schulungen, Beratung und Projektunterstützung

Sicher, performant oder schnell entwickelt: Was darf's sein?

Autor: Christian Guss, MathWorks

Beitrag - Embedded Software Engineering Kongress 2017

 

Im Zeitalter der Vernetzung und der Autonomie von Maschinen (Cyber-Physical Systems) sind einige Anstrengungen nötig um sicherzustellen, dass das Risiko von Cyber-Security-Attacken nicht zu gefährlichen Situationen führt, weil Hacker sich Zugriff auch sicherheitsrelevante Funktionen verschaffen können. Beim System- und Komponenten-Design und der Implementierung müssen dabei oft Kompromisse eingegangen und Entscheidungen getroffen werden, da die Anforderungen in Bezug auf Funktionalität, Performanz sowie Safety und Security teilweise kontradiktorisch zueinander sind, speziell wenn es um die Erfüllung von Standards geht. Wir stellen Beispiele und Methoden vor, wie mit Hilfe von Model-based Design, -Verifikation und statischer Code-Analyse Sicherheitslücken identifiziert, Applikationen abgesichert, standardkonform entwickelt und trotzdem performant und schnell implementiert werden können.

Einführung

Das Thema Security und Cybersecurity gerät zunehmend in den Vordergrund der Software-Entwicklungsprozesse. Jüngste Schätzungen gehen von Millliarden vernetzter Geräte im Jahre 2019 [1][2] aus.

Das U.S. Department of Homeland Security (DHS) hat durch das "Industrial Control Systems (ICS) Cyber Emergency Response Team" (ICS-CERT) ermittelt, dass der höchste Prozentsatz von bekannten Schwachstellen bzw. Sicherheitslücken in ICS-Software durch fehlende oder mangelhafte Überprüfung von Eingaben verursacht wird (Abb.1, siehe PDF).

Oftmals scheitert die Absicherung durch robuste Sicherheitsmaßnahmen an den begrenzten physikalischen Ressourcen der eingebetteten Systeme, insbesondere bei der Verwendung von kleinen, kostengünstigen Komponenten. Ist so ein System erst einmal infiziert, ist es schwer, dies zu erkennen, um die Software zu aktualisieren. Hinzu kommt, dass in der Praxis häufig erst an die Sicherheit gedacht wird, wenn die Geräte schon fertig entworfen und möglicherweise bereits im Einsatz sind.

Aufgrund der hohen Gefahr durch Angriffe entstehen zunehmend Regularien und Standards zum Thema Cybersecurity. Standards wie CERT C, ISO-TS 17961, der CWE und MISRA C:2012 Amendment 1 befassen sich mit dem Thema Security von Software. Beim System- und Komponenten-Design und bei der Implementierung müssen dadurch oft Kompromisse gemacht werden, da die Anforderungen in Bezug auf Funktionalität, Performanz sowie Safety und Security teilweise konkurrierend zueinander sind, speziell wenn es um die Erfüllung von Standards geht.

Modell-basierte Threat-/Risk-Analyse

Model-based Design hat sich als eine effektive Methodik bewährt, Fehler und Schwachstellen während der frühen Entwicklungsphasen kosteneffizienter zu entdecken und zu bereinigen als in den späteren Phasen der Entwicklung [4]. Der Aufbau eines Modells entspricht im Allgemeinen der Applikation eines Embedded-Software-Systems, welches in vielen Fällen über Schnittstellen mit externen Komponenten verbunden ist (Abb. 2, siehe PDF). Diese Schnittstellen können Unbefugten Zugriff auf sensible Bereiche ihrer Applikation verschaffen.

Ein strukturiertes Vorgehen, um die Ursache und Fortpflanzung von Angriffen zu erkennen, ist dabei ein wichtiger Erfolgsfaktor. In Abb. 3 (siehe PDF) sehen wir Analyseverfahren, die auf verschiedenen Ebenen durchgeführt werden, z.B. Assets and Attack Potentials, sowie Threat and Risk Assessment. Auf das Modell, bestehend aus den Blöcken Sensors, Control und Actuators, werden dabei gezielt Angriffsszenarien auf die Eingänge induziert, um herauszufinden, welche Kanäle anfällig sind.

Im Modell angewendete Angriffsmethoden sind:

  • Attacker centric: Dieser Ansatz startet beim Angreifer selbst, um dessen Angriffsziele zu simulieren.
  • Design centric: Dieser Ansatz beleuchtet das Design des Systems selbst und identifiziert mögliche Schwachstellen.
  • Asset centric: Dieser Ansatz bezieht sich auf Daten, Informationen oder Geräte, die es zu schützen gilt. Diese meist streng vertraulichen Informationen unterstehen einer höheren Priorität als die des Gesamtsystems und müssen somit gesondert betrachtet und geschützt werden.

 

In Kombination mit formalen Analysemethoden erlaubt es Threat Modeling, mögliche Angriffspfade als Szenarien darzustellen und Schwachstellen durch mögliche Attacken zu identifizieren, zu priorisieren und entsprechend zu schließen. Zum Beispiel verwendet der Simulink Design Verifier [5] formale Methoden, um Schwachstellen in Simulink-Modellen automatisiert ohne umfangreiche Simulationsläufe zu identifizieren. Durch Property Proving lässt sich beweisen, dass das Design wie in den Anforderungen beschrieben unter Berücksichtigung des Angriffsszenarios funktioniert. Sollte dies nicht der Fall sein, wird ein Gegenbeispiel ermittelt, das als Testfall auf das Modell ausgeführt werden kann, um das fehlerhafte Verhalten sichtbar zu machen bzw. um die Sicherheitsalgorithmen, die die Angriffe abwehren soll, zu validieren (Abb. 4, siehe PDF).

Für das Threat Modelling können z.B. folgende Angriffsmodelle angewendet werden:

  • Interruption attack model [6]: um den Informationsfluss zu unterbrechen
  • Overflow attack model [7]: Provozieren von Überläufen von Datentypen über Eingangs-Kanäle
  • Man-in-the-middle attack [7] : ein Ansatz, die Kommunikation zwischen zwei Systemen abzufangen

 

Fuzzing (Abb.5, siehe PDF) ist eine Testmethodik, mit der ein Applikationsmodell mit gültigen und ungültigen Eingaben bzw. "Fault Injections" bedient wird. Diese sollen bestimmte Attacken an den Schnittstellen simulieren. Untersucht wird das System damit auf bestimmte Verletzungen, z.B. gegen funktionale oder Performance-Anforderungen.

Verifikation auf Code-Ebene

Durch die Integration einzelner Software-Komponenten zu einem Gesamtsystem auf Codeebene, das z.B. Multitasking-fähig und durch Interrupts unterbrechbar ist, können zusätzliche Schwachstellen entstehen, die Attacken zulassen und eine Analyse auf Codeebene erfordern.

Ein Ansatz, um die Security-Anforderungen auf Codeebene einzuhalten, ist die Anwendung von etablierten Security Guidelines, um Schwachstellen zu erkennen und zu vermeiden. Abb.7 (siehe PDF) zeigt einen Überblick verbreiteter Coding-Standards mit deren Klassifizierung, ob der Standard Security oder Safety adressiert, basierend auf The CERT C Coding Standard" [8], wobei MISRA C:2012 durch das Amendement 1 mittlerweile ebenso Security addressiert.

Ein effektiver und kostengünster Ansatz zur Überprüfung ist statische Code-Analyse. Diese hilft, ...

  • manuelle Code Reviews und Tests zu automatisieren
  • Software auf Code-Richtlinien zu überprüfen und Verletzungen zu dokumentieren oder zu kommentieren
  • Schwachstellen und Defekte automatisiert zu finden

 

Ein Beispiel für mögliche Schwachstellen sind Daten, die in einer Funktion verwendet, jedoch von einer äußeren Quelle an diese Funktion übergeben werden (Tainted Data), z.B. die Größe eines übergebenen Arrays. Durch gezielte Manipulation dieses Wertes kann damit ein Zugriff außerhalb der gültigen Arraygrenzen und somit auf beliebigen Speicherbereich stattfinden. Tainted Data sind ein beliebtes Ziel von Angriffen. Ein solcher Array-Zugriff kann sowohl ein Safety- als auch ein Security-Problem darstellen. Ein Beispiel für die Identifikation von Tainted-Data-Schwachstellen mittels statischer Code-Analyse zeigt Abb. 8 (siehe PDF).

Ist die Schwachstelle identifiziert, kann diese im Design oder im Code z.B. durch eine gezielte Überprüfung der Schnittstelle auf Gültigkeit der Übergabeparameter zur Laufzeit behoben und die Robustheit der Applikation erhöht werden.

Statische Analysetools, die zusätzlich über formale Kontroll- und Datenflussanalyse-Methoden verfügen, wie z.B. Polyspace Code Prover [9], sind darüber hinaus in der Lage, die Abwesenheit bestimmter Fehler bzw. Schwachstellen zu beweisen, was den Aufwand für Tests, Reviews und den Nachweis der Compliance zu Standards (Abb.9, siehe PDF) erheblich reduziert. Des Weiteren lassen sich dadurch auch die Code-Performance erhöhen sowie der Speicherbedarf reduzieren, da Laufzeitchecks viel zielgerichteter eingesetzt bzw. vermieden werden können [10].

Zusammenfassung

Beim Design und der Implementierung von vernetzten Software-Systemen müssen oft Kompromisse eingegangen werden, speziell wenn es um die Erfüllung von Standards und Coding-Guidelines geht. Daraus ergibt sich, dass es enorm wichtig ist, Schwachstellen und Defekte frühzeitig, und am Besten während des Designs und der Implementierungsphase, zu erkennen und zu bereinigen. Wir haben beispielhaft Modell- und Code-basierte Methoden gezeigt, mit denen Angriffe frühzeitig simuliert und die Robustheit kostengünstig erhöht werden kann. Gerade formale Methoden lassen sich mittlerweile einfach in den Entwicklungsprozess integrieren, um die Code-Performance zu erhöhen und die Aufwände für Test und Konformität zu reduzieren. Die Modell-basierte Entwicklung ermöglicht zudem eine deutlich schnellere Reaktion auf sich ständig ändernde Standards und anderweitigen Änderungen der Anforderungen als traditionell entwickelte Systeme.

Literatur

[1] J. Greenough, "The Internet of Things’ will be the world’s most massive device market and save companies billions of dollars", Feb 2015

[2] U.G.C.S: Adviser, "The Internet of Things: making the most of the Second Digital Evolution"

[3] https://ics-cert.us-cert.gov/sites/default/files/recommended_practices/DHS_Common_Cybersecurity_Vulnerabilities_ICS_2010.pdf

[4] A. Wasicek, P. Derler, and E. A. Lee. Aspect-oriented modeling of attacks in automotive cyberphysical systems. In Design Automation Conference (DAC), 2014 51st pages 1-6. IEEE, 2014.

[5] http://de.mathworks.com/products/sldesignverifier/

[6] G. Tassey. The economic impacts of inadequate infrastructure for software testing. RTI Project Number 7007.011, NIST, 2002.

[7] S. Checkoway, D. McCoy, B. Kantor, D. Anderson, H. Shacham, S. Savage, K. Koscher, A. Czeskis, F. Roesner, T. Kohno, et al. Comprehensive experimental analyses of automotive attack surfaces. In USENIX Security Symposium. San Francisco, 2011.

[8] Robert C. Seacord, The CERT C Coding Standard: 98 Rules for Developing Safe, Reliable, and Secure Systems. SEI series in software engineering Addison-Wesley, 2014, ISBN 0321984048, 9780321984043

[9] http://de.mathworks.com/products/polyspace/

[10] http://www.elektronikpraxis.vogel.de/embedded computing/articles/342436/index2.html

 

Beitrag als PDF downloaden


Unsere Trainings & Coachings

Wollen Sie sich auf den aktuellen Stand der Technik bringen?

Dann informieren Sie sich hier zu Schulungen/ Seminaren/ Trainings/ Workshops und individuellen Coachings von MircoConsult zum Thema Qualität, Safety & Security.


Training & Coaching zu den weiteren Themen unseren Portfolios finden Sie hier.


Qualität, Safety & Security - Fachwissen

Wertvolles Fachwissen zum Thema Qualität, Safety & Security steht hier für Sie zum kostenfreien Download bereit.

Zu den Fachinformationen

 
Fachwissen zu weiteren Themen unseren Portfolios finden Sie hier.