11. Anlage | ||||||
|
||||||
11.8 Sicherheitsaspekte (Anlage H)
Bei der Entwicklung von Software für sicherheitskritische Applikationen ist der Nachweis der Funktionsfähigkeit auch unter erschwerten Bedingungen ein wesentlicher Vorgang. Ada 95 unterstützt diesen Prozeß indirekt durch Bereitstellung einer Sprachdefinition, die im Vergleich zu anderen Programmiersprachen deutlich weniger potentielle Unsicherheiten aufweist und dadurch die Validation und Verifikation erleichtert. Diese Anlage zum Referenzhandbuch liefert dem Entwickler von Software für sicherheitskritische Applikationen in Verbindung mit einem entsprechenden Ada-Übersetzer die Mittel, um sowohl die Validation als auch die Verifikation durchführen zu können. "Safety" und "Security" Der Aufrechterhaltung von zugesicherten Programmeigenschaften auch unter ungünstigen Bedingungen kommt bei den sehr verschiedenen Aufgabenbereichen für Applikationssoftware unterschiedliche Bedeutung zu. Erhöhte Anforderungen zum Merkmal "Safety" sind typischerweise an Steuersoftware in Flugzeugen und Kernkraftwerken zu stellen. Hier kommt es darauf an, auch unter erschwerten Bedingungen (fehlerhafte Bedienung, Ausfall von Systemteilen) nur richtige Ergebnisse zu liefern, hohe Ausfallsicherheit durch Fehlertoleranz zu bieten und u. U. die Verfügbarkeit durch automatischen Wiederanlauf zu verbessern. Erhöhte Anforderungen zum Merkmal "Security" sind bei Applikationen für den Bereich der politischen oder militärischen Administration und für Banken angemessen. Die Erschwerung der Bedingungen wird hier in der Möglichkeit eines Angriffs von außen gesehen. Als Teilmerkmale von "Security" haben Vertraulichkeit (Schutz vor unberechtigtem Zugriff), Integrität (die Richtigkeit der Daten und Funktionen bleibt erhalten), Verfügbarkeit (die Daten bleiben abrufbar) und Verbindlichkeit (der Besitz der vorgenannten Eigenschaften ist beweisbar) zu gelten. Anforderungen an Software für sicherheitskritische Applikationen
Ein ausgereifter Standard im sicherheitskritischen Gebiet ist der internationale Standard DO-178B. Der Standard erstreckt sich auf Entwurf, Analyse und Prüfung. Der Nachweis der Verifikation von sicherheitskritischen Applikationen basiert häufig auf den im DO-178B vorgeschriebenen Prüfungen. Die Verifikation nach diesem Standard ist anhand des Maschinencodes durchzuführen. Nur wenn ein Nachweis vorliegt, daß ein Übersetzer fehlerfrei ist, darf die Verifikation auf der Ebene des Quelltextes vorgenommen werden. Dieser Nachweis ist jedoch schwer zu erhalten (hier ist der Übersetzerhersteller gefordert) und das setzt fast immer voraus, daß Teile des Sprachumfangs von der Verwendung ausgeschlossen werden. Unsicherheiten in verbreiteten Programmiersprachen Da Programmierer fehlbar sind, ist die Verwendung von Programmiersprachen von Vorteil, die Prüfungen für einige Klassen von Fehlern bieten, insbesondere wenn man mittels solcher Prüfungen zur Laufzeit und zugehörigen Ausnahmebehandlungen einfach zu einem sicheren Zustand zurückzukehren kann. Ada 83 (und natürlich Ada 95 als Fortsetzung) nimmt solche Prüfungen grundsätzlich vor und bietet gleichzeitig Möglichkeiten zur nutzerdefinierten Ausnahmebehandlung. Ada ist daher für sicherheitskritische Anwendungen prinzipiell geeignet. Weitere Sprachen mit eingebauten Prüfungen und nutzerdefinierten Ausnahmebehandlungen sind C++ und Java, die jedoch (noch) nicht normiert sind. Sicherheitseinrichtungen und Sicherheitslücken Die folgende Tabelle gibt einen Überblick über Sicherheitseinrichtungen und Sicherheitslücken von Ada und weiteren Standard-Programmiersprachen: Sprache Sicherheitseinrichtungen Sicherheitslücken Ada Laufzeitprüfungen, Möglichkeit nicht initialisierte Zeiger der Initialisierung von Zeigern, und Variable strenge Typisierung, Ausnahmebehandlung Modula 2 strenge Typisierung, nicht initialisierte Zeiger z. T. Ausnahmebehandlung und Variable Pascal strenge Typisierung Laufzeitprüfungen optional, nicht initialisierte Zeiger und Variable C Zusatzwerkzeuge wie z. B. ca. 150 undefinierte Sprachmake und lint eigenschaften, Laufzeitprüfungen optional Fortran 77 Typprüfung, kein Deklarationszwang, keine Verwendung von Zeigern keine Prüfung über die Grenzen von Prozeduren Die in der Sprache Ada verbliebenen Unsicherheiten bezüglich sicherheitskritischer Applikationen können durch Wahl einer geeigneten Teilmenge vermieden werden. Diese Einschränkung des Sprachumfangs wird durch das Pragma Restrictions unterstützt. Der Programmierer kann z. B. entscheiden, keine Prozesse zu benutzen. Das hat zur Folge, daß das Laufzeitsystem deutlich kleiner und einfacher ausfällt. Es wird mit diesem Pragma also nicht nur getestet, ob spezielle Konstrukte vermieden wurden, sondern dieses Pragma kann sich auf die erzeugte Applikation grundlegend auswirken. Nachvollziehbare Programmausführung Eine Grundvoraussetzung für den Einsatz einer Programmiersprache in sicherheitskritischen Applikationen ist die nachvollziehbare Programmausführung. Ada 95 kommt dieser Forderung durch Bereitstellung von geeigneten Sprachmitteln und Informationen nach:
Die Verwendung von anormalen Werten hat eine fehlerhafte, nicht vorhersagbare
Programmausführung zur Folge, was bei sicherheitskritischen Anwendungen
nicht auftreten darf.
Dieses Pragma sorgt dafür, daß die angegebenen Objekte an der Verwendungsstelle dieses Pragmas verfügbar sind. Der Übersetzer sorgt dafür, daß die Objekte zugreifbar sind und einen aktuellen Wert enthalten. Dieses Pragma verhindert also Optimierungsaktivitäten wie z. B. das Halten von Variablen in Registern und Codeumstellungen. Dadurch wird es einfacher, mit einem Quelltext-Debugger eine Fehlersuche durchzuführen. Syntax: pragma Inspection_Point[(object_name {, object_name})]; Dieses Pragma ist ein Konfigurationspragma und wirkt sich auf alle Übersetzungseinheiten aus. Einschränkungen des Sprachumfangs Das Pragma Restrictions (pragma <BNF>, restriction <BNF>) definiert verschiedene Einschränkungen des Sprachumfangs von Ada. Durch solche Einschränkungen wird der Nachweis der Korrektheit eines Programmes erst führbar. Syntax des Pragma Restrictions: pragma Restrictions(restriction{, restriction}); restriction ::= restriction_identifier | restriction_parameter_identifier => expression Beispiel:
Die angegebenen Einschränkungen werden zur Übersetzungszeit oder zur Laufzeit geprüft und der Übersetzer erzeugt eine dem Verstoß entsprechende Fehlermeldung. Liste der Einschränkungen mittels Pragma Restrictions Einschränkungen betreffen im wesentlichen
|
||||||
|