Tractatus Logico-Philosophicus Instrumentum Computatorium

Tractatus Logico-Philosophicus Instrumentum Computatorium

Marc Ruef
von Marc Ruef
Lesezeit: 47 Minuten

Im Jahr 1921 veröffentlichte der österreichische Philosoph Ludwig Wittgenstein (1889-1951) sein erstes und einziges zu seinen Lebzeiten herausgegebene Hauptwerk. Im Tractatus Logico-Philosophicus war er mittels modus mathematicus darum bemüht, die Philosophie von Unsinn und Verwirrung zu bereinigen.

Seine analytische Herangehensweise bestand darin, den komplexen Sachverhalt durch sehr präzise Sätze zu formalisieren. Dabei bediente er sich eines nummerischen Systems, das den jeweiligen Aussagen eine logische Gewichtung mitgeben sollte. Die durch diese Indizierung eingeführte Modularität erlaubt es, einzelne Gedankenkonstrukte samt ihrer Abhängigkeiten nachschlagen und nachvollziehen zu können.

Nun handelt es sich beim Tractatus Logico-Philosophicus Instrumentum Computatorium um ein Projekt, das sich zum Ziel gesetzt hat, philosophische Aspekte zum Thema Informatik und Computersicherheit in gleicher Weise zu axiomatisieren. Auch hier geht es darum alltägliche Aussagen zu präzisieren, um damit die Wahrheit entsprechender Diskussionen herauskristallisieren zu können. Wittgenstein war in erster Linie an der informalen Beweisführung mittels natürlicher Sprache interessiert. In erweiterter Weise soll hier jedoch ebenfalls eine formale Beweisbarkeit der Aussagen mittels Prädikatenlogik der ersten Stufe (First-Order-Logic) angegangen werden.

Das Schaffen am Projekt begann vor vielen Jahren auf Papier. Es stellte einen Teil der Arbeit mit dem Titel “Vom Bit zum Bug” dar. In einem kurz und prägnant verfassten Beitrag sollten die Grundlagen der Informationssicherheit bereitgestellt werden können. Der Tractatus bildet dabei das Grundgerüst des eigentlichen Prosatexts. Ob und inwiefern dieser in Zukunft an die Öffentlichkeit getragen werden will, kann zur gegenwärtigen Stunde nicht gesagt werden.

In ähnlicher Weise wie Wittgenstein mittels der Sprache eben diese untersucht hat, soll an dieser Stelle eine computergestützte Analyse eines Teils der Computerwissenschaften stattfinden. So wird der eigentliche Tractatus in verschiedenen Formen dargestellt. Durch das Markieren einzelner Aussagen lassen sich statistische Merkmale dieser (z.B. Priorität und Abhängigkeiten) ausweisen. Desweiteren ist es gar möglich, ganze Herleitung konstruieren und diese entsprechend im Kontext verstehen zu können. Diese erweiterten Möglichkeiten hätten mit Sicherheit auch Wittgenstein Freude bereitet.

Die hier dokumentierten Sachverhalte erdreisten sich in keinster Weise Anspruch auf Vollständigkeit zu erheben. Mit fortwährender Entwicklung soll sich dieser jedoch genähert werden. Dabei soll die Rücksichtslosigkeit vor der Arbeit anderer, wie sie Wittgenstein bewusst in seinem Vorwort genannt hat (“… weil es mir gleichgültig ist, ob das was ich gedacht habe, vor mir schon ein anderer gedacht hat.”), nur bedingt beibehalten werden. Quellenangaben und historische Bezüge sollen einzelne Postulationen, die auf den ersten Blick sehr gewagt erscheinen mögen (“Sicherheit ist ein Zustand und kein Prozess”), untermauern.

Einführung

Das Ziel des Tractatus ist die Axiomatisierung und Formalisierung zentraler Bereiche der Informationssicherheit. Dazu werden sechs Kapitel eingeführt:

Diese Themen sind, wie viele andere natürlich auch, mit einer schier unübersichtlichen Vielschichtigkeit und Komplexität behaftet. Gerade Einsteiger mühen sich mit dem Facettenreichtum des Genres ab. So wird gerade durch Laien gerne Halbwissen weitergetragen, wodurch Legendenbildungen vorangetrieben und Irrtümer aufrecht erhalten werden.

Aber auch in akademischen Bereichen wird sich gerne der Nachlässigkeit hingegeben, die komplexen Situationen und die zugrundeliegenden Entitäten nicht oder nur teilweise objektiv zu beobachten. Auch da wird oftmals, meistens aus Gründen der Einfachheit, von falschen Annahmen ausgegangen und durch jene ebenso falsche Konklusionen erarbeitet.

Durch die Axiomatisierung und Formalisierung elementarer Zustände der Informationssicherheit sollen diesen Unschönheiten und Ungereimtheiten entgegengewirkt werden. Gerne wird behauptet, dass die angewandte Informatik im Allgemeinen und die Computersicherheit im speziellen keine Wissenschaft darzustellen in der Lage ist. Mit dem Tractatus soll der Versuch unternommen werden, eine einheitliche Basis für eine solche wichtige und richtige Betrachtungsweise darzubieten.

Lesen des Tractatus

Der Tractatus erscheint auf den ersten Blick wie eine simple Ansammlung von Aussagen. Dies ist grundsätzlich nicht verkehrt. Doch bei genauerer Betrachtung wird dem aufmerksamen Leser auffallen, dass in den jeweiligen Aussagen und ihren Verknüpfungen sehr viel Tiefgründigkeit verborgen ist. Ein jedes Wort eines jeden Satzes ist unter strengsten Bedingungen gewählt und damit eine klar greifbare Aussage generiert worden. Zum Beispiel die Begriffe Handlung, Handlungsspielraum und Möglichkeit, vorgestellt und eine klare Aufgabe beigemessen bekommen.

Am einfachsten findet sich der Zugang zum Tractatus in seiner Form als Prosatext. Dort werden die jeweiligen Aussagen in einem leicht lesbaren Artikel zusammengefasst. Wer sich nur bedingt mit dem Thema Informationssicherheit auseinandergesetzt hat und nicht gleich von der Wortgewalt des Schriftstücks erschlagen werden möchte, der kann sich mit der Detailstufe 4 einen guten und knappen Überblick verschaffen. Hierbei werden die technischen Details, die vorwiegend für eine umfassende Beweisführung erforderlich wären, ausgeblendet und sich auf die Kernaussagen konzentriert.

Um sich jedoch den Tractatus in seiner speziellen Form erschliessen zu können, bietet sich die Darstellung als Liste an. In dieser werden die einzelnen Aussagen in sequentieller Weise aufgelistet und ihrer logischen Gewichtung entsprechend dargestellt. Ein jedes Kapitel beginnt mit einer allgemeinen Postulation. Kapitel 1 heisst zum Beispiel “Sicherheit ist ein Zustand”. Die weiterführenden Untersätze gehen auf diese Behauptung ein und versuchen sie zu beweisen. Die Untersätze 1.1 und 1.2 sind also eine Weiterführung des ursprünglichen Satzes 1. Je tiefer in den Wortbaum eingerückt wird, desto detaillierter wird der Beweis und desto mehr nimmt die logische Gewichtung eines Satzes ab. Der Satz 1 (Gewicht: 1) hat also die höchste Gewichtung und der Satz 1.2.3.4.5.6 (Gewicht: 6) zum Beispiel die niedrigste Gewichtung.

Durch das Anklicken eines Satzes kann eine informale Herleitung zu eben diesem generiert werden. Hierbei werden sämtliche Sätze, die zu diesem Untersatz führen, zusammengeführt. In einer reduzierten Aussage wird damit der gewählte Satz besprochen. Will zum Beispiel der Satz 1.1.4 informal bewiesen werden, wird ein Sprachkonstrukt aus den Sätzen 1, 1.1 und 1.1.4 gebildet. Man spricht hierbei davon, dass der Satz 1.1.4 von den Sätzen 1.1 und 1 abhängig ist (genauso ist also auch 1.1 von 1 abhängig).

Formale Beweisführung

Zusätzlich wird sich im Tractatus um eine rein formale Beweisführung mittels Prädikatenlogik bemüht. In der Logik-Darstellung wird eine an die Listenform angelehnte Variante dargeboten. In dieser sind die ursprünglichen Aussagen in logische Konstrukte umgewandelt worden. Der informale Satz “Sicherheit ist ein Zustand” wird damit formal zu “Sicherheit ist ein Element der Menge Zustände” (Sicherheit ∈ Zustand). In gleicher Weise wie bei der Liste können nun die einzelnen Sätze zu formalen Beweisen ausgearbeitet werden. So werden auf den ersten Blick gewagte und widersprüchliche Aussagen, als vollständiges und wohlgeformtes System zugänglich.

Tractatus

Kapitel 1 – Sicherheit ist ein Zustand

Sicherheit ist ein Zustand. Er sieht eine wohldefinierte Anzahl an erlaubten Handlungen vor. Eine Handlung ist eine ausgeführte Tätigkeit. Eine Handlung kann sowohl aktiv (aktionär) als auch passiv (reaktionär) erfolgen. Eine aktive (aktionäre) Handlung ist eine freiwillige Aktion ohne vorausgehenden Reiz. Nur Menschen können freiwillige Aktionen durchführen. (Vielleicht noch nicht mal diese.) Provozierte Reaktionen sind hingegen vorzugsweise durch Computer, Maschinen und Roboter gegeben.

