7. Informationsflusskontrolle 1 7. Informationsflusskontrolle Informationsflusskontrolle (information flow control): sicherstellen, dass sensitive Daten nicht aufgrund von Informationsflüssen an Unbefugte gelangen können Zugriffsschutzmaßnahmen sind hierfür meist unzureichend. Zugriffsschutz beschränkt die Rechte von Benutzern, kann aber nicht den Informationsfluss in einem System kontrollieren. Informationsflussstrategien definieren daher die Wege, auf denen Informationen durch ein System fließen kann und stellt sicher, dass sensitive Daten nicht aufgrund von Informationsflüssen an Unbefugte gelangen. 2 7. Informationsflusskontrolle Beispiel (Löhr SS02): Rechnergestützte Abgabe und Auswertung von Klausuren. Abgabe(Lösung): wenn Lösung hat falsches Format, dann Bildschirm.ausgeben(Fehlermeldung); sonst: Ergebnis = Vergleich(Lösung, Musterlösung); Ergebnisse.anhängen(Lösung, Ergebnis) . Bösartige Variante dieses Programms könnte bei Benutzung einer Geheimtür vertrauliche Informationen nach außen durchsickern lassen: Die Folie zeigt ein Beispiel, in dem Zugriffsschutz unerlaubte Informationsflüsse nicht verhindern kann. In diesem Beispiel haben wir ein Programm Abgabe, welches ein Ergebnis für eine abgegebene Lösung einer Klausur berechnet. Falls die Lösung im richtigen Format vorliegt, wird die Lösung mit der Musterlösung verglichen. Zur Berechnung des Ergebnisses braucht das Programm also Zugriff auf die Musterlösung. Es könnte nun jedoch eine bösartige Variante des Programms geben, welche den notwendigen Zugriff auf die Musterlösung missbraucht und diese Informationen an unberechtigte Benutzer weitereicht. 3 Informationsflüsse: Lösung Fehlermeldung Bildschirm Vergleich Musterlösung Ergebnisse Der unerwünschte Informationsfluss kann nicht mit Zugriffsschutz-Mechanismen verhindert werden, denn das Programm benötigt die missbrauchten Rechte für legitime Zwecke ! In diesem Fall gibt es einen unerwünschten Informationsfluss von der Musterlösung zu einem unautorisierten Benutzer (z.B. über die Ausgabe der Musterlösung am Bildschirm). Zugriffsschutz kann dies nicht verhindern, da das Programm die missbrauchten Rechte auch für legitime Zwecke benötigt. 4 7. Informationsflusskontrolle Beispiel: Benutzer hat Lese- und Schreibrecht auf einer geheimen Datei. Benutzer kann Inhalt der geheimen Datei in eine öffentliche Datei kopieren. Informationsflusskontrolle hilft diese „Sicherheitslöcher“ zu entdecken. Traditionelles Anwendungsgebiet: Militärinformatik (militärische Geheimhaltung) Ein zweites Beispiel ist eine Datei, auf die ein spezieller Benutzer Lese- und Schreibrechte hat, alle anderen Benutzer jedoch nicht zugreifen dürfen. Ein Beispiel solch einer Datei könnte die Passwort-Datei sein, die nur vom Administrator modifiziert werden darf. Der Administrator könnte nun jedoch seine Rechte missbrauchen und den Inhalt der Datei in eine öffentlich lesbare Datei kopieren. Damit hätten alle Benutzer die Informationen der Passwort-Datei. Mit der Informationsflusskontrolle können solche unerlaubten Informationsflüsse aufgedeckt werden. Traditionelles Anwendungsgebiet der Informationsflusskontrolle ist die Militärinformatik zur Geheimhaltung militärischer Informationen. 5 7. Informationsflusskontrolle Zugriffsschutz reguliert den Zugriff auf Objekte, aber nicht was Subjekte mit der in den Objekten enthaltenen Information tun kann. Informationsflusskontrolle betrachtet die Rechte zur Weitergabe bzw. Verbreitung von Informationen. Es werden gültige Kanäle spezifiziert, entlang denen die Information fließen darf. Zusammenfassend kann man festhalten, dass Zugriffsschutz den Zugriff auf Objekte reguliert, aber nicht, was Subjekte mit den Informationen in den Objekten tun, für die sie autorisiert sind. Informationsflusskontrolle betrachtet die Weitergabe bzw. die Verbreitung von Informationen, unabhängig davon, in welchen Objekten die Information steckt und wer Zugriff darauf hat. Informationsflusskontrolle spezifiziert die gültigen Kanäle, entlang denen Information fließen darf. 6 7.1 Elemente der Informationstheorie Erhalt einer Nachricht (Daten) verringert den Grad der Unwissenheit beim Empfänger. „Informationsgehalt“ einer Nachricht X hängt von den Wahrscheinlichkeiten p(xi) der möglichen Ausprägungen x1, x2, ... von X ab, z.B. wenn ich eine von zwei möglichen Nachrichten erwarte und feststeht, dass die eine sehr viel wahrscheinlicher ist als die andere, erhalte ich beim Eintreffen der Nachricht weniger Information als wenn beide Nachrichten gleichwahrscheinlich sind. Um Informationsfluss präzise definieren zu können, werden Konzepte der Informationstheorie verwendet. Dazu wird zunächst der Informationsgehalt einer Nachricht betrachtet, welcher die Unwissenheit des Empfängers über bestimmte Daten verringert. Grundlage des Informationsgehalts einer Nachricht sind die Wahrscheinlichkeiten der möglichen Ausprägungen der Nachricht. Wenn beispielsweise eine von zwei Nachrichten erwartet werden und die eine sehr viel wahrscheinlicher ist als die andere, erhält man beim Eintreffen der Nachricht weniger Information als wenn beide Nachrichten gleichwahrscheinlich sind. 7 7.1 Elemente der Informationstheorie Beispiel: Würfeln im Nebenzimmer mit 6-seitigem Würfel. Die Ungewissheit/Unsicherheit vor dem Würfeln ist groß. Durch die Nachricht W>3 wird die Unsicherheit reduziert. Der Informationsgehalt der Nachricht ist der Wert, um den die Unsicherheit reduziert wird. Bei einem 6-seitigen Würfel ist die Unwissenheit über das nächste Würfelergebnis und damit der Informationsgehalt des Würfelergebnisses beispielsweise höher, als wenn ich vorher schon weiß, dass der Würfel eine Zahl größer 3 würfeln wird. Im ersten Fall habe ich 6 mögliche Ergebnisse, im zweiten Fall nur noch 3 mögliche Ergebnisse. 8 7.1 Elemente der Informationstheorie Quantifizierung des Informationsgehalts durch den Begriff Entropie einer Nachricht X (Shannon 1948): H ( X ) = ∑ p ( xi ) log 2 (1 / p ( xi )) Grad der Ungewissheit/Unsicherheit über den Inhalt der Nachricht. Die Entropie ist am größten, wenn alle Ausprägungen xi gleichwahrscheinlich sind. Um den Informationsgehalt statistisch quantifizieren zu können, hat Shannon den Begriff der Entropie eingeführt. Die Entropie ist ein Maß für die Unsicherheit über den Inhalt einer bestimmten Nachricht. Die Entropie ist am größten, wenn alle Ausprägungen der Nachricht gleichwahrscheinlich sind, da ich mir dann am „unsichersten“ bin, welchen Inhalt die Nachricht haben wird. Sind die Wahrscheinlichkeiten der Ausprägungen stark unterschiedlich, bin ich nicht sehr „überrascht“, wenn dass am meisten wahrscheinlichste Ereignis besonders oft auftritt. 9 7.1 Elemente der Informationstheorie Bei nicht gleichwahrscheinlichen Nachrichten geringere Entropie: p(heute) = 1/2 p(morgen) = _ p(übermorgen) = _ H(X) = _ log 2 + _ log 4 + _ log 4 = _ + _ + _ = 1,5 Erinnerung: log2(x)= log10(x) / log10(2) Betrachten wir die Entropie des Beispiels der Folie mit drei möglichen Ausprägungen (heute, morgen, übermorgen), die eine unterschiedliche Wahrscheinlichkeit besitzen. Für die Entropie ergibt sich ein Wert von 1,5. 10 7.1 Elemente der Informationstheorie Zum Vergleich: Entropie bei gleicher Wahrscheinlichkeit p(heute) = 1/3 p(morgen) = 1/3 p(übermorgen) = 1/3 H(X) = log 3 = 1,58 Betrachten wir nun dasselbe Beispiel, in dem alle Ereignisse gleichwahrscheinlich sind, ergibt sich eine (leicht) höhere Entropie. 11 7.1 Elemente der Informationstheorie Beispiel: Entropie eines perfekten Würfels p(i)= 1/6, also H(X) = log 6 = 2,58 Betrachtung anderer Aussagen, z.B. Würfelergebnis i < 3, i = 3, i > 3 p(i<3) = 1/3, p(i=3) = 1/6, p(i > 3) = _, also H(X)= 1/3 log 3 + 1/6 log 6 + _ log 2 = 1,68 Ein weiteres Beispiel, das zeigt das gleichwahrscheinliche Ereignisse eine höhere Entropie und damit Unsicherheit ergeben, zeigt diese Folie anhand eines Würfels. Die Entropie eines 6seitigen Würfels, bei dem alle Zahlen gleichwahrscheinlich sind, hat eine Entropie von 2,58. Betrachtet man nur die Ereignisse: Würfelzahl kleiner 3, Würfelzahl gleich 3 und Würfelzahl größer 3, so ergeben sich unterschiedliche Wahrscheinlichkeiten für die Einzelereignisse. Damit sinkt auch die Entropie auf einen Wert von ca. 1,68. 12 7.1 Elemente der Informationstheorie Bedingte Entropie Verbleibende Unsicherheit unter der Voraussetzung, dass bereits gewisse Information vorliegt. Bedingte Wahrscheinlichkeit eines Ereignisses: p(F|E) = p(E und F) / p(E) wobei p(F|E) die Wahrscheinlichkeit von F unter der Bedingung E ist. Betrachten wir nun die bedingte Entropie, d.h. die Entropie einer Nachricht unter der Voraussetzung, dass bereits gewisse Information vorliegt. Die bedingte Entropie baut auf der bedingten Wahrscheinlichkeit auf. Die bedingte Wahrscheinlichkeit eines Ereignisses F unter dem bedingenden Ergebnis E ist die Wahrscheinlichkeit des Ereignisses F, falls E schon eingetreten ist. Die Formel für die bedingte Wahrscheinlichkeit zeigt die Folie: sie ist der Quotient aus der Wahrscheinlichkeit für das Eintreffen beider Ereignisse und der Wahrscheinlichkeit für das bedingende Ereignis. 13 7.1 Elemente der Informationstheorie Beispiel Würfel: X = {gerade, ungerade} p(i gerade) = _, p(i ungerade)=1/2 Y = {i<3, i=3, i>3} p(i<3) = 1/3, p(i=3) = 1/6, p(i > 3) = _, p( i>3 | i gerade) = p( i>3 und i gerade) / p( i gerade) = 1/3 / 1/2 = 2/3 Ein Beispiel für eine bedingte Wahrscheinlichkeit zeigt diese Folie. Es zeigt die Wahrscheinlichkeit, dass man eine Zahl größer 3 würfelt, unter der Annahme, dass die Würfelzahl gerade ist. 14 7.1 Elemente der Informationstheorie Bedingte Entropie von X unter der Bedingung Y: H ( X | Y ) =∑ p ( yk )∑ p ( xi | yk ) log 2 1 k i p ( xi | yk ) Mit der bedingten Wahrscheinlichkeit lässt sich dann die Formel für die bedingte Entropie ausdrücken. 15 7.2 Entropie-basierte Analyse Entropie zur Bestimmung des Informationsflusses Gegeben seien Objekte x und y und eine Sequenz von Kommandos c, die das System von Zustand s in den Zustand t transformiert. Es existiert ein Informationsfluss von x nach y, wenn H(xs|yt) < H(xs|ys). Falls y im Zustand s nicht existiert, gilt H(xs|ys) = H(xs). D.h.: Information fließt von x nach y, wenn aus ys Informationen über den Wert von x vor der Ausführung der Kommandos abgeleitet werden kann. Die bedingte Entropie wird nun zur Bestimmung des Informationsflusses verwendet. Intuitiv fließt Information von einem Objekt x zu einem Objekt y, wenn die Information in y durch die Anwendung einer Sequenz von Operationen durch die Information in x beeinflusst wird. Um dies formal auszudrücken, betrachten wir zunächst eine Sequenz von Kommandos, die das System vom Zustand s in den Zustand t transformiert. Der Zustand der Variable x im Zustand s sei xS. Der Zustand der Variable y im Zustand t sei yt, falls y schon im Zustand s existierte, wird dessen Zustand mit ys bezeichnet. Es fließt durch die Kommandos Information von x nach y, wenn für die bedingte Entropie H(xs|yt) < H(xs|ys) gilt, d.h. die Unsicherheit über den Wert von xS ist nach der Ausführung der Kommandos geringer (unter dem Wissen der Werte für y). Wenn y nicht im Zustand s existieren sollte, so fließt Information, wenn H(xs|ys) = H(xs). Diese Definition sagt also, dass Information von x nach y fließt, wenn der neue Wert von y es erlaubt, Informationen über den Wert von x vor der Ausführung der Kommandos abzuleiten. 16 7.2 Entropie-basierte Analyse y:=x; H(xs|yt) = 0, da keine Unwissenheit über den Wert xs nach dem Kommando besteht. x:=y+z; y = {0,...,7} mit gleicher Wahrscheinlichkeit p(yi) = 1/8 z = {1,2,3} mit p(z1)=1/2 und p(z2)=p(z3)=1/4 H(ys) = H(yt) = 3 und H(zs) = H(zt) = 3/2 H(ys| xs) = H(ys) Wenn xt bekannt ist, kann ys nur noch drei mögliche Werte haben, d.h. H(ys| xt) = log 3 = 1,58 1,58 = H(ys| xt) < H(ys| xs) = 3 Informationsfluss von y nach x. Das Kommando y:=x deckt den Wert von x vor dem Kommando auf. De Wert von x ist nach Zuweisung an y bekannt und es besteht keinerlei Unwissenheit mehr über den Wert von x (d.h H(xs|yt) = 0) . Im zweiten Beispiel sei x:=y+z, wobei y einen wert von 0...7 mit gleicher Wahrscheinlichkeit annehmen kann. Die Variable z nimmt den Wert 1 mit Wahrscheinlichkeit 0,5 und die Werte 2 und 3 mit Wahrscheinlichkeit 0,25 an. Wenn s der Zustand vor der Ausführung des Kommandos ist und t der Zustand nachher, so ist H(ys) = H(yt) = 3 und H(zs) = H(zt) = 3/2. Nachdem der Wert xt bekannt ist, kann ys nur noch drei mögliche Werte gehabt haben, so dass H(ys| xt) = log 3 = 1,58. Somit fließt Information von y nach x. 17 7.2 Entropie-basierte Analyse if x = 1 then y:=0 else y:=1; Die Variablen x und y können die Werte 0 oder 1 annehmen. Die Variable nimmt ihren Wert gleichwahrscheinlich an, d.h. H(xs)=1. Wenn y nach dem Kommando den Wert 0 hat, folgt daraus x=1 (und umgekehrt) H(xs| yt)= 0. Also H(xs| yt)= 0 < H(xs| ys)= H(xs)=1. Informationsfluss von x nach y. Die Variablen x und y dieses Beispiels können die Werte 0 oder 1 annehmen. Die Variable x nimmt gleichwahrscheinlich die Werte 0 oder 1 an, so dass H(xs)=1. Es ist jedoch H(xs| yt)= 0 , da ein Wert y=0 impliziert für x den Wert 1, ein Wert y=1 den Wert x=0. Somit fließt Information von x nach y. 18 7.2 Entropie-basierte Analyse Explizite Flüsse – Spezieller Transportbefehl – Beispiele: x:=y (Programmiersprache), call proc(x) (Parameterübergabe), send(K,x) (Prozesskommunikation) Implizite Flüsse – Entstehen durch Auswerten von Bedingungen, wie if then else, while do, ... – Keine explizite Anweisung y:= f(x) Bei den Informationsflüssen lassen sich explizite und implizite Flüsse unterscheiden. Ein expliziter Informationsfluss tritt auf, wenn Information durch einen speziellen Transportbefehl übermittelt wird. Diese Art von Transportbefehl ist beispielsweise die gezeigte Zuweisung x:=y, aber auch Prozeduraufrufe mit Parameterübergabe oder Prozesskommunikationsanweisungen. Im Gegensatz zu expliziten Flüssen, gibt es bei impliziten Flüssen keine expliziten Anweisungen der Form y:=f(x), wobei f ein Ausdruck über der Variablen x ist. Implizite Flüsse entstehen vielmehr aufgrund der Flusskontrolle im Programm, die auf Werten von Variablen abhängt. 19 7.3 Informationsflussmodelle Basieren auf Sicherheitsklassen (security classes). Sicherheitsklassen bilden einen Verband (S, <), d.h. – S ist eine Menge von Sicherheitsklassen, – < ist eine partielle Ordnung auf S (reflexiv, transitiv, antisymmetrisch) – für alle a,b in S existiert stets (eindeutig) • lub(a,b) kleinste obere Schranke von a,b • glb(a,b) größte untere Schranke von a,b In einem Informationsflussmodell werden die zulässigen Wege spezifiziert, entlang denen Information fließen darf. Zur Spezifikation dieser gültigen Wege benutzen die Modelle Sicherheitsklassen als Markierungen für Objekte. Das Modell hat dann Regeln, unter welchen Bedingungen Information zwischen Objekten welcher Sicherheitsklasse fließen darf. In der Regel bilden die Sicherheitsklassen einen Verband (S,<), d.h. S ist eine Menge von Sicherheitsklassen und < eine reflexive, antisymmetrische und transitive Relation auf dieser Menge. Außerdem muss für jedes Paar von Sicherheitsklassen aus S die kleinste obere Schranke (least upper bound, lub) und die größte untere Schranke (greatest lower bound, glb) existieren. 20 7.3 Informationsflussmodelle Die grundlegende Idee ist, dass Information nur in Richtung „höherer“ Geheimhaltungsklassen fließen darf. x < y bedeutet, dass Informationsfluss von x nach y erlaubt ist. Beispiele: Sachgebiete A oder B nicht öffentlich Sachgebiet A öffentlich Sachgebiet B Sachgebiete A und B Informationsfluss entlang der Pfeile Die Idee ist dann, dass x < y angibt, dass Information nur von x nach y fließen darf, aber nicht entgegengesetzt. Die Folie zeigt zwei Beispiele für Verbände von Sicherheitsklassen. Beispielsweise darf Information von Objekten mit Markierung öffentlich zu Objekten mit Markierung nicht öffentlich fließen, aber nicht von nicht öffentlich zu öffentlich. Die Notation der Pfeile bedeutet, dass das Paar (öffentlich, nicht öffentlich) in der Relation < ist. 21 7.3 Informationsflussmodelle Besonders im militärischen Bereich ist die Verwendung streng hierarchischer Geheimhaltungsklassen üblich (multi-level security) streng geheim top secret geheim secret vertraulich confidential offen unclassified Besonders im militärischen Bereich wird diese lineare Anordnung von Sicherheitsklassen verwendet. 22 7.3 Informationsflussmodelle Potenzmenge einer Menge M bildet einen Verband (2M, <), wobei < die Teilmengenbeziehung ist. Beispiel: Unternehmen mit Krankheitsdaten (K), Gehaltsdaten (G) und Beurteilungen (B). {K,G,B} {K,G} {K,B} {G,B} {K} {G} {B} Eine weitere Möglichkeit zur Erstellung eines Verbandes für Sicherheitsklassen ist die Potenzmenge zusammen mit der Teilmengenbeziehung. Nehmen wir an, wir hätten ein Unternehmen, in dem es Krankheitsdaten (K), Gehaltsdaten (G) und Beurteilungen (B) gibt. Bilden wir für die Sicherheitsklassen die Potenzmenge der Menge {K, G, B} bekommen wir den Verband auf der Folie. Alle Teilmengen der Menge {K, G, B} bilden die Sicherheitsklassen. Zwei Sicherheitsklassen A und B stehen in Relation, wenn A Teilmenge von B. Es darf dann Information von A nach B fließen. Wenn beispielsweise ein Mitarbeiter die Sicherheitsklasse {K,G} besitzt, kann er auf Krankheits- und Gehaltsdaten zugreifen. 23 7.3 Informationsflussmodelle Bedeutung von lub(a,b)=c Fließt bei einer Operation Information aus zwei Objekten Oa und Ob in ein Objekt Oc, so gibt lub(a,b) die Klasse an, der das Objekt Oc (mindestens) angehören muss. c * a * b a b Bedeutung von glb(a,b)=c Fließt bei einer Operation aus einem Objekt Oc Information in zwei Objekte Oa und Ob, so gibt glb(a,b) die Klasse an, der das Objekt Oc (höchstens) angehören darf. * c * Die kleinste obere Schranke (least upper bound, lub) ermittelt für zwei Sicherheitsklassen a und b die kleinste Sicherheitsklasse, die sowohl größer als a als auch als b ist. Fließt bei einer Operation Information von a und b in ein Objekt c, so muss c mindestens die Sicherheitsklasse von lub(a,b) haben, damit kein unerlaubter Informationsfluss entsteht. Würde das Objekt c eine Klasse kleiner lub(a,b) haben (d.h. c < lub(a,b)), so würde entweder not(a <c) oder not(b<c). Damit würde Information unerlaubt von a nach c (bzw. von b nach c) fließen. Die größte untere Schranke (greatest lower bound, glb) ermittelt für zwei Sicherheitsklassen a und b die größte Sicherheitsklasse, die sowohl kleiner als a als auch kleiner als b ist. Fließt bei einer Operation aus einem Objekt c Information in Objekte a und b, so muss c höchstens die Sicherheitsklasse glb(a,b) haben, damit kein unerlaubter Informationsfluss auftritt. Würde beispielsweise das Objekt c eine Klasse größer glb(a,b) haben, so wäre not(c<a) oder not(c<b). Damit würde Information unerlaubt von c nach a (bzw. nach b) fließen. 24 7.3 Informationsflussmodelle Ein Informationsflussmodell I ist ein 6-Tupel I= (S,<,O, s), wobei - (S,<) ist ein Verband aus Sicherheitsklassen - O ist eine Menge von Objekten - s: O S weist jedem Objekt seine Sicherheitsklasse zu Ein Informationsflussmodell besteht dann aus einem Verband aus Sicherheitsklassen, einer Menge von Objekten und einer Abbildung, de jedem Objekt seine Sicherheitsklasse zuordnet. 25 7.4 Compiler-basierte Analyse Statische Analyse eines Programms auf unerlaubte Informationsflüsse bzgl. einer Informationsflussstrategie. Spezifikation des Programms umfasst die Sicherheitsstrategie. Beispiel: proc sum(x: int class {a}; out: int class {b} ); out := out + x; mit a < b. Compiler-basierte Analyse prüft die Informationsflüsse innerhalb eines Programms. Der Mechanismus bestimmt, ob der Informationsfluss innerhalb eines Programms die in der Informationsflussstrategie spezifizierten erlaubten Informationsflüsse verletzt. Diese Analyse ist nicht präzise in dem Sinne, dass Informationsflüsse als unzulässig bzgl. einer Informationsflussstrategie bewertet werden könnten, obwohl das Programm sicher sind. Es bleibt jedoch kein unerlaubter Informationsfluss unentdeckt, d.h. unsichere Programme werden immer gefunden. Voraussetzung für eine Compiler-basierte Analyse ist die Integration der Sicherheitsklassen in das Programm. Wir schreiben die Sicherheitsklasse von Variablen in die Variablendeklaration. Im obigen Beispiel ist a die Sicherheitsklasse der Variablen x und b die Sicherheitsklasse der Variablen out. Die Sicherheitsklassenhierarchie ist a < b, d.h. Information darf von a nach b fließen. 26 7.4 Compiler-basierte Analyse Einfache Fluss-Axiome Zuweisung y:=f(x1,...,xn) ist sicher, wenn lub(s(x1),...,s(xn)) < s(y) Beispiel: y:= x1 + x2; ist sicher wenn lub(s(x1),s(x2)) < s(y) Wir betrachten auf den folgenden Folien einige einfache Fluss-Axiome für Programmausdrücke. Zunächst betrachten wir Anweisungen der Form y:=f(x1,...,xn), wobei y und x1,...,xn Variablen sind und f ist eine Funktion. Information fließt von jedem xi nach y. Daher ist die Anforderung für einen sicheren Informationsfluss lub(s(x1),...,s(xn)) < s(y), d.h. die Sicherheitsklassen der xi sind kleiner als die Sicherheitsklasse von y. Betrachten wir das Beispiel der Folie, so ist diese Zuweisung sicher, wenn lub(s(x1),s(x2)) < s(y). 27 7.4 Compiler-basierte Analyse Sequenz s1;...sn; ist sicher, wenn alle si sicher sind (Transitivität von <) Beispiel: x:= y+z; a:=b*c-x; Sicher, wenn lub(s(y),s(z)) < s(x) lub(s(b),s(c),s(x)) < s(a). Eine Sequenz von Anweisungen s1;...;sn ist sicher, wenn der Informationsfluss in jedem Teil si sicher ist. Im Beispiel müssen beide Zuweisungen sicher sein, damit die Sequenz sicher ist. Für die Sicherheit der Anweisungen gelten dann die Bedingungen der vorigen Folie. 28 7.4 Compiler-basierte Analyse if f(x1,...,xn) then S1 else S2; ist sicher, wenn S1 und S2 sicher sind und lub(s(x1),...,s(xn)) < glb{s(y)| y ist Ergebnis einer Zuweisung in S1 oder S2} Wenn S2 leer ist (d.h. keine else-Teil), ist S2 trivialerweise sicher und enthält keine Zuweisungen. Bei einer if-Anweisung wird abhängig von der Auswertung der boolschen Funktion f der Ausdruck S1 oder S2 ausgeführt. Daher müssen beide sicher sein. Die Auswahl von S1 bzw. S2 gibt Informationen über die Werte von x1,...,xn, so dass Information von diesen Variabeln zu jeder Variablen fließt, die in S1 oder S2 ein Ergebnis einer Zuweisung ist. Dies ist nur erlaubt, wenn die kleinste Sicherheitsklasse dieser Variablen in S1 und S2 größer ist als die größte Sicherheitsklasse der Variablen x1,...,xn. Im speziellen Fall, dass S2 leer ist, muss nur S1 sicher sein und die Variablen in S1 betrachtet werden. 29 7.4 Compiler-basierte Analyse Beispiel: if x + y < z then a := b else d:= b * c – x; Beachte: Information fließt von x,y,z nach a und d! Sicher, wenn s(a) < s(b) und lub(s(b),s(c),s(x))<s(d) und lub(x,y,z)<glb(a,d). Damit die if-Anweisung dieses Beispiels sicher ist, müssen zunächst a:=b; und d:=b*c-x; sicher sein. Dies ist der Fall, wenn s(a) < s(b) und lub(s(b),s(c),s(x))<s(d). Da der ausgeführte Zweig der if-Anweisung von den Werten der Variablen x,y und z abhängt, fließt auch Information von x,y und z nach a und d (den Variablen, die Ergebnis einer Zuweisung sind). Daher muss ebenfalls lub(x,y,z)<glb(a,d) gelten, damit die if-Anweisung sicher ist. 30 7.4 Compiler-basierte Analyse while f(x1,...,xn) do S end; ist sicher, wenn while terminiert, S sicher ist und lub(s(x1),...,s(xn))< glb{s(y)| y ist Ergebnis einer Zuweisung in S} Der Ausdruck f(x1,...,xn) in einer while-Schleife ist eine Bedingung, die wie bei if-Ausdrücken Informationen in den Ausdruck S fließen lässt. Auch die Anzahl der Wiederholungen von S hängt vom Ausdruck f(x1,...,xn) ab, so dass auch darüber Information nach S fließt. Daher muss (wie beim if) die kleinste gemeinsame Sicherheitsklasse der Variablen in S größer sein als die größte Sicherheitsklasse der Variablen x1,...,xn. Wenn die while-Schleife nie terminiert, werden Ausdrücke nach dem while niemals ausgeführt. Auch in diesem Fall ist Information von x1,...,xn geflossen. Also erfordert ein flusssicheres Programm Termination. Abschließend muss auch noch der Ausdruck S sicher sein. 31 7.4 Compiler-basierte Analyse Beispiel: while i < n do a[i] := b[i]; i := i + 1; end; Die while-Schleife terminiert. Die Schleife ist sicher, wenn s(b[i]) < s(a[i]) und s(i)<s(i) und lub(s(i),s(n)) < glb(s(a[i],s(i)). Die while-Schleife dieses Programms terminiert, da n eine feste natürliche Zahl ist und i bei jedem Schleifendurchlauf um eins erhöht wird. Die Anweisungen innerhalb der while-Schleife sind sicher, wenn s(b[i]) < s(a[i]) und s(i)<s(i). Den Variablen a[i] und i werden Ergebnisse von Ausdrücken zugewiesen. Daher fließt Information von i und n des boolschen Ausdrucks i < n in diese Variablen. Daher muss ebenfalls lub(s(i),s(n)) < glb(s(a[i],s(i)) für die Sicherheit der while-Schleife gelten. 32 7.4 Compiler-basierte Analyse Programm-Beispiel: prog(x:int class {x}, y:int class {y}, a:int class {a}, b:int class {b}) { C: if (x<y) D: { A: a = x; B: b = x * y; } } Nun wollen wir die Flusssicherheit eines etwas größeren Beispieles nachweisen. Das Programm hat die Variablen x, y, a und b mit den Sicherheitsklassen x, y, a und b. 33 7.4 Compiler-basierte Analyse ...folgender Fluss-Spezifikation b x=a y {} Ist das Programm flusssicher? Die Folie zeigt die hierarchische Anordnung der Sicherheitsklassen. 34 7.4 Compiler-basierte Analyse A: s(x)<s(a) x < a, somit ist A sicher B: lub(s(x),s(y))<s(b) b < b, somit B sicher D: sicher, da A und B sicher sind. C: sicher, wenn lub(s(x),s(y)) < glb(s(a),s(b)) Es ist lub(s(x),s(y)) = b und glb(s(a),s(b)) = a Programm nicht sicher! Zunächst betrachten wir die Sicherheit des Ausdrucks A: a = x; Die Zuweisung ist sicher, wenn x < a, d.h. wenn Information von x nach a fließen darf. Nach der Sicherheitsklassenhierarchie ist dies erlaubt, da x=a. Nun betrachten wir den Ausdruck B: b = x * y;, welcher sicher ist, wenn lub(s(x),s(y))<s(b). Die kleinste obere Schranke der Sicherheitsklassen x und y ist b. Da die Sicherheitsklasse von b ebenfalls b ist, ist auch B sicher. Der Ausdruck D ist sicher, da A und B sicher sind. Als letztes ist der Ausdruck C zu betrachten. Die if-Anweisung ist sicher, wenn D sicher ist und wenn lub(s(x),s(y)) < glb(s(a),s(b)). D ist sicher, aber die kleinste obere Schranke von x und y ist b, welche nicht kleiner als a (die größte untere Schranke von a und b ) ist. Das Programm ist somit nicht sicher. 35 7.4 Compiler-basierte Analyse Statische Prüfung ist mühsam. Positiver Ausgang ist nur hinreichende Bedingung für Flusssicherheit, d.h. auch bei negativem Ausgang könnte das Programm sicher sein. Alternative: dynamisches Mitführen der Sicherheitsklassen und dynamische Prüfung. Nachteil: aufwendig, Probleme mit impliziten Flüssen Die statische Prüfung eines Programms ist sehr mühsam und aufwendig. Außerdem bietet die Analyse nur eine hinreichende Bedingung der Flusssicherheit, d.h. es können auch Programme als unsicher bewertet werden, die sicher sind. Als Alternative werden daher Sicherheitsprüfungen dynamisch zur Laufzeit durchgeführt. Dies ist einfach bei expliziten Flüssen wie Zuweisungen, bei denen die Sicherheitsklassen der Beteiligten Variablen geprüft werden, aber schwierig für implizite Flüsse (wie bei if- oder while-Ausdrücken). 36 7.4.1 JFlow JFlow ist eine Erweiterung von Java, um statisch Informationsflüsse zu prüfen. JFlow Compiler prüft JFlow-Programm und übersetzt es in ein Standard Java-Programm. A.C.Myers. JFlow: Practical Mostly-Static Information Flow Control. Proc. 26th ACM Symposium of Programming Languages, 1999 JFlow ist eine Anwendung von Informationsfluss auf die Programmiersprache Java. Bei JFlow können Java-Elemente mit Sicherheitsklassen verknüpft werden. Der JFlow-Compiler prüft dann anhand dieser Sicherheitsmerkierungen, ob die Informationsflüsse im Programm sicher sind. Ist dies der Fall, übersetzt er das um Sicherheitsklassen erweiterte Programm in ein normales Java-Programm. 37 7.4.1 JFlow Sicherheitslabel für Variablen z.B. int {public} x; boolean {secret} b; Dynamische Sicherheitslabel werden zur Laufzeit ausgewertet, da sie nicht statisch bekannt sind. z.B. int {*lb} x; Principals für Variablen (nur diese dürfen zugreifen) z.B. class Account { final principal customer; String {customer:} name; float {customer:} balance} Weitere Sicherheitslabel für Methoden und Klassen. Diese Folie zeigt einige Beispiele, wie Sicherheitsklassen bzw. Sicherheitslabel in JFlow an Java-Elemente gehangen werden können. Es können Variablen, Methoden und Klassen ein Sicherheitslabel tragen. 38 7.5 Zugriffsschutz + Flusskontrolle Modelle, die Zugriffsschutz mit Flusskontrolle kombinieren. Chinese-Wall-Modell (Brewer/Nash 1989) Bell-LaPadula-Modell (Bell/LaPadula 1975) Im folgenden sollen zwei Modelle vorgestellt werden, die Informationsfluss und Zugriffskontrolle kombinieren. Dabei handelt es sich um das Chinese-Wall-Modell und das Bell-LaPadula-Modell. 39 7.5.1 Chinese-Wall-Modell Schutzziel: Verhindern unzulässiger Informationsflüsse zwischen konkurrierenden Unternehmen (z.B. Bankwesen). Prinzip: Rechtevergabe berücksichtigt bereits erfolgte Zugriffe, d.h. ein Zugriff verändert die Zugriffsrechte. Das Chinese-Wall-Modell wird eingesetzt, um die unzulässige Ausnutzung von Mitarbeiterwissen in konkurrierenden Unternehmen zu verhindern. Es soll beispielsweise verhindern, dass ein Berater eines Unternehmens Informationen über das Unternehmen benutzt, um einem Konkurrenz-Unternehmen Ratschläge zu erteilen. Die Idee des Chinese-WallModells ist es, die Zugriffsmöglichkeiten eines Subjekts durch die Zugriffe, die es in der Vergangenheit durchführte, zu beschränken. 40 7.5.1 Chinese-Wall-Modell Liegt Zugriffsschutzmatrixmodell zugrunde: Zugriffsrechte R = {read, write, execute} Subjekte S agierende Personen im Unternehmen (z.B. Berater) Objekte O Werden als Baum mit drei Ebenen strukturiert. Konfliktklassen K konkurrierende Unternehmen bilden eine Konfliktklasse Dem Chinese-Wall-Modell liegt eine Zugriffsschutzmatrix mit den Rechten read, write und execute zugrunde. Die Menge der Subjekte ist die Menge der Mitarbeiter des Unternehmens, die Objekte sind die in den Unternehmen zu schützenden Objekte. Die Objekte werden in einem Baum angeordnet, in dem auch die Konfliktklassen definiert werden. Eine Konfliktklasse enthält eine Menge konkurrierender Unternehmen. 41 7.5.1 Chinese-Wall-Modell Objektbaum hat 3 Ebenen 1. Ebene: Konfliktklassen 2. Ebene: Unternehmen 3. Ebene (Blätter): Objekte, die in den unterschiedlichen Unternehmen verwaltet werden. Der Objektbaum besitzt drei Ebenen: In der ersten sind die Konfliktklassen spezifiziert. Deren Nachfolger in der zweiten Ebene sind die Unternehmen, die in Konflikt stehen. An den Unternehmen in der dritten Ebene hängen dann die Objekte der Unternehmen. 42 7.5.1 Chinese-Wall-Modell Beispiel: Objektbaum Mineralöl Aral o1 o2 Bank Konfliktklassen Shell Dresdner Deutsche o3 o4 o5 o6 o7 o8 o9 Unternehmen Objekte Die Folie zeigt ein Beispiel eines Objektbaumes. Es gibt vier Unternehmen Aral, Shell, Dresdner Bank und Deutsche Bank. Unter den Unternehmen hängen die zu den Unternehmen gehörenden Objekte. Auf der höchsten Ebene stehen die Konfliktklassen. Im Beispiel haben wir eine Konfliktklasse Mineralöl, in der die Unternehmen Aral und Shell sind, und die Konfliktklasse Bank, in der die Dresdner und Deutsche Bank sind. 43 7.5.1 Chinese-Wall-Modell Sicherheitsmarke eines Objekts für das Unternehmen und die Konfliktklasse: Objekt o = (x(o), y(o)) mit x: O K und y:O U, wobei U die Menge der Unternehmen. Öffentlich zugängliche Information bekommt eine spezielle Markierung y0 und eine Konfliktklasse x0={y0}. Die Sicherheitsmarke eines Objektes bilden das zugehörige Unternehmen und die Konfliktklasse, zu dem das Unternehmen gehört. Im vorigen Beispiel währe die Sicherheitsmarke für das Objekt o1 das Paar (Aral, Mineralöl), für das Objekt o9 das Paar (Deutsche, Bank). Frei verfügbare Objekte ohne Sicherheitsbeschränkungen bekommen eine spezielle Sicherheitsmarke (x0, y0). 44 7.5.1 Chinese-Wall-Modell Zugriffsschutzentscheidung gemäß Schutzmatrix M + Sicherheitsmarken + Zugiffshistorie N Zugriffshistorie ist eine Matrix N: S x O 2R, wobei N(s,o) die Menge der bisher benutzten Rechte ist, die s zum Zugriff auf o benutzte. Die Zugriffsschutzentscheidung erfolgt anhand der Schutzmatrix, den im Objektbaum definierten Sicherheitsmarken der Objekte und einer Zugriffshistorienmatrix, die die von den Subjekten ausgeführten Zugriffe verwaltet. Ein Eintrag N(s,o) in der Matrix N für die Zugriffshistorie für ein Subjekt s und ein Objekt o gibt die Menge der Rechte an, die das Subjekt bisher zum Zugriff auf das Objekt o benutzt hat. 45 7.5.1 Chinese-Wall-Modell Zugriff auf Objekte werden durch zwei systembestimmte Regeln beschränkt. Regel 1: Ein read- bzw. execute-Zugriff auf ein Objekt o für ein Subjekt s ist zulässig, wenn gilt: 1.) read bzw. execute in M(s,o) 2.) f.a. Objekte o‘: Wenn N(s,o‘) nicht leer, dann ist y(o‘)=y(o), d.h. gleiches Unternehmen, oder x(o) = x(o‘), d.h. kein Konflikt, oder y(o‘)=y0. Der Zugriff auf ein Objekt wird durch zwei systembestimmte Regeln beschränkt. Die LeseRegel (Regel 1) reglementiert den Lese-Zugriff, während die Schreib-Regel (Regel 2) Beschränkungen für modifizierende Zugriffe festlegt. Regel 1 besagt, das ein Subjekt s nur dann einen read- bzw. execute-Zugriff auf ein Objekt o ausführen darf, wenn s des entsprechende Recht in der Schutzmatrix M hat, s bisher noch auf kein Objekt o´ zugegriffen hat, das zu einem anderen Unternehmen gehört, aber die gleiche Konfliktklasse wie o hat. Das Subjekt s darf immer auf öffenltich zugängliche Objekte zugreifen (y(o‘)=y0). 46 7.5.1 Chinese-Wall-Modell Beispiel: Subjekt s1 hat auf o2 zugegriffen. Mineralöl Aral o1 o2 Bank Shell Dresdner Deutsche o3 o4 o5 o6 o7 o8 o9 Durch Regel 1 wird nach dem Zugriff auf ein Objekt o durch ein Subjekt s eine Mauer um alle diejenigen Objekte o‘ errichtet, die zu anderen Unternehmen derselben Konfliktklasse gehören. Nehmen wir an, Subjekt s1 greift auf o2 zu, dann verbietet Regel 1 den Zugriff auf alle Objekte von Shell, da Objekt o1 zum Unternehmen Aral gehört, welches in Konflikt mit dem Unternehmen Shell steht. Auf die Objekte der Banken kann s1 jedoch noch zugreifen, da Aral zu keiner Bank in Konflikt steht. 47 7.5.1 Chinese-Wall-Modell Beispiel: Subjekt s1 hat auf o7 zugegriffen. Mineralöl Aral o1 o2 Bank Shell Dresdner Deutsche o3 o4 o5 o6 o7 o8 o9 Weiterer Mauerbau nach dem Zugriff von s1 auf Objekt o7. 48 7.5.1 Chinese-Wall-Modell Regel 1 verhindert noch keine unerwünschten Informationsflüsse. Mineralöl Aral o1 o2 s1 1:read Bank Shell Dresdner Deutsche o3 o4 o5 o6 o7 o8 o9 2:write 3:read 4:write s2 Informationsfluss von o2 nach o5 ! Regel ist jedoch nicht ausreichend, um unerlaubte Informationsflüsse zu verbieten. Falls beispielsweise Subjekt s1 lesend auf Objekt o2 und danach schreibend auf Objekt o7 zugreift, kann Subjekt s2 die Information in o7 lesen und in Objekt o5 schreiben. Dadurch gelangt Information von o2 nach o5, was nicht erlaubt ist, da die Unternehmen Aral und Shell in Konflikt stehen. 49 7.5.1 Chinese-Wall-Modell Regel 2: Ein write-Zugriff auf ein Objekt o durch ein Subjekt s ist zulässig, genau dann wenn: 1.) write in M(s,o) und 2.) f.a. Objekte o‘: Wenn read in N(s,o‘), dann y(o‘)=y(o), d.h. gleiches Unternehmen, oder y(o‘)=y0. Regel 2 verhindert diese Art von Informationsflüssen. Die Regel legt fest, dass ein writeZugriff durch ein Subjekt s auf ein Objekt o zulässig ist, wenn s das write-Recht in der Schutzmatrix M besitzt und s nur read- bzw. execute-Zugriffe auf solche Objekt o‘ hatte, die entweder zum gleichen Unternehmen wie o gehören oder nur frei zugängliche Informationen beinhalten. 50 7.5.2 Bell-LaPadula-Modell Liegt dynamisches Zugriffsschutzmatrixmodell zugrunde: Rechte = {read-only, append, execute, read-write, control} Sicherheitsklassen (S, <) (vgl. 7.3) Objekten und Subjekten wird eine Sicherheitsklasse zugeordnet. bei Objekten: Einstufung (classification) bei Subjekten: Ermächtigung (clearance) ist die maximale Sicherheitsstufe des Subjekts. Dem Bell-LaPadula-Modell liegt ein dynamisches Zugriffsschutzmatrixmodell mit folgenden Rechten zugrunde: read-only erlaubt einen Lese-Zugriff, append berechtigt Daten an existierende Objekte anzuhängen, das read-write-Recht erlaubt den Lese- und Schreibzugriff und das control-Recht erlaubt die Rechteweitergabe bzw. –rücknahme. Das execute-Rechte berechtigt zur Ausführung von Programmen. Neben der Zugriffsschutzmatrix gibt es Sicherheitsklassen mit einer partiellen Ordnung <, um den Objekten und Subjekten unterschiedliche Vertraulichkeitsstufen zuzuordnen. Die Sicherheitsklasse eines Subjekts (Ermächtigung, clearance) ist die maximale Sicherheitsstufe, die das Subjekt einnehmen darf. Bei der Anmeldung gibt das Subjekt seine aktuelle Ermächtigung an. 51 7.5.2 Bell-LaPadula-Modell Zugriff wird durch zwei systembestimmte Regeln beschränkt. Simple Security Property: Ein Read- oder Execute-Zugriff auf ein Objekt o durch ein Subjekt s ist zulässig, wenn 1.) read- bzw. execute-Recht in M(s,o) 2.) sc(s) > sc(o) Der Zugriff auf Objekte wird durch die Simple-Security- und die *-Eigenschaft beschränkt. Die Simple-Security-Regel besagt, dass ein Lese oder Execute-Zugriff auf ein Objekt o durch ein Subjekt s nur dann zulässig ist, wenn s das entsprechende Recht in der Zugriffsschutzmatrix M besitzt und die Objektsicherheitsklasse kleiner oder gleich der Sicherheitsklasse des Subjekts ist. 52 7.5.2 Bell-LaPadula-Modell *-Eigenschaft für den Schreib-Zugriff Ein Append-Zugriff auf ein Objekt o durch ein Subjekt s ist zulässig, wenn 1.) append-Recht in M(s,o) 2.) sc(s) < sc(o) Ein Read-Write-Zugriff auf ein Objekt o durch ein Subjekt s ist zulässig, wenn 1.) read-write-Recht in M(s,o) 2.) sc(s) = sc(o) Die *-Eigenschaft besagt, dass eine append-Zugriff auf ein Objekt o durch ein Subjekt s nur zulässig ist, wenn die Sicherheitsklasse des Objekts mindestens so hoch ist, wie die Klasse des Subjekts. Ein Lese-Schreib-Zugriff auf ein Objekt o ist nur zulässig, wenn die Objektsicherheitsklasse gleich der Klasse des Subjekts ist. Die beiden Simple-Security und die *-Eigenschaft-Regel gewährleisten, das Information höchstens von unten nach oben entlang der partiellen Ordnung < oder innerhalb einer Sicherheitsklasse fließen kann. 53 7.5.2 Bell-LaPadula-Modell streng geheim Doc1 append geheim vertraulich read-write Doc2 Doc3 S1 append read Doc4 append read-write unklassifiziert Doc5 read, execute S2 zulässiger Informationsfluss Die Folie zeigt ein Beispiel für linear angeordnete Sicherheitsklassen unklassifiziert < geheim < vertraulich < streng geheim. Dokumente und Subjekte sind dieses Sicherheitsklassen zugeordnet. Es sind erlaubte und unerlaubte Zugriffe dargestellt. 54 7.5.2 Bell-LaPadula-Modell Das Modell ist sehr starr, da Informationen nicht dynamisch eingestuft werden können. Daher in der Praxis 1. Ermächtigung für Subjekte ist nicht fest zugeordnet: - aktuelle Ermächtigung kann kleiner sein als maximale Ermächtigung - Benutzer wählt aktuelle Ermächtigung beim Einloggen 2. Vertrauenswürdige Benutzer haben eine Sonderrolle und können sich über die Regeln hinwegsetzen. Beispiel-System: UNIX System V/MLS (1989) Um das Bell-LaPadula-Modell flexibler zu gestalten, kann man vertrauenswürdige Benutzer bzw. Prozesse einführen, bei denen davon ausgegangen wird, dass sie keine Aktionen durchführen, die die Sicherheitseigenschaften verletzen. Sie dürfen sich daher über die Regeln hinwegsetzen. Wie schon erwähnt, können Benutzer beim Anmelden auch eine geringere Ermächtigung wählen, als ihnen maximal zusteht. 55