Eine passive (reaktionäre) Handlung ist eine provozierte und unausweichliche Reaktion auf einen vorangegangenen Reiz. Der vorangegangene Reiz kann entweder selber eine aktive oder eine passive Handlung gewesen sein. Ein Reiz lässt sich im Computerbereich am ehesten als Eingabe oder Anfrage (z.B. HTTP Request) beschreiben. Eine Eingabe (Reiz) führt zu einer Datenverarbeitung (Reaktion). Oft wird eine Ausgabe als die eigentliche Reaktion verstanden. In der Regel liegt dabei jedoch eine transparente Verarbeitung dazwischen (Datenannahme und Berechnungen). In der Psychologie wird dies als S-O-R-Paradigma bezeichnet (Robert S. Woodworth, 1929). Auf die HTTP-Anfrage “GET / HTTP/1.0\n\n” wird die Rückgabe für die entsprechende Ressource / generiert. Der Webserver muss eine TCP-Verbindung etablieren (RFC 793). Dabei wird die SYN-Anfrage auf dem Zielport empfangen und eine SYN/ACK-Antwort zurückgeschickt. Sobald der Client den Verbindungsaaufbau mit dem finalen ACK-Segment bestätigt, ist die Kommunikation im Rahmen von TCP etabliert. Über das Anwendungsprotokoll HTTP wird die Anfrage vom Client an den Server geschickt (RFC 1945). Sobald der Webserver die HTTP-Anfrage empfangen hat, wird diese geparst und die Datenteile verarbeitet (z.B. Methode, Ressource, Protokoll, Optionen, …). Wurde eine Ressource angefordert, wird auf diese zugegriffen, sie aufbereitet und im Rahmen von HTTP zurückgeschickt. Der initiale Reiz wurde damit verarbeitet.

Ein Reiz, der eine Antwort generiert, die wiederum ein Reiz ist, der die gleiche Antwort generiert, wird als Loop bezeichnet. Durch Loops lassen sich Ressourcen belegen und damit eine Denial of Service-Attacke (Ping-Pong) umsetzen. Populär sind Routing-Loops, bei denen Pakete im Kreis weitergeleitet werden und deshalb nie die eigentliche Destination erreichen können. Loops, bei denen schlussendlich eine Blockierung des Systems stattfindet, sind eine spezielle Form von Race Conditions. Sie werden Deadlocks oder Livelocks genannt. Bei intelligenten Systemen werden Mechanismen eingesetzt, die Loops und Deadlocks erkennen und auf sie reagieren können. Um Loops im Routing zu verhindern, wird durch IP ein initialer Time-to-Live Wert (TTL) gesetzt. Er wird bei jeder Weiterleitung verringert. Erreicht er den Wert 0, wird das Paket verworfen und eine ICMP-Fehlermeldung generiert (RFC 791). Um Loops in Kommunikationen zu verhindern, werden eindeutige, berechenbare und nachvollziehbare Sequenznummern verwenden (z.B. bei TCP). Um Ping-Pong-Attacken zu verhindern, wird versucht automatische Anfragen als solche zu erkennen und keine automatischen Antworten zu generieren (z.B. Anfragetypen bei ICMP). Bei Betriebssystemen können Scheduler zum Tragen kommen (Mutexe oder Semaphore), um eine Doppelbelegung von Ressourcen zu vermeiden.

Die produktive Sicherheit eines Systems (im Betrieb) wird in erster Linie an der Unterbindung unerwünschter Handlungen gemessen. Eine Möglichkeit ist der Spielraum einer Handlung. Das Ausbleiben jeglicher Möglichkeiten lässt absolute Sicherheit erlangen. Ein System ohne Möglichkeiten erfüllt jedoch keinen Nutzen. Ein produktives System muss mindestens eine Möglichkeit bereitstellen, um einen Nutzen gewähren zu können. Viele Systeme bieten eine Vielzahl an Möglichkeiten. Die Qualität und der Nutzen eines Produkts wird oftmals gar an seinen Möglichkeiten gemessen.

Sind alle unerwünschten Handlungen unterbunden, kann mit grösstmöglicher Wahrscheinlichkeit von einem sicheren Produkt ausgegangen werden. Werden ausschliesslich gewünschte Handlungen und Zugriffe gewährleistet, spricht man vom “need to know” Prinzip. Spätestens das Erlangen einer unerwarteten und unvorhergesehenen Möglichkeit mündet also in reaktionärer (nach Reiz) oder aktionärer (ohne Reiz) Unsicherheit.

Auch eine ursprünglich vorgesehene Möglichkeit kann eine Unsicherheit darstellen. Nur weil eine Möglichkeit vorgesehen ist, heisst es nicht, dass sie sich bei näherer Betrachtung nicht doch als unsicher herausstellt. Bei der Entwicklung eines Systems könnte eine umfassende Fehlermeldung als unkritisch vorgesehen werden. Im Rahmen eines Angriffsversuch könnte sich eine akzeptierte Nichtigkeit als wichtiges Element zur Beweisbarkeit oder Ausnutzung der Unsicherheit herausstellen. Der gewollte Handlungspielraum erfüllt sich damit mit einer indirekten Unsicherheit.

Die gegebene Unsicherheit einer vorgesehenen Möglichkeit hat sich schon bei ihrer Realisation manifestiert und war stetig präsent (im Hintergrund). Eine Unsicherheit generiert sich also nicht erst dann, wenn sie als solche beobachtet werden kann. Wird ein Produkt X im Januar 2000 veröffentlicht und im Januar 2005 eine Schwachstelle darin gefunden, so ist sie im Januar 2006 nicht ein Jahr alt sondern derer gar sechs. Microsoft Windows XP wurde am 25.10.2001 veröffentlicht. Eine schwerwiegende Pufferüberlauf-Schwachstelle im RPC-Dienst wurde am 16.07.2003 publiziert (CVE-2003-0352, VU568148). Das Problem war also mindestens 629 Tage (vielleicht schon länger während der Entwicklungsphase) existent. Der US-amerikanische Sicherheitsspezialist Dan Kaminsky entdeckte eine generische DNS-Attacke, welche versehentlich frühzeitig am 21. Juli 2008 veröffentlicht wurde (CVE-2008-1447). Die betroffenen Hersteller wurden jedoch frühzeitig informiert und reagierten bis am 08. Juli 2008 mit Patches (VU800113). Der designtechnische Fehler war aber seit der ersten Implementierung eines Nameservers im Jahr 1983 existent (RFC 882, 883). Damit war das Problem rund 25 Jahre gegeben. Das Problem von TCP SYN Flooding Attacks wurde ab 1996 wahrgenommen und im 2007 in einem eigenen RFC behandelt (RFC 4987). Dabei wird eine generische Eigenschaft von TCP ausgenutzt. Diese war schon immer, seit der ersten Spezifizierung des Protokolls im Jahr 1974, gegeben (RFC 675). Und ohne eine konzeptionelle und architektonische Änderung des Protokolls wird sie auch weiterhin bestehen bleiben.

Kapitel 2 – Unsicherheit gewährt eine nicht zugelassene Handlung

Unsicherheit gewährt eine nicht zugelassene Handlung. Unsicherheit sowie Sicherheit existieren auf theoretischer (ℑ) und auf praktischer (ℜ) Ebene. Eine (praktische) Unsicherheit lässt sich stets theoretisch erfassen. Theoretische Unsicherheit erfordert, dass in erster Linie ausserhalb der Praxis eine nicht zugelassene Handlung möglich ist. Praktische Unsicherheit erfordert, dass auch in der Praxis die nicht zugelassene Handlung umgesetzt werden kann. Praktische Unsicherheit lässt sich theoretisch erfassen. Theoretische Unsicherheit manifestiert sich hingegen nicht zwangsweise in der Praxis. Nur die praktische Unsicherheit (theoretisch bewiesen oder praktisch ermittelt) gibt Aufschluss über die produktive Sicherheit des Systems. Die produktive Unsicherheit eines Systems wird ihm frühstmöglich bei der Umsetzung/Aktivierung dessen anhaften. Die produktive Unsicherheit verschwindet gänzlich spätestens dann, wenn das System komplett deaktiviert wird.

Der maximale Aufwand des Erkennens der Sicherheit eines Systems erfordert das Erkennen und Bewerten sämtlicher möglichen Zustände dessen. Der Aufwand einer solchen Erfassung ist immer grösser als Null, da es mindestens immer einen Zustand (die Existenz als solche) gibt. Ein System bestehend aus einem Bit, welches zwei Zustände 0 und 1 annehmen kann, muss für diese beiden Zustände [1]b = {0, 1} geprüft werden. Ein System mit zwei Bit weist schon 4=2^2 Zustände der Form [2]b = {00, 01, 10, 11} auf. Bei drei Bit sind es 8=2^3, usf. Der Aufwand der Prüfung eines Systems mit gleichem poliadischem Zahlensystem steigt mit der Zunahme jeder Zustandsstelle exponentiell an. Ein System mit n Bit kennt 2^n Zustände.

Je komplexer ein System ist, desto mehr Zustände lässt es zu. Es sei davon auszugehen, dass unser Universum endlich ist. Die Endlichkeit des Universums sieht vor, dass es ebenso eine endliche Anzahl an Zuständen in diesem gibt. Da wir sowie die zu prüfenden Systeme ein Teil dieses endlichen Universums sind, kennen also auch wir lediglich eine endliche Anzahl an Zuständen. Ein Computersystem kann aufgrund der Endlichkeit unseres Universums niemals eine unendliche Anzahl an Zuständen und damit eine unendliche Komplexität der Form x^∞ (infinity) aufweisen. Die Prüfung eines Systems ist aufgrund seiner Endlichkeit ebenso mit endlichen Aufwänden durchführbar.

Je mehr Zustände ein System zulässt, desto aufwendiger wird die Prüfung eben dieses. Auch der einzelne Zustand kann unterschiedliche Komplexitäten mitbringen. Der Zustand 0 ist weniger schwierig zu überblicken weder der Zustand 010011. Es ist anzunehmen, dass die beiden Zustände 010011 und 001010 in Bezug auf ihre eigene Komplexität gleichwertig sind.

Das Durchführen einer absoluten Prüfung aller möglicher Zustände ist bei heutigen Computersystemen aufgrund der vielfältigen und umfassenden Ressourcen (CPU, Festplatte, RAM, …) wohl nie wirtschaftlich rechtfertigbar. Aus diesem Grund wird gerne davon gesprochen, dass es nie 100 %ige Sicherheit gibt. Richtig muss es aufgrund dessen heissen, “dass sich 100 %ige Sicherheit in der Praxis in der Regel wirtschaftlich nicht beweisen (oder erreichen) lässt”. Statistisch gesehen vermag es durchaus in der absoluten Mehrheit der Fälle (~99,9 %) gegeben sein, dass Sicherheit weder vorhanden noch beweisbar ist.

Eine Gefahr generiert sich dadurch, dass die gegebene Unsicherheit auch ausgenutzt werden wird. Dies wird als Risiko bezeichnet. Das Ausnutzen einer Unsicherheit kann verschiedene Motive haben. Es wird in der Gegenwart und Zukunft immer jemanden geben, der mit einem entsprechenden Motiv daherkommen wird. In populistischen Diskussionen wird fälschlicherweise gerne angenommen, dass Geldgier das zentrale Motiv der meisten Übergriffe darstellt. Spieltrieb und Neugierde sind wohl die wichtigsten Motive vieler Errungenschaften, auch im Bereich der Computersichersicherheit. Es zeichnet sich der Trend ab, dass die meisten effektiv ausgenutzten Unsicherheiten aus Gründen des Gelds angegangen werden.

Je einfacher ein Handlungsspielraum ist, desto eher werden sich Leute in diesem bewegen wollen. Deshalb werden statistisch und längerfristig auch mehr in diesem agieren. Die Einfachheit einer Umgebung führt zu mehr Akzeptanz. Die Popularität vieler Produkte ist auf ihre Einfachheit zurückzuführen. Neben Funktionalität ist Ergonomie längerfristig die treibende Kraft für den Verkauf von Produkten. Microsoft konnte ihre Windows-Plattform mitunter wegen der damals herausragenden Einfachheit der Bedienung etablieren. Apple konnte ihre Produkte (z.B. iPod und iPhone) als Stilmittel etablieren und damit eine ungeahnte Akzeptanz für sich gewinnen.

Mit einem Mehr an Akzeptanz für eine Umgebung wird automatisch ein Mehr an potentiellen Angreifern erschlossen. Wer in einer Umgebung agieren kann, ist ein potentieller Angreifer. Unpopuläre Betriebssysteme und Applikationen sehen sich mit einer geringen Anzahl an interessierten Angreifern konfrontiert. Nur weil für ein Produkt wenige Schwachstellen publiziert wurden, heisst dies nicht, dass es auch wenige Schwachstellen in diesem gibt. Ebenso könnte es sein, dass sich halt nur wenige auf die Suche nach diesen gemacht haben.

Je wertvoller die erreichbaren Möglichkeiten sind, desto eher werden sich die Leute diesen nähern wollen. Der Wert einer Möglichkeit ist nur bedingt objektiv. Die Existenz ihrer wird sich noch am ehesten objektiv mit dem dualen Zustand {gegeben, nicht gegeben} bestimmen lassen. Spätestens bei der Quantisierung wird es schwierig, einen Konsens zu finden.

Wohl in den meisten Fällen ist der absolute Wert vollumfänglich subjektiv definiert. Eine Information A kann für eine Person X sehr wertvoll sein. Für Person Y ist sie es hingegen nicht. Das Stehlen von Ressourcen (z.B. CPU-Leistung) kann für einen Schüler sehr wertvoll sein. Für einen Mathematiker mit freiem Zugang ins akademische Rechenzentrum jedoch eher weniger. Die Möglichkeit des Abbuchens von sFr. 10’000.- kann für Person Y sehr viel sein. Für Person X jedoch nicht (da sie sowieso mehr Geld besitzt oder sich weniger für dieses begeistern kann).

Das potentielle Risiko orientiert sich an der Qualität und Quantität der drohenden Gefahr. Die Qualität der Gefahr ist durch ihre Mächtigkeit definiert. Diese ist aus den verfügbaren Ressourcen (Zeit und Wissen) beschaffen. Zeit ohne Wissen ist genauso unbrauchbar wie Wissen ohne Zeit. Wissen und Zeit kann man sich in beschränktem Masse “erkaufen”. Es wird sich meistens jemanden finden lassen, der etwas kann sowie machen will und auch die Zeit dafür hat.

Die Quantität der Gefahr ist durch die Anzahl potentieller Angreifer definiert. Ein jeder Mensch gilt im weitesten Sinn theoretisch als potentieller Angreifer. Die Anzahl der effektiven potentiellen Angreifer kann nie die Anzahl der existierenden Nutzer (potentiell agierende Entitäten eines Systems) übersteigen. Die Anzahl der effektiven Angreifer kann nicht ermittelt werden, bevor sie nicht einen Angriffsversuch unternommen haben.

Kapitel 3 – Eine unzulässige Handlung ist ein Angriff

Eine unzulässige Handlung ist ein Angriff. Ein Angriffsversuch ist die Grundlage eines erfolgreichen Angriffs. Ein Angriffsversuch erfordert die Möglichkeit mindestens einer Handlung. Ein Angriffsversuch, der mit ausschliesslich einer Handlung initiiert wird, wird als One-Shot bezeichnet. Ein misslungener One-Shot Angriff sagt lediglich etwas über die Sicherheit bezüglich des spezifischen Angriffsversuchs aus.

Je mehr Angriffsversuche durchgeführt werden können, desto eher lässt sich die Qualität des Angriffs optimieren. Mittels Iteration wird zum perfekten Angriff konvergiert. Es gibt immer mindestens einen perfekten Angriff. Ein Angriff ist dann perfekt, wenn er ausschliesslich und unmittelbar das ihm vorgegebene Ziel erreicht. Zwei Angriffsvarianten zur Ausnutzung einer Schwachstelle können bezüglich ihres Perfektionismus gleichwertig sein.

Intelligente Systeme versuchen Angriffsversuche frühzeitig zu erkennen und weitere Zugriffe zu unterbinden. Für die Erkennung von Angriffsversuchen ist traditionell ein Intrusion Detection-System (IDS) zuständig. Das Erkennen von Angriffsversuchen kann durch verschiedene Mechanismen erreicht werden. Bei einem pattern-basierten Ansatz werden typische Muster von Angriffen gesucht (z.B. Vielzahl an fehlgeschlagenen Authentisierungsversuchen indizieren eine Bruteforce-Attacke). Das Erkennen von Angriffsmustern erfordert, dass diese bekannt und eindeutig identifizierbar sein müssen. Um die Nachteile der pattern-basierten Lösung auszumerzen, wird eine Anomaly Detection angestrebt. Bei dieser werden Abweichungen vom üblichen Verhalten als Angriffsversuche verstanden.

Für das Unterbinden von weiteren Angriffsversuchen ist in der Regel ein Intrusion Prevention-System (IPS) verwendet. Im weitesten Sinn kann auch ein restriktives Firewall-Element als Intrusion Prevention-System verstanden werden. Ebenso ist irgendwodurch eine Antiviren-Lösung, die den Zugriff auf infizierte Objekte unterbindet, eine Intrusion Prevention-Lösung.

Ein Intrusion Prevention-System kann entweder durch Unterbinden von Kommunikationsübertragungen oder Unterbinden von Kommunikationsmöglichkeiten funktionieren. Durch das Unterbinden von Kommunikationsübertragungen wird der Datenaustausch zwischen Angreifer und Opfer verhindert. Durch das Unterbinden von Kommunikationsübertragungen wird mit dem Angreifer derartig umgegangen, dass er nicht mehr wie gewünscht agieren kann. Das Unterbinden von Kommunikationsübertragungen durch den Angreifer erfolgt durch einen Gegenangriff. Ein Gegenangriff durch ein Sicherheitssystem wird als Strike-Back Verfahren bezeichnet. Ein jeder automatische Mechanismus zur Veränderung von Nutzungsmöglichkeiten kann missbraucht werden. Automatische Filter-Listen oder Strike-Back Verfahren lassen sich oftmals für Denial of Service-Zwecke einspannen.

Ein erfolgreicher Angriff erfordert die Möglichkeit einer erfolgreichen Handlung ausserhalb des vorgesehenen Handlungsspielraums. Er beweist die praktische Unsicherheit des Systems im gegenwärtigen Zustand. Ist nach dem Durchspielen aller erdenklichen Angriffsversuche kein erfolgreicher Angriff erreicht, kann das System punktuell (bezüglich der Angriffstechnik und des Angriffszeitpunkts) als sicher eingestuft werden.

Ein erfolgreicher Angriff kann zu einem späteren Zeitpunkt in gleicher Weise wiederholt werden. In manchen Fällen ist dies aber nicht möglich. Nur weil sich ein Angriff zu einem späteren Zeitpunkt nicht mehr wiederholen lässt, heisst dies nicht, dass eben diese Unsicherheit nicht bestand, nicht mehr besteht oder nicht mehr bestehen wird. Sicherheit ist und bleibt ein Zustand, der sofort wieder verfallen kann. Die Sicherheit verfällt unter Umständen dann, wenn sich etwas am System ändert. Ein geprüftes und als sicher identifiziertes System, sollte nach einer Änderung einer erneuten Prüfung unterzogen werden. Eine erneute Prüfung eines Systems nach einer Änderung wird als Re-Check bezeichnet. Eine erneute Prüfung eines Systems nach einer Änderung erfordert im Idealfall nur die Prüfung der veränderten und tangierten Elemente. Man spricht in diesem Fall von einer Delta-Analyse.

Die Sicherheit kann aber auch erst dann verfallen, wenn mit dem System interagiert wird (Faktor Mensch). Eine umfassende Sicherheitsüberprüfung untersucht also auch die Möglichkeiten des effektiven Betriebs. Eine umfassende Sicherheitsüberprüfung im laufenden Betrieb wird als Live-Test bezeichnet.

Sicherheit muss als fortwährenden Prozess verstanden werden. Dieser erdachte Prozess versucht einzelne Zustände der erreichten Sicherheit aneinanderzureihen. Die Aussage “Sicherheit ist ein Prozess” (Bruce Schneier, Crypto-Gram Newsletter, May 15, 2000) müsste also korrekterweise “Beständige Sicherheit ist ein Prozess” lauten. Nicht jeder Prozess schafft automatisch die gewünschte und erforderliche Sicherheit. Ein Prozess hat aufgrund des individuellen Handlungsspielraums und der individuellen Unsicherheit ebenso in individueller Weise zu erfolgen. Es gibt keinen allgemeingültigen Prozess.

Dadurch wird der Schein der stetigen Sicherheit erschaffen und gewahrt.

Eine geringe Änderung im System kann dazu führen, dass ein Angriff nicht mehr erfolgreich sein kann. Zur Erhöhung der Sicherheit müssen Massnahmen ergriffen werden, die den Handlungsspielraum derartig anpassen, dass kein erfolgreicher Angriff mehr erfolgen kann. Ist eine Massnahme erfolgreich, wird sie als Gegenmassnahme (Gegen die Unsicherheit) bezeichnet. Eine Massnahme kann auf unterschiedlichen Ebenen angesetzt werden. Die offensichtliche Lösung besteht in der Anpassung der betroffenen Komponente selbst. Dies kann ein System, eine Applikation, ein Modul, eine Codeblock oder ein Funktionsaufruf sein. Das Problem wird hierbei “an der Wurzel gepackt”. Im Rahmen der vielschichtigen Sicherheit (Layered Security) können komplementäre Lösungen aber auch auf anderen Komponenten (Routing, Firewall, vertragliche Anpassung, …) umgesetzt werden. Wo eine Massnahme umgesetzt wird, ist in Bezug auf das Verhindern der Unsicherheit sekundär. Bevorzugt sollte aber die zentrale Herangehensweise sein, um Kompetenzüberschneidungen, Missverständnisse und Lücken zu verhindern.

Eine effektive Massnahme bringt lediglich solche Änderungen ein, die die Möglichkeiten des Angriffs verändern. Nicht jedoch die Möglichkeiten der erlaubten Handlungen. Die geringste Veränderung, die von einer Unsicherheit zur Sicherheit führt, gilt als die effizienteste Massnahme. Sie wird auch als minimales Delta (mindel) bezeichnet. Das gänzliche Eliminieren eines Handlungsspielraums zur Behebung einer Unsicherheit ist am effektivsten, da ebenfalls sämtliche Varianten adressiert werden. Eine Veränderung, die den Angriff in seiner Form verändert, ihn jedoch nicht verhindert, ist nicht als (umfassende) Gegenmassnahme zu verstehen.

Das Erhöhen der Kompliziertheit bzw. Komplexität eines Systems kann als Massnahme verstanden werden. Das Erweitern der Kompliziertheit eines Systems zur Erhöhung der Sicherheit wird abwertend als “Security By Obscurity” bezeichnet. Das Erhöhen der Kompliziertheit einer Lösung lässt im besten Fall einen erfolgreichen Angriff verhindern, sofern der Angreifer an der Kompliziertheit unmittelbar scheitert. Das Erhöhen der Kompliziertheit einer Lösung lässt jedoch im schlechtesten Fall einen Angriff nur verzögern, wenn der Angreifer in der Lage ist, irgendwann mit dieser umzugehen. Nur weil einem etwas komplex oder kompliziert erscheint, heisst es nicht, dass es (für andere) komplex oder kompliziert ist. Echte langfristige Sicherheit kann nicht mit der Erhöhung der Kompliziertheit erreicht werden, wie Auguste Kerckhoffs in seinem Kerckhoffs’schen Prinzip bewiesen hat: “Il faut qu’il n’exigé pas le secret, et qu’il puisse sans inconvénient tomber entre les mains de l’ennemi”. (“La cryptographie militaire”, 1883, S. 12) Mit dem Erhöhen der Kompliziertheit wird in überproportionaler Weise das Risiko für Fehler verdichtet. Längerfristig wird damit also die Sicherheit verringert. Der vermeintliche Vorteil wird damit zum latenten Nachteil. (Avishai Wool, “A quantitative study of firewall configuration errors”, 2004) Unabsichtlich eingeführte Kompliziertheit gründet sich oftmals darin, überhastet ein unmittelbares Problem lösen zu wollen. Damit verbaut man sich langfristig Möglichkeiten. Das Entgegenwirken von Kompliziertheit zur Verhinderung von Fehlern wird umgangssprachlich mit dem an das KISS-Prinzip und Ockhams Rasiermesser angelehnten Spruch “Keep it simple and secure” zusammengefasst. (Johannes Clauberg, 1654)

Es gibt Situationen, in denen soll oder kann die Sicherheit durch Massnahmen nicht erhöht werden. Eine exakte Risikokalkulation hilft zu erkennen, ob und inwiefern das Akzeptieren eines Risikos die richtige Entscheidung ist. Eine umfassende Gegenmassnahme adressiert ebenfalls die Varianten eines Angriffs. Die Variante eines Angriffs nimmt eine Kardinaleigenschaft dessen und führt diesen mit anderen Optionen durch. Eine Risikokalkulation orientiert sich an der Wirtschaftlichkeit der Möglichkeiten. Die Wirtschaftlichkeit einer Risikokalkulation kennt nur sich selbst als Antrieb. Auf Schönheit und Eleganz wird verzichtet. Ein Angriff ohne Eigenschaften gibt es nicht. Eine Handlung ist die Summe ihrer Eigenschaften. Besteht ein Angriff aus lediglich einer Eigenschaft und wird diese als Variante verändert, entsteht jedoch ein komplett neuer Angriff und keine eigentliche Variante. Schlussendlich sind alle Angriffe miteinander verwandt (ähnliche Varianten/Eigenschaften).

Handelt es sich um die richtige Entscheidung auf eine technische Massnahme zu verzichten, wird das Risiko als gegeben akzeptiert. Tritt ein Ereignis ein, bei dem das Risiko akzeptiert wurde, und stellt sich die Tragweite des Angriffs grösser dar als erwartet, war die erste Kalkulation nicht korrekt. Eine als falsch erwiesene Risikokalkulation ist unter gewissen Umständen unbrauchbar, da das Risiko nicht wie gewünscht getragen wird. Eine fehlerhafte Risikokalkulation ist spätestens dann als unbrauchbar anzusehen, wenn durch sie die falschen Entscheidungen getroffen wurden. Sie muss in diesem Fall neu berechnet werden.

Kapitel 4 – Unsicherheiten und Angriffe sind unter sich nicht gleichwertig

Unsicherheiten und Angriffe sind unter sich nicht gleichwertig. Die Qualität einer Unsicherheit ist von der erforderlichen Effizienz und Eleganz, die für einen erfolgreichen Angriff unabdingbar ist, abhängig. Die Qualität einer Unsicherheit hat in einem gewissen Rahmen Einfluss auf die Qualität eines Angriffs. Die Qualität einer Unsicherheit ist umso grösser, je mehr Handlungspielraum sie ungewollt zur Verfügung stellen kann. Die Einstufung einer Unsicherheit muss objektiv erfolgen. Leider ist das Erstellen eines metrischen Systems in höchstem Mass einer Subjektivität unterworfen. Es gibt verschiedene metrische Systeme zur Bewertung von Unsicherheiten. Ein Metrisches System kann eine Skala von 1 bis 100 aufweisen. Alternativ kann es vier Abstufungen Low (L), Medium (M), High (H) und Emergency (E) haben. Das Common Vulnerability Scoring System (CVSS) hat sich als einheitliches System zur Ausweisung von Wichtigkeit und Priorität von Schwachstellen etabliert (http://www.first.org/cvss/). Es verwendet sechs unterschiedliche Basis Metriken, die ihrerseits individuelle Abstufungen mitbringen. Nessus, der bekannte und ehemals quelloffene Vulnerability Scanner, verwendet die sechs Risikoabstufungen None, Low, Medium, High, Serious und Critical.

Je mehr Stufen eine Skala zulässt, desto genauer lassen sich Fehler klassifizieren. Je genauer sich ein Fehler klassifizieren lässt, desto schwieriger und aufwendiger wird dieser Prozess.

Eine Unsicherheit kann in den Phasen der Risikoanalyse und Risikobewertung nach verschiedenen Gesichtspunkten klassifiziert werden. Typischerweise wird das Risiko (risk) einer Unsicherheit eruiert. Alternativ wird der Schweregrad (severity) einer Unsicherheit eruiert. Granulare Bewertungen berücksichtigen Eigenschaften wie Eintrittswahrscheinlichkeit (frequency), Schadensauswirkung (impact), Einfachheit (simplicity) und Popularität (popularity) einer Unsicherheit.

Eine Unsicherheit A kann als Grundlage für eine Unsicherheit B dienen. Die Grundlage A kann dabei eine niedrige oder gleichwertige Einstufung wie die weiterführende Unsicherheit B haben. Beispiel für eine niedrige Voraussetzung und eine mittlere Konsequenz: (1) Ein System ist über das Internet erreichbar. (2) Das Betriebssystem kann mittels TCP/IP-Fingerprinting identifiziert werden. Beispiel für eine mittlere Voraussetzung und eine mittlere Konsequenz: (1) Ein Dienst wird mit dem Klartextprotokoll HTTP bereitgestellt. (2) Über diesen Dienst werden kundenspezifische Daten übertragen.

Es ist jedoch nicht möglich, dass eine Grundlage A höher eingestuft wird, weder die weiterführende Unsicherheit B. Ebenso ist es nicht möglich, dass in symmetrischer und zeitgleicher Weise sowohl die Unsicherheit A die Grundlage für Unsicherheit B als auch die Unsicherheit B die Grundlage für Unsicherheit A ist.

Die Qualität eines Angriffs kann, unabhängig vom charakteristischen Erfolg dessen, unterschiedlich ausfallen. Ein Angriff gilt als effizient, wenn er mit einem Minimum an Bewegung im auferlegten Handlungsspielraum durchgeführt werden kann. Ein Angriff gilt als elegant, wenn er den auferlegten Handlungspielraum in unerwarteter und kreativer Weise nutzt. Die Definition von Kreativität ist vom gegebenen Handlungsspielraum abhängig. Je grösser der Handlungsspielraum ist, desto mehr Möglichkeiten gibt es für Komplexität, nicht jedoch automatisch ebenso für Kreativität. Kreativität ist verbrauchbar. Ein erfolgreicher und bekannter Angriff mit einem gewissen Mass an Kreativität verliert mit zunehmender Durchführung eben diese. Ein erstmalig ausgeführter Angriff wird als 0-Day (Zero-Day) bezeichnet. Ein Angriff in seiner gegebenen Form kann keine Kreativität gewinnen ], sondern diese nur erstellen [*] oder wahren [=]. Erst Varianten und Weiterführungen können weitere Kreativität wieder bzw. weiter aufbauen [.

Ein fortwährend erfolgreich durchführbarer Angriff hat in seiner Rohform keine Kreativität mehr. Subkulturell gesehen werden Angriffe ohne Kreativität nicht mehr als “Hack” verstanden. Angriffe ohne Kreativität werden vorzugsweise durch Skriptkiddies durchgeführt. Die Möglichkeit der fortwährenden Ausführbarkeit eines Angriffs bildet die Grundlage für das systematische Automatisieren dessen. Das unmittelbare automatische Ausnutzen einer Schwachstelle wird durch einen dedizierten Exploit erreicht. Das breitflächige Ausnutzen einer Schwachstelle kann durch einen automatisierten Wurm vorangetrieben werden. Das automatische Prüfen einer Schwachstelle wird durch die Integration des Angriffsverfahrens in einen Vulnerability Scanner erreicht.

Ein Angriff gilt als einfach, wenn für die erfolgreiche Durchführung ein Minimum an Effizienz und Eleganz erforderlich ist. Eine grosse Unsicherheit erfordert lediglich einen kleinen Angriff. Die kleinste Unsicherheit erfordert hingegen den effektivsten Angriff.

Das Messen der Qualität eines Angriffs an der Qualität des Angreifers ist subjektiv und damit minderwertig. Es lassen sich vier unterschiedliche Angreifertypen definieren. Der Angreifertyp mit dem niedrigsten technischen Verständnis ist der normale Endanwender (User). Jeder Mensch ist mindestens zu Beginn seines Herangehens an Technologien ein normaler Endanwender. Die Altersstruktur von Endanwendern ist nicht klar definierbar. Dies kann sowohl ein Jungendlicher sein, der sein erstes Mobiltelefon bekommen hat. Oder eine erwachsene Person, die seit jeher alltägliche Dinge mit dem Computer macht (z.B. Emails lesen und Briefe schreiben).

Interessiert sich ein Endanwender ein bisschen für Sicherheit und versucht er mit Tools und Exploits zu hantieren, spricht man von einem Skriptkiddie (SK). (Eric S. Raymond, The New Hacker’s Dictionary. 1996, ISBN 0-262-68092-0) Skriptkiddies haben ihren Namen daher, weil sie vordefinierte Angriffsmuster befolgen (Skripte), ohne diese zu verstehen. Ein Skriptliddie ist nicht in der Lage, bekannte Angriffsstrategien der Situation anzupassen oder eigene Angriffstechniken zu entwickeln. Das typische Alter von Skriptkiddies ist zwischen 16 und 25 Jahren angesiedelt. Die Hauptmotivationen für Skriptkiddies sind in der Regel Geltungsdrang oder kindliche Neugierde. Skriptkiddies sind, wohl in erster Linie wegen ihrer typischen Motivation, zu einem hohen Anteil männlich.

Das intensive Auseinandersetzen mit einem spezifischen Fachgebiet führt zu einem semi-professionellen Fachspezialisten. Fachspezialisten tendieren dazu, eher einzelgängerisch und sozial zurückgezogen zu leben. Fachspezialisten sind normalerweise junge Erwachsene im Alter zwischen 20 und 35 Jahren. Fachspezialisten stammen aus bzw. finden sich in erster Linie im universitären Umfeld (Studenten). Eine jede Person kann in einem Bereich ein Fachspezialist sein (z.B. Telefonie) und zeitgleich in einem anderen ein normaler Endanwender (z.B. Betriebssysteme).

Das grösste technische Verständnis erlangen professionelle Angreifer. Professionelle Angreifer verdienen hauptberuflich oder nebenher Geld mit ihrer Tätigkeit. Professionelle Angreifer arbeiten hauptsächlich als Security Consultants (Marktwirtschaft), für Nachrichtendienste oder die organisierte Kriminalität. Ein professioneller Angreifer, der regulär als Security Consultant arbeitet und deshalb keine bösartigen Ziele verfolgt, wird als White Hat bezeichnet. Ein professioneller Angreifer, der in krimineller Weise vorgeht, wird als Black Hat bezeichnet. Fachspezialisten arbeiten typischerweise als Administratoren oder Programmierer. In der Regel sehen sich nur professionelle Angreifer in der Lage, Angriffe in systematischer und wirtschaftlicher Weise anzugehen. Professionelle Angreifer sind die einzigen, die sich in der Lage sehen, immerwährend bekannte Angriffsstrategien den aktuellen Bedürfnissen anzupassen oder neue Angriffstechniken zu entwickeln.

Ein kleiner Angriff eines professionellen Angreifers kann nämlich ein grosser Angriff eines unbedarften Skriptkiddies darstellen. Die Vergleichbarkeit der Qualität von Angriffen auf einzelne Unsicherheiten erfordert eine objektive Messung in Relation zur tangierten Unsicherheit als solche.

Kapitel 5 – Eine Programmcode mit unerwünschten Nebeneffekten gilt als korrupter Programmcode

Eine Programmcode mit unerwünschten Nebeneffekten gilt als korrupter Programmcode. Ein korrupter Programmcode ist nur dann korrupt, wenn er unerwünscht ist. Jeglicher andere Code ist bis zu dieser Definition entweder legitim oder unnötig. Programmcode ist dann legitim, wenn er eine Arbeit ausführt, die ausgeführt werden will und soll. Programmcode ist dann unnötig, wenn er Arbeit ausführt, die nicht ausgeführt werden muss oder müsste. Unnötiger Programmcode ist für die Ineffizienz von Anwendungen und Computersystemen verantwortlich. Ein Computersystem ist umso ineffiizenter, desto mehr unnötiger Programmcode ausgeführt wird. In gewissem Sinne ist also auch eine NOP-Anweisung ineffizient. Es sei denn, sie wird für eine höhere Aufgabe (z.B. Synchronisation von Threads) genutzt. Wie zum Beispiel ein Leerlaufprozess (Idle Task).

Um einen korrupten Programmcode als solchen erkennen zu können, muss man sich seiner Nützlichkeit/Erwünschtheit bewusst werden.

Es gibt verschiedene Arten korrupten Programmcodes. Die populärste Form korrupten Programmcodes sind Computerviren. Computerviren waren zu Zeiten des Computer-/Internet-Booms am meisten verbreitet, sind aufgrund dessen am meisten diskutiert und auch von der breiten Öffentlichkeit am ehesten verstanden. Die kleinste Definition eines Computervirus lautet, dass es sich dabei um sich selber reproduzierenden Programmcode handelt. Die offensichtlichste und einfachste Replikation liegt im Anlegen einer Kopie. Ein Computervirus, der sich selbst in den Programmcode anderer Dateien kopiert und die Original-Datei damit (teilweise) überschreibt, wird als Overwriting-Virus bezeichnet. Ein Computervirus, der sich selbst an den Programmcode einer bestehenden Datei anhängt, wird als Appending-Virus bezeichnet. Ein Computervirus kann auch alternative Bereiche eines Computers als Brutstätte gebrauchen (z.B. RAM als TSR-Virus oder Bootsektor als Bootsektor-Virus).

Die Schadensroutine eines Computervirus ist optional und nicht als Kardinaleigenschaft eines solchen anzusehen. Es gibt bewusste dedizierte Schadensroutinen, die Daten manipulieren oder löschen können. Je nach Definition und Umsetzung kann aber auch die Reproduktion des Virus selbst als Schadensroutine verstanden werden (Ressourcen verbrauchen: Speicherplatz und CPU-Zeit). Nach dieser Definition ist also jeder Computervirus schädlich. Die Schadensroutine ist massgeblich für die Risikoeinstufung und Popularität vieler Viren verantwortlich.

Fast so populär wie Computerviren sind Trojanische Pferde. Trojanische Pferde werden im Volksmund auch als Trojaner bezeichnet. Trojanische Pferd gehören einer gänzlich anderen Familie korrupten Programmcodes an. Es ist nicht selbst um eine Reproduzierung von sich selbst bemüht. Ein Trojanisches Pferd führt im Hintergrund ohne das Wissen oder Einwilligen des Anwenders Operationen durch. Ein Trojanisches Pferd, welches Tastatureingaben aufzeichnet, wird als Keylogger bezeichnet. Moderne Trojanische Pferde fungieren als Remote-Control-Utilities und erlauben damit die Fernsteuerung eines kompromittierten Systems (z.B. NetBus oder BackOrifice).

Ein Trojanisches Pferd kann aber auch zu rein zerstörerischen Zwecken eingesetzt werden. In klassischer Hinsicht werden ANSI-Bomben erstellt, um bei einer speziellen Tastatureingabe eine destruktive Aktion durchzuführen (z.B. Löschen von Dateien). Es gibt Remote-Control-Utilities, mit denen sich Distributed Denial of Service-Attacken orchestrieren lassen (z.B. TFN und Trin00).

Im weitesten Sinne lässt sich auch ein Exploit als korrupten Programmcode bezeichnen. Ein Exploit ist eine Anleitung oder eine Software, die das Ausnutzen einer Schwachstelle erleichtert oder automatisiert. Im weitesten Sinn ist also auch ein Advisory als Exploit (Anleitung) zu verstehen. Ein Advisory ist eine Meldung, die einen Fehler skizziert. Sie wurden früher auch Bulletin genannt. Advisories können sowohl vom Finder einer Schwachstelle als auch vom Unternehmen, dessen Software betroffen ist, herausgegeben werden. Als effiziente und freundliche Lösung wird empfunden, dass der Finder den Entwickler zuerst über das Problem informiert und ihm einige Tage/Wochen Zeit einräumt, sich dessen anzunehmen (z.B. Patch oder Upgrade). Nach der Herausgabe einer Lösung wird sodann ein Advisory veröffentlicht. Dies wird als Disclosure bezeichnet. Advisories werden in der Regel über Security-Mailinglisten (z.B. Bugtraq oder Full-Disclosure) publiziert und durch Nachrichtenportale (z.B. Heise) weiterverbreitet. In Verwundbarkeitsdatenbanken (z.B. http://www.securityfocus.com/bid und http://www.scip.ch/cgi-bin/smss/showadvf.pl) werden bisher veröffentlichte Fehler katalogisiert und damit für Recherchen zugänglich.

Exploits lassen sich sowohl für bösartige als auch für gutartige Zwecke einsetzen. Exploits helfen dabei, Schwachstellen systematisch auszunutzen. Dadurch wird in Sicherheitsüberprüfungen effizient ihre Existenz bewiesen sowie ihre Tragweite determiniert. Das pauschale Verbieten von Exploits verhindert, dass Penetration Tester effizient und zuverlässig Sicherheitslücken analysieren können. Gegen sogenannte Hackerparagrafen (z.B. StGB § 202c in Deutschland), die Exploits verbieten wollen, wird damit argumentiert, dass die Professionalisierung von Sicherheitsüberprüfungen verhindert wird. Exploits sollten nicht pauschal verboten werden. Ein ethischer Kodex sowie klar definierte Kommunikationswege können jedoch dabei helfen, dass auch Entwickler, Administratoren und Nutzer von vermeintlich bösartiger Software profitieren können.

Will ein Anwender einen Exploit nutzen, ist er für ihn selbst nicht als korrupter Programmcode zu verstehen. Jedoch gegenüber dem System, welches damit angegriffen wird.

Korrupter Programmcode lässt sich unter gewissen Umständen als solchen erkennen. Viele Antiviren-Lösungen benutzen eine patternbasierte Methode, um typische Zeichen bekannter Schädlinge zu entdecken. Dies setzt voraus, dass der Schädling und seine Struktur bekannt sind, analysiert und in der Pattern-Datenbank vermerkt wurden. Ein Pattern kann also immer nur nach der Entwicklung eines korrupten Programmcodes erstellt werden. Durch diese naturbedingte Latenz handelt es sich hier zwangsweise um ein reaktionäres Verfahren. Das Umsetzen von präventiven Patterns ist zwar theoretisch möglich, in der Praxis jedoch nicht anwendbar, da man nicht im Vornherein wissen kann, welche Struktur neue Schädlinge aufweisen werden.

Starre Pattern-Mechanismen sehen sich ausser Stand, Varianten von korruptem Programmcode ebenfalls als solchen zu erkennen. Hersteller von Antiviren-Lösungen pflegen Varianten von korruptem Programmcode mit Buchstaben-Codes zu nummerieren (z.B. W32.Troj.a, W32.Troj.b, …). Polymorpher Programmcode ist explizit darum bemüht, sein Auftreten (jedoch nicht zwingend auch sein Verhalten) bei unterschiedlichen Ausführungen zu ändern, um einem Pattern-Matching entgegenzuwirken.

Bei einer heuristischen Analyse wird das Verhalten einer Software auf potentiell schädliche Routinen hin geprüft (z.B. Funktion zum Löschen ganzer Datenträger). Ein heuristisches Verfahren sieht sich in der Lage, die Latenz des patternbasierten Ansatzes wettzumachen, indem sich auch neue und unbekannte Schädlinge aufgrund ihres dubiosen Verhaltens identifizieren lassen. Auch eine heuristische Analyse kann man kompromittieren, indem absichtlich scheinbar legitime Kommandoabfolgen programmiert werden. Soll mittels Heuristik eine destruktive Routine zum Löschen ganzer Laufwerke der Form delvolume(“C:\”) entdeckt werden, kann mit mehrmaligem Aufrufen dedizierter Löschbefehle while(sleep 1); delfile(volume, directory, file); die Mächtigkeit der Schadensroutine verschleiert werden. Durch das Überdecken von Verhaltensmustern können die wahren Absichten verschleiert werden. Das Löschen von Dateien kann zum Beispiel auffälliger sein weder das Überschreiben dieser. Letzteres ist nämlich das legitime Verhalten der meisten Applikationen.

Da bei einer heuristischen Analyse jeder Funktionsaufruf des Programms geprüft werden muss, hat dies entsprechend negative Auswirkungen auf Ressourcen und Performance des Systems.

Korrupter Programmcode lässt sich entfernen. Um korrupten Programmcode entfernen zu können, muss dieser eindeutig als solcher identifiziert und vom legitimen Programmcode getrennt werden können. Hat ein korrupter Programmcode legitimen Programmcode zerstört (z.B. gelöscht oder überschrieben), kann durch das Entfernen des korrupten Programmcodes nicht wieder automatisch eine saubere und voll funktionstüchtige Umgebung gewährleistet werden. Bei bekannten Schädlingen, die Daten mutwillig zerstören, können gewisse Antiviren-Lösungen mit eigenen Patches aufwarten, um beschädigte Datenteile wieder herstellen zu können.

Nur weil ein korrupter Programmcode A als solcher identifiziert und entfernt wurde, muss das desinfizierte System nicht zwangsweise komplett gesäubert sein. Ein anderer korrupter Programmcode B könnte übersehen worden sein. Ein kompromittiertes System kann nur mit absoluter Sicherheit gesäubert werden, wenn es komplett und unter strengster Beobachtung neu aufgesetzt wird.

Kapitel 6 – Sensitive Daten müssen vor Manipulationen geschützt werden

Sensitive Daten müssen vor Manipulationen geschützt werden. Eine unerwünschte Manipulation ist die unerlaubte Einsicht durch Dritte. Die Daten verlieren dadurch ihre Vertraulichkeit. Das Mitlesen einer Kommunikation wird umgangssprachlich als Lauschangriff bezeichnet. Als “Grosser Lauschangriff” werden Überwachungen staatlicher Dienste (Strafverfolgungsbehörden und Nachrichtendienste) bezeichnet. Echelon ist der Name eines der bekanntesten Spionagenetzes der Welt. Der Name Echelon leitet sich wohl von der antiken Schlachtordnung ab. Im deutschen Sprachgebrauch wird sie “Schiefe Schlachtordnung” genannt und im Englischen als gestaffelte Schlachtordnung verstanden. An Echelon sind die Staaten USA, Vereinigtes Königreich (UK), Kanada, Australien und Neuseeland beteiligt. Echelon war ursprüngliche dazu gedacht, die militärische und diplomatische Kommunikation der Sowjetunion und ihrer Verbündeten abzuhören. Heute wird das System zur Suche nach terroristischen Verschwörungen, Aufdeckung im Bereich der organisierten Kriminalität und als politischer sowie diplomatischer Nachrichtendienst benutzt. Seit Ende des Kalten Krieges dient dieses System angeblich auch der Wirtschaftsspionage. Verschiedene Zwischenfälle und Berichte erhärten diese Mutmassung.

Mit Onyx wird das Satellitenabhörsystem der Schweiz bezeichnet. Onyx wird durch den Militärischen Nachrichtendienst (MND) sowie durch den Strategischen Nachrichtendienst (SND), welcher für das Ausland zuständig ist, genutzt. Die erste Inbetriebnahme von Onyx erfolgte 2000. Der operationelle Probebetrieb wurde 2001 gestartet. Im Jahr 2004 wurde dann der operationelle Betrieb von Onyx aufgenommen.

Um eine unerwünschte Einsicht zu verhindern, kann ein abgeschotteter (dedizierter) Kanal genutzt werden. Ein Kanal gilt als abgeschottet, wenn er nicht durch andere Medien benutzt wird oder werden kann. Mit einem VPN (Virtual Private Network) lässt sich auch über geteilte Leitungen (vorwiegend dem Internet) ein abgeschotteter Kanal realisieren.

Ist das Einsetzen eines dedizierten Kanals nicht möglich, muss eine Verschlüsselung ihre Anwendung finden. Daten, die ohne Verschlüsselung übertragen werden, werden als Klartext (Cleartext oder Plaintext) bezeichnet. Daten, die mit einer Verschlüsselung übertragen werden, werden als Geheimtext (Ciphertext) bezeichnet. Eine symmetrische Verschlüsselung benutzt den gleichen Schlüssel K. Für die Verschlüsselung der Nachricht M wird die Funktion EK(M) = C verwendet. Die Entschlüsselung findet sodann mit der Funktion DK© = M statt. Die Funktionen für die Verschlüsselung und die Entschlüsselung sind invers, weshalb DK(EK(M)) = M sowie EK(DK© = C gelten. Da die Sicherheit einer symmetrischen Verschlüsselung auf der Geheimhaltung des Schlüssels basiert, wird sie auch als Private-Key Encryption bezeichnet. Ist einem Angreifer der Schlüssel sowie die mit diesem verschlüsselten Geheimtexte bekannt, kann er sie nach Belieben wieder entschlüsseln. Ist einem Angreifer der Schlüssel bekannt, kann er nach Belieben eigene Geheimtexte generieren (Forgery). Lange Zeit wurde DES (Data Encryption Standard) als Standardverschlüsselung eingesetzt. Im Oktober 2000 wurde er jedoch vom NIST durch AES (Advanced Encryption Standard) abgelöst.

Eine asymmetrische Verschlüsselung benutzt für die Verschlüsselung und die Entschlüsselung zwei unterschiedliche Schlüssel. Es wird ein sogenanntes Schlüsselpaar (Key Pair) mit den Schlüsseln K1 und K2 verwendet. Mit dem eigenen geheimen Schlüssel K1 (Private Key) werden Daten durch EK1 = C verschlüsselt. Mit dem öffentlichen Schlüssel einer anderen Person (Public Key) K2 werden die Daten durch DK2 = M wieder entschlüsselt. Damit gilt DK2) = M. Da eine asymmetrische Verschlüsselung die Weitergabe des öffentlichen Teils des Schlüsselpaars erfordert, wird sie auch als Public-Key Encryption bezeichnet. Die grössten Nachteile asymmetrischer Verschlüsselungen sind die Performance sowie der Schlüsselaustausch. Der Schlüsselaustausch bei asymmetrischen Verfahren wird normalerweise mit klassischer symmetrischer Methoden bewerkstelligt. Man spricht sodann von Hybridverfahren, die die Vorteile beider Ansätze kombinieren. Um Fälschungen und Manipulationen der bereitgestellten öffentlichen Schlüssel zu erkennen bzw. verhindern, kann eine Public Key Infrastructure (PKI) eingesetzt werden. Diese lässt mittels vertrauenswürdiger Zertifikate der Certificate Authority (CA) die Bestätigung der Echtheit der öffentlichen Schlüssel zu.

Es gibt eine Reihe asymmetrischer Kryptosysteme. Das im Jahr 1977 entwickelte RSA (Ronald L. Rivest, Adi Shamir und Leonard M. Adleman) geniesst die meiste Akzeptanz. Darauf folgten Systeme wie McEliece (1978). Rabin (1979), Chor-Rivest (1984) und Elgamal (1985).

Es gibt verschiedene Methoden, wie eine verschlüsselte Kommunikation angegriffen werden kann. Dies wird als Kryptoanalyse (cryptanalysis) bezeichnet. Bevor eine verschlüsselte Nachricht angegriffen werden kann, muss man in den Besitz dieser kommen. Typischerweise werden hierzu Geheimtexte abgefangen (Sniffing). In gewissen Fällen lassen sich Geheimtexte auch selber generieren.

Man unterscheidet zwischen sechs Angriffsmethoden auf kryptgrafische Systeme. Die Grundlage der meisten kryptoanalytischen Attacken sind statistische Analysen (z.B. Häufigkeitsanalyse), bei denen Auffälligkeiten als solche erkannt werden. Bei einer Known-Plaintext Attacke hat der Kryptoanalytiker sowohl Zugriff auf den Klartext als auch auf den Geheimtext von Nachrichten. Aus dem Klartex Pi sowie dem Geheimtext Ci = EK(Pi) soll entweder der Schlüssel K oder das Verständnis für Pi+1 von Ci+1 = EK(Pi+1) ermittelt werden. Bei einer Chosen-Plaintext Attacke sieht sich der Kryptoanalytiker in der Lage, aus eigens definierten Klartexten entsprechende Geheimtexte zu generieren. So definiert sich der Klartext Pi sowie der Geheimtext Ci = EK(Pi), wobei entweder der Schlüsel K ermittelt oder ein Algorithmus gleichwertig zu Pi+1 von Ci+1 = EK(Pi+1) ermittelt werden soll. Bei einer Chosen-Ciphertext Attacke wählt der Kryptoanalytiker verschiedene Klartexte, die es zu entschlüsseln gilt. Durch den Zugriff auf die generierten Geheimtexte soll der Schlüssel K ermittelt werden. Diese Angriffstechnik wird primär bei Public-Key Algorithmen angewendet. Chosen-Plaintext Attacken kombiniert mit Chosen-Ciphertext Attacken werden auch als Chosen-Text Attacken bezeichnet. Eine eher unpopuläre und unpraktikable Technik der Kryptoanalyse ist die Chosen-Key Attack. Bei dieser bringt der Kryptoanalytiker einige Kenntnisse bezüglich der Relationen verschiedener Schlüssel mit. Bei Rubber-Hose Cryptanalysis wird jemand bedroht, erpresst oder gefoltert, damit er Informationen zu einem kryptographischen System herausgibt. Hierbei handelt es sich nicht um eine klassische Kryptoanalyse auf technischer Ebene.

Man unterscheidet zwischen vier unterschiedlichen Stufen der erfolgreichen Kryptoanalyse. Bei einem totalen Bruch findet der Kryptoanalytiker den geheimen Schlüssel K, so dass er DK© = P generieren kann. Bei einer Ciphertext-Only Attacke wird aus der Reihe von Geheimtexten {C1 = EK(P1), C = EK(P2), … Ci = EK(Pi)} entweder der Klartext {P1, P2, … Pi}, der Schlüssel K oder ein Algorithmus gleichwertig zu Pi+1 von Ci+1 = EK(Pi+1) ermittelt. Bei einer Global Deduction findet der Kryptoanalytiker einen alternativen Algorithmus A, mit dem er DK© = P durchführen kann, ohne den Schlüssel K zu kennen. Bei einer Instance oder Local Deduction identifiziert der Kryptoanalytiker einen dedizierten Geheimtext einer abgefangenen Nachricht. Bei einer Information Deduction ermittelt der Kryptoanalytiker etwelche Infromationen über den Schlüssel oder den Klartext. Dies können einzelne Teile des Schlüssels oder die grundlegende Struktur der Nachricht sein. Ein Kryptoalgorithmus gilt als unbedingt sicher, wenn ein Kryptoanalytiker selbst mit einer beliebigen Anzahl an Geheimtexten keine erfolgreiche Kryptoanalyse durchführen kann.

Durch Quantenkryptografie kann ein auf physikalischer Ebene abhörsicherer Kanal erreicht werden. Das rein passive und damit unidentifizierbare Mithören des quantenkryptografisch geschützten Datenaustauschs ist aufgrund der heisenberg’schen Unschärferelation nicht möglich. Durch das Messen eines Zustands, dies ist beim Abhören einer elektronischen Kommunikation ebenso erforderlich, wird dieser unweigerlich verändert (Werner Heisenberg, Physikalische Prinzipien der Quantentheorie, 1930). Das Mitlesen der Kommunikation kann so bemerkt und neu initiiert werden.

Die Quantenkryptografie ist aufgrund ihrer Komplexität und Instabilität in erster Linie nur für einen sicheren Schlüsselaustausch vorgesehen. Das BB84-Protokoll ist in der Quantenkryptografie das wohl bekannteste Verfahren zur Schlüsselerzeugung (Charles H. Bennett, Gilles Brassard, 1984).

Eine weitere unerwünschte Manipulation ist die Veränderung. Die Daten verlieren dadurch ihre Integrität. Typischerweise werden digitale Signaturen eingesetzt, um die Integrität (Fälschbarkeit) und Authentizität (Herkunft) von Daten verifizieren zu können. Bei einer digitalen Signatur wird der private Schlüssel nicht direkt auf die Nachricht angewendet, sondern auf deren Hash-Wert, der mittels einer Hash-Funktion (wie z. B. SHA-1) aus der Nachricht berechnet wird. Bei deterministischen digitalen Signaturverfahren ist die digitale Signatur durch die Nachricht und den Schlüssel eindeutig festgelegt. Bei probabilistischen digitalen Signaturverfahren gehen Zufallswerte in die Signaturberechnung ein, so dass die digitale Signatur zu einer Nachricht und einem Schlüssel viele verschiedene Werte annehmen kann.

Es gibt auch hier verschiedene Verfahren zur Generierung elektronischer Signaturen. Das mit Abstand und seit Jeher bekannteste Verfahren ist RSA, welches sich die Schwierigkeit der Faktorisierung grosser Primzahlen zunutze macht. Es gibt verschiedene Arten, Primzahlen zu generieren. Eine gerade für die Generierung grosser Primzahlen beliebte Methode ist die Mersenne-Zahl Mn = 2^n – 1, bei der Mn zuvor ebenfalls eine Primzahl ist. Fermat vermutete, dass alle Zahlen der Form 2^2^n + 1 prim sind. Tatsächlich ist aber für n > 4 keine solche Fermat-Zahl bekannt.

Bei der Primfaktorzerlegung wird eine natürliche Zahl als Produkt von Primzahlen dargestellt (z.B. 30 = 2 × 3 × 5). Die Primfaktorzerlegung der natürlichen Zahl 1 besteht aus einem leeren Produkt. Bei einer kanonischen Primfaktorzerlegung sind die Primfaktoren nach ihrer Grösse geordnet und zu Potenzen zusammengefasst (z.B. 6936 = 2^3 × 3 × 17^2).

Es ist in der Regel viel einfacher eine Primzahl zu generieren, weder auf diese eine Primfaktorzerlegung anzuwenden. Die Firma RSA Security startete am 18. März 1991 die RSA Factoring Challenge, bei der die Sicherheit von RSA durch die Schwierigkeit der Faktorisierungen bewiesen werden soll. Die Primfaktorzerlegung der 174-stelligen Zahl für RSA576 wurde im Dezember 2003 von J. Franke und T. Kleinjung vom Max Planck Institut für Mathematik in Bonn und dem Experimentellen Mathematischen Institut in Essen gefunden. Das Preisgeld lag bei 10.000 US$. Die Primfaktorzerlegung der 193-stelligen Zahl von RSA640 wurden im November 2005 von F. Bahr, M. Boehm, J. Franke, T. Kleinjung, die zuvor schon RSA 200 faktorisiert hatten, gefunden. Das Preisgeld lag bei 20.000 US$.

Alternativ werden DSA, El-Gamal und Schnorr-Signaturen eingesetzt, die einen diskreten Logarithmus in endlichen Körpern anwenden. ECDSA, ECGDSA oder Nyberg-Rueppel-Signaturen verwenden einen diskreten Logarithmus in elliptischen Kurven. Systeme auf der Basis elliptischer Kurven (Elliptic Curve Cryptosystems, ECC) wurden immer populärer, da sie mit wesentlich kleineren Schlüssellängen auskommen.

Das Gewährleisten der Integrität kann ebenso durch eine Verschlüsselung realisiert werden. Um die Daten bewusst zu verändern, müsste die Verschlüsselung dem Angreifer bekannt und durch ihn reproduzierbar sein.

Eine andere unerwünschte Manipulation ist das Verzögern oder Unterbinden des Datenflusses. Die Daten verlieren dadurch ihre Verfügbarkeit. Eine destruktive Attacke auf einen Dienst wird als Denial of Service (DoS) bezeichnet. Werden verschiedene Systeme eingespannt, um eine Denial of Service-Attacke durchzusetzen, spricht man von einer Distributed Denial of Service Attacke (DDoS). Um orchestrierte DDoS-Attacken durchzuführen, wird ein Multi-Tier-Modell angestrebt. DDoS-Attacken werden in der Regel von einem Management-System orchestriert. In einem 3-Tier-Modell werden die Anweisungen des Management-Systems von einem Handler entgegengenommen und an die jeweiligen Agents verteilt. Der Handler agiert dabei quasi als intelligenter Proxy. Das Durchführen der eigentlichen DoS-Attacke wird durch die unterschiedlichen Agents vorgenommen. Ein Agent in einem DDoS-Netz ist normalerweise zuvor kompromittiert und zweckentfremdet worden. Ein DDoS-Agent, der zuvor kompromittiert und zweckentfremdet wurde, wird als Zombie bezeichnet. Der DDoS-Server auf einem Zombie-Host ist als spezielle Hintertür zu verstehen.

Zu den klassischen Implementierungen von DDoS-Lösungen gehören Trinoo, TFN (Tribe Flood Network) und Stacheldraht. Sie wurden teilweise seit Ende der 90er Jahren öffentlich gemacht, jedoch erst zu Beginn des neuen Jahrtausends breitflächig eingesetzt (CERT® Incident Note IN-99-04).

Die einfachste und direkteste Methode einen Dienst unbrauchbar zu machen, ist diesen zu überlasten. Das Überlasten eines Dienstes mittels einer Vielzahl an (grossen) Anfragen wird als Flooding bezeichnet. Das erfolgreiche Überlasten eines Dienstes erfordert, dass man mit den eigenen verfügbaren Ressourcen die bereitgestellten Ressourcen des Ziels aufbrauchen kann. Davon ist grundsätzlich jegliche Ressource betroffen, die limitiert und und alloziiert werden kann. Klassisches Beispiel aus dem Betriebssystem-/Netzwerkumfeld ist ein SYN-Flooding, bei dem die Backlog Queue für TCP-Verbindungen aufgebraucht wird. (W. Richard Stevens, TCP/IP Illustrated, Volume 1: The Protocols) Das Aufbrauchen von Ressourcen kann nie gänzlich verhindert werden. Durch das intelligente Zuweisen und Entziehen von Ressourcen wird es jedoch möglich, derlei Angriffe sehr aufwendig und damit eher uninteressant zu machen.

Da Überlastungsangriffe keine intelligente Interaktion mit einem Zielsystem erfordern, werden sie als besonders einfach und primitiv angesehen. (Marc Ruef, Die Kunst des Penetration Testing, 2007)

Schlecht umgesetzte oder gewartete Dienste lassen sich unter Umständen als Drittperson einfachso deaktivieren. Im Rahmen von TCP/IP kann beispielsweise ein ARP-Segment mit falscher Adresse für ein Drittsystem verschickt werden, um die Netzwerkkommunikation abrupt abzubrechen. Dies funktioniert jedoch naturbedingt nur in lokalen Netzen (LAN). ICMP-, TCP- und UDP-Kommunikationen lassen sich ebenfalls mit diversen ICMP-Fehlermeldungen (z.B. ICMP port unreachable) beenden. Die meisten Verbindungen lassen sich mit spezifischen ICMP-Fehlermeldungen unterbrechen. Durch das Filtern und/oder Prüfen eingehender ICMP-Fehlermeldungen können derlei Angriffe verhindert werden. Durch das Filtern und/oder Prüfen ausgehender ICMP-Fehlermeldungen können andere Systeme davor geschützt werden, selber als Agent oder Amplifier für derlei Attacken herzuhalten.

Eine etablierte TCP-Verbindung kann, sofern die TCP-Sequenznummern richtig erraten werden, mit einem TCP-Verbindungsabbau (RST oder FIN) beendet werden. Das Voraussagen von TCP-Sequenznummern erfordert, den TCP-Verkehr mitlesen und auswerten zu können. Hierzu wäre also ein Re-Routing-Angriff sowie Sniffing erforderlich. Das Übernehmen von etablierten Kommunikationsbeziehungen wird als Hijacking bezeichnet. Erfolgreich übernommene Kommunikationsbeziehungen werden meistens für produktive Zwecke missbraucht (z.B. Mitlesen des Datenaustauschs) anstatt eine destruktive Denial of Service-Attacke durchzusetzen.

Eine UDP-Verbindung kann in vielen Fällen mit einem gefälschten Verbindungsabbau des Anwendungsprotokolls beendet werden. UDP-Verbindungen gelten aufgrund fehlender Schutzmechanismen (z.B. keine Sequenznummern) als unzuverlässig. Sie sollten nach Möglichkeiten nie von und über unsichere Netze zugelassen werden. Der Austausch grösserer Datenmengen sollte aufgrund der Verbindungslosigkeit von UDP lieber mit TCP umgesetzt werden.

Wird der Zugriff auf administrative Bereiche möglich (z.B. da eine Authentisierung fehlt), können die Deaktivierungen ganz normal umgesetzt werden. Dienste/Systeme können heruntergefahren bzw. deaktiviert werden, um Nutzungsmöglichkeiten zu entziehen. Zugriffsmöglichkeiten/-rechte können entzogen oder erweiterte Authentisierugen forciert werden, um Zugriffsmöglichkeiten zu entziehen.

Über den Autor

Marc Ruef

Marc Ruef ist seit Ende der 1990er Jahre im Cybersecurity-Bereich aktiv. Er hat vor allem im deutschsprachigen Raum aufgrund der Vielzahl durch ihn veröffentlichten Fachpublikationen und Bücher – dazu gehört besonders Die Kunst des Penetration Testing – Bekanntheit erlangt. Er ist Dozent an verschiedenen Hochschulen, darunter ETH, HWZ, HSLU und IKF. (ORCID 0000-0002-1328-6357)

Sie wollen die Sicherheit Ihrer Firewall prüfen?

Unsere Spezialisten kontaktieren Sie gern!

×
Cyber Threat Intelligence

Cyber Threat Intelligence

Marc Ruef

3D Printing

3D Printing

Marc Ruef

Contact Tracing App DP3T

Contact Tracing App DP3T

Marc Ruef

Sie wollen mehr?

Weitere Artikel im Archiv

Sie brauchen Unterstützung bei einem solchen Projekt?

Unsere Spezialisten kontaktieren Sie gern!

Sie wollen mehr?

Weitere Artikel im Archiv