Massachusetts Institute of Technology. Vorlesung # 6.858. "Sicherheit von Computersystemen." Nikolai Zeldovich, James Mickens. 2014 Jahr
Computer Systems Security ist ein Kurs zur Entwicklung und Implementierung sicherer Computersysteme. Die Vorträge behandeln Bedrohungsmodelle, Angriffe, die die Sicherheit gefährden, und Sicherheitstechniken, die auf jüngsten wissenschaftlichen Arbeiten basieren. Zu den Themen gehören Betriebssystemsicherheit, Funktionen, Informationsflussmanagement, Sprachsicherheit, Netzwerkprotokolle, Hardwaresicherheit und Sicherheit von Webanwendungen.
Vorlesung 1: „Einführung: Bedrohungsmodelle“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 2: „Kontrolle von Hackerangriffen“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 3: „Pufferüberläufe: Exploits und Schutz“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 4: „Trennung von Privilegien“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 5: „Woher kommen Sicherheitssysteme?“
Teil 1 /
Teil 2Vorlesung 6: „Chancen“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 7: „Native Client Sandbox“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 8: „Netzwerksicherheitsmodell“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 9: „Sicherheit von Webanwendungen“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 10: „Symbolische Ausführung“
Teil 1 /
Teil 2 /
Teil 3Vorlesung 11: „Ur / Web-Programmiersprache“
Teil 1 /
Teil 2 /
Teil 3 Nikolai Zeldovich: Lasst uns anfangen, Leute! Daher werden wir heute über einen völlig anderen und grundlegenden Ansatz zur Erstellung sicherer Webanwendungen sprechen. Es geht um ein System namens Ur / Web. Jetzt wird Ihnen unser Gast Adam Chipala, der Autor dieses Systems, Professor am MIT, über das von ihm erstellte System berichten.
Adam Chipala: Ich möchte so schnell wie möglich zur Demonstration kommen. Aber vorher werde ich einige Folien zeigen, um den Inhalt dieses Systems zu erklären. Sie haben wahrscheinlich bereits einige Ideen dazu aus den heutigen Vorlesungsunterlagen.
Was ist Ur / Web? Es ist immer hilfreich, mit einer Erklärung zu beginnen, was der Titel des Themas bedeutet. Ur / Web ist in erster Linie eine Programmiersprache zum Erstellen von Webanwendungen. Dies ist, was das Web in seinem Namen hat. Dies ist eine Art vollwertiges Stapelsystem, das alles tut, was Sie zum Erstellen von Webanwendungen benötigen. Ur bedeutet die neue universelle Programmiersprache, mit der diese Webfunktionen implementiert werden.
Der springende Punkt bei Ur / Web ist, dass anstelle der Verwendung einer allgemeinen Programmiersprache, einer Bibliothek und traditioneller Frameworks zum Erstellen von Webanwendungen all dies bereits in eine benutzerdefinierte Ur / Web-Programmiersprache integriert ist. Dies ist eine Sprache, die zur Laufzeit eher kompiliert als interpretiert wird. Und der Compiler versteht gewissermaßen, was eine Webanwendung tun sollte. Es zeigt die Fehler an, die Sie machen, im Gegensatz zum regulären Java-Compiler, der nicht versteht, wo Sie Fehler haben.
Bei der Entwicklung dieser Sprache habe ich drei Hauptprinzipien verwendet: Programmiereffizienz, Sicherheit und Leistung, insbesondere auf der Serverseite, für die Skalierung. In diesem Zusammenhang ist der zweite am relevantesten.
In den meisten Fällen werden Benutzer Ihrer Anwendung keine kleinen Leistungsprobleme auf der Clientseite bemerken, aber selbst ein kleines Problem auf der Serverseite kann dazu führen, dass Sie viel mehr Server als nötig kaufen.

Im Moment gibt es bereits mehrere Benutzer von Ur / Web, jedoch nicht so viele wie diejenigen, die andere Programmiersprachen verwenden. Aber zumindest ist es die einzige kommerzielle Webanwendung, die ein RSS-Reader ist und exotische Funktionen wie das Anzeigen von Kommentaren unterstützt. Es gibt auch eine URL, die von einem nicht-englischen Muttersprachler erfunden wurde, der einen solchen Namen jetzt bereut. Es heißt BazQux Reader, eine Kombination der taktischen Fähigkeiten der Hacker-Community. Diese Anwendung hat bereits mehrere tausend bezahlte Benutzer. Und es sieht so aus, als wäre es viel schöner, damit umzugehen, als mit CSS. Dies ist ein Beweis dafür, dass dies mit Ur / Web möglich ist.
Sie können mich jederzeit mit Fragen unterbrechen, obwohl ich wahrscheinlich immer noch nicht herausgefunden habe, was die Fragen verursachen könnte. Der Haupterfolg des Ur / Web-Verkaufs besteht daher darin, dass es ein Programmiermodell auf sehr hohem Niveau gibt, das sich stark von Django unterscheidet, das Sie aus früheren Vorlesungen kennen. Und er hat eine gute Sicherheitsgeschichte.
Einige Funktionen, die Sie aus Sicherheitsgründen haben möchten, sind bereits in das System integriert, sodass Sie nicht hart arbeiten müssen, um die Sicherheit Ihres Programms zu gewährleisten. Ich werde Ihnen in naher Zukunft mehr darüber erzählen.
Darüber hinaus bietet diese Sprache eine hohe serverseitige Leistung, selbst im Vergleich zu den gängigeren Tools zur Erstellung von Webanwendungen. Ich denke, Sie haben bereits davon gehört. Die Einschränkung ist, dass wir wahrscheinlich mehr Ideen aus funktionalen Programmiersprachen wie Haskell lernen müssen, bevor wir Ur / Web verwenden.
Ich habe mir die Fragen und Antworten für diese Lektion angesehen, und ungefähr ein Fünftel der Schüler hat sich über die funktionalen Teile der Programmierung beschwert, die schwer zu vervollständigen waren. Ich entschuldige mich, aber es gibt so viele gute Ideen in der Welt der funktionalen Programmierung, dass es schwierig wäre, nicht von diesem Moment an zu beginnen und allmählich komplexere Dinge hinzuzufügen. Aber ich werde versuchen, keine strengen Kenntnisse des Materials zu verlangen, über das ich heute sprechen werde.
Somit ist dieses Programmiermodell sehr eng mit der statischen Typisierung verbunden. Und dies ist nicht nur statische Typisierung, wie in der Java-Sprache, die ein relativ unaussprechliches ungeschicktes Typsystem aufweist, sondern statische Typisierung, ähnlich der in Haskell oder Apache Camel verwendeten. Diese Eingabe ist eine Möglichkeit, mit der der Compiler versteht, was Sie tun, und Fehler in seinem Programm abfängt.

Es stellt sich heraus, dass die Hauptsprache Ur, auf der Ur / Web basiert, ein sehr ausdrucksstarkes System der statischen Typisierung aufweist. So viel von dem, was Ur / Web tut, wird tatsächlich von Bibliotheken ohne spezielle Compiler-Unterstützung bereitgestellt. Zum Beispiel haben wir dem Compiler beigebracht, wie man den Typ der SQL-Abfragen überprüft, ohne Regeln für die Eingabe von SQL in den Compiler zu erstellen. Sie können als Bibliotheken codiert werden und einen Standardvalidierungstyp verwenden, um sicherzustellen, dass Ihre SQL-Abfragen den SQL-Regeln entsprechen.
In diesem Zusammenhang ist die Gewährleistung eines hohen Sicherheitsniveaus am relevantesten - die meisten der häufigsten Sicherheitslücken sind beim Programmieren auf Ur / Web nicht möglich. Sie können sich für immer von böswilligen Code-Injection-Angriffen und Cross-Site-Scripting-Angriffen verabschieden. Sie können beängstigend aussehenden Flaggennamen erlauben, die schrecklichsten Dinge zu tun, die in einer Webanwendung getan werden können, selbst wenn Sie mithilfe der Funktionen der Benutzeroberfläche eines anderen wirklich eine Art „schwarze Magie“ verursachen.
Es gibt mehrere andere sicherheitsspezifische Eigenschaften, die ich später erläutern werde. Die Leistung ist auch sehr gut. Der Compiler ist in erster Linie für die Erstellung von Quellcode für Domänen optimiert und viel produktiver als handgeschriebener Code in C.
Daher versteht er, was die Webanwendung tut, und kann einige Dinge optimieren, die ein herkömmlicher Compiler vom allgemeinen Typ nicht „fangen“ würde. Daher konkurriert der Quellcode, den dieser Compiler auf dem Server ausführt, erfolgreich mit dem C-Code. Wenn wir die Kosten für die Sicherstellung der Leistung mit den Arbeitskosten für die Programmierung in anderen Sprachen vergleichen, sehen wir, dass Ur / Web die Lebensdauer des Programmierers erheblich vereinfacht.
Die folgende Folie zeigt einen schnellen Benchmark für die Leistung dieses Webinfrastruktur-Frameworks von Drittanbietern.
Dies ist ein Screenshot der Ergebnisse des letzten Tests, bei dem verschiedene Webprogrammierungsaufgaben von verschiedenen Frameworks ausgeführt wurden.

Sie können sehen, dass Ur / Web den 4. Platz von 60 Frameworks belegt hat, die an Leistungstests teilgenommen haben. Nachdem dieser Screenshot aufgenommen wurde, wurden einige weitere Verbesserungen am Compiler vorgenommen. Daher gehe ich davon aus, dass er in der nächsten Runde nach seinen Ergebnissen leicht vorankommen wird. Grundsätzlich ist dies ein einfaches Beispiel für die Verwendung von SQL zum Generieren von HTML-Seiten. Sie erhalten ungefähr 100.000 Anfragen pro Sekunde vom Ur / Webserver, und dies ist für die meisten Anwendungen mehr als ausreichend. Es ist wichtig, dass auf dieser Folie angegeben wird, dass Sie ein Modell auf hoher Ebene verwenden können, das mehr Sicherheit bietet, indem die Leistung gegenüber den gängigeren Frameworks geringfügig beeinträchtigt wird.
Lassen Sie mich mit Bildern beginnen, die meinen Eindruck davon widerspiegeln, was Programmierer heute über das Schreiben von Webanwendungen mit den gängigsten Frameworks denken. Dann werde ich Ihnen einen anderen Standpunkt zeigen, der von Ur / Web bereitgestellt wird und nach dem viele Dinge, die schief gehen können, in diesem Framework fehlerfrei sind.
Das Hauptbild ist ein Webserver, von dem der gesamte Prozess Ihrer Anwendung abhängt. Und es gibt eine ganze Flotte von Browsern, die mit diesem Server interagieren werden. Der Server bleibt in einem bestimmten Zustand, wodurch die Interaktion mit all diesen Browsern sichergestellt wird.
Das übliche Bild ist, dass der Browser mit der Interaktion mit dem Webserver beginnt, indem er ihm eine HTTP-Anfrage sendet, die die darin integrierten URLs enthält. Danach sendet der Webserver die HTTP- und HTML-Seite zurück an den Browser. Es gibt jedoch einige integrierte URLs, mit denen festgelegt werden kann, welche Anforderung der Webserver in Zukunft stellen soll.

Dieser Webserver kann auch mit einer Datenbank kommunizieren, die allen Benutzern der Anwendung dauerhaften Speicher bietet. In diesem Fall wird ein beliebtes SQL-Protokoll für Konversationen zwischen dem Servernetzwerk und der Datenbank verwendet. Genau darüber werde ich sprechen, wenn ich die Möglichkeiten von Ur / Web diskutiere.

Moderne Webanwendungen sind nicht nur eine Sofortseite. Wann immer sich etwas auf der Seite ändern sollte, stellen Sie eine neue Anfrage an den Server, wonach die gesamte Seite des Moduls ersetzt wird. Es gibt einen AJAX-Stil, nach dem der Browser manchmal während einer Seitenansicht zusätzliche HTTP-Anforderungen an den Webserver sendet und Antworten empfängt, die vom Benutzerprogramm verarbeitet werden. In diesem Fall werden normalerweise Datendarstellungen wie XML und JSON sowie andere einfache Formate für den Datenaustausch zwischen Client und Server verwendet.

Wenn der Browser diese Antwort zurückgibt, gibt es einen JavaScript-Code, der eine beliebige Logik zur Steuerung der Benutzeroberfläche implementiert, die dem Benutzer angezeigt wird.

Dieser JavaScript-Code kann die Antworten lesen, die der Server auf verschiedene AJAX-Aufrufe gibt. Anschließend kann er die Seite ändern, die hauptsächlich durch Ändern der für die Seite festgelegten globalen DOM-Variablen angezeigt wird. Jeder Teil des Programms kann diese globale Variable, bei der es sich um eine Seite handelt, beliebig beeinflussen. Oft werden Teile einer Seite durch eine Zeichenfolgen-ID angezeigt, die mit den Knoten eines Baums versehen ist, der ein Dokument beschreibt.
Und schließlich ist eine weitere Komplikation, dass wir manchmal möchten, dass der Webserver ohne Anfrage mit dem Browser kommuniziert. Angenommen, eine neue E-Mail-Nachricht wird angezeigt und der Webserver möchte den Browser über diese neue Nachricht informieren.

Dazu gibt es viele Möglichkeiten, z. B. Comet - ein Webanwendungsbetriebsmodell, bei dem der Webserver über eine konstante HTTP-Verbindung Daten ohne zusätzliche Anforderung des Browsers an den Browser senden kann, oder das WebSockets-Duplexprotokoll, das zwischen dem Browser und dem Server kommuniziert in Echtzeit. Im Prinzip sind dies die gleichen Dinge, aber in eine konzeptionell andere Richtung.
Daher möchte ich alle diese Protokolle und Sprachen auf den Bildschirm zurückführen, nachdem ich zuvor einige Teile in Gelb ausgewählt habe. Hat jemand nach dem Lesen der Vorlesungsunterlagen erraten, was all diese hervorgehobenen Teile in Bezug auf die Sicherheit gemeinsam haben?
Student: Das sind alles Zeilen, in die Sie alles einfügen können.
Professor: Richtig, in dem allgemein akzeptierten Ansatz zur Programmierung von Webanwendungen sind all diese Dinge Zeichenfolgen. Und die Programmiersprache versteht nicht, wie Sie sie verwenden, sodass Sie Fehler nicht vermeiden können. Wenn Sie diese Dinge beispielsweise als Zeichenfolgen darstellen, erhalten Sie Code-Injection-Angriffe. Soweit ich das beurteilen kann, sind Code-Injection-Angriffe hauptsächlich das Ergebnis der Aufnahme einer Funktion als Grundelement in Ihre Programmiersprache oder Ihr Framework, mit der Programme in Form von Text in einer ausdrucksstarken Sprache gestartet werden.
Ur / Web verfügt über keinen integrierten Interpreter zum Ausführen von Zeichenfolgen als Programme. Und dies macht viele der häufigsten Webanwendungsfehler strukturell unmöglich. Alle diese ausgewählten Objekte sind entweder unsichtbar oder werden durch spezielle Typen dargestellt, wodurch klar wird, mit welchem Code Sie es zu tun haben. Sie haben jedoch keine automatischen Casts für Strings in einem dieser speziellen Typen.
Die Folie zeigt nun ein alternatives Modell, das Ur / Web bereitstellt und das zu einem traditionellen Modell kompiliert wird. So funktioniert es in allen gängigen Browsern. Der Programmierer kann jedoch auf einer höheren Ebene darüber nachdenken und mögliche Fehler vermeiden, die im vorherigen Bild möglich waren.

Wir haben also immer noch einen Webserver, der auf Anfragen reagiert. Und wir haben immer noch diese Flotte von Browsern, die versuchen, einen Webserver zu verwenden. Der erste wichtige Unterschied besteht jedoch darin, dass ein Browser, wenn er eine Webanwendung verwenden möchte, nicht nur eine Reihe von HTTP-Anforderungen mit einer URL sendet.
Es führt die First-Class-Funktion auf dem Server aus, ohne den Client einzubeziehen. Anschließend antwortet der Server nicht nur mit einer Zeichenfolge aus HTTP-Protokolltext, sondern auch mit einem streng typisierten Dokumentbaum. Anstelle einer HTML-Zeichenfolge haben wir also einen Baum in einer Programmiersprache, ein Objekt der ersten Klasse. Und das Programm manipuliert diesen bestimmten Baum, nicht die Zeichenfolge.
Jeder dieser Bäume enthält Links, die für sich genommen nur Fußnoten für andere Funktionen sind, die auf dem Server aufgerufen werden können. Wenn der Benutzer auf diese Links klickt, wählt der Browser die Funktion aus und ruft sie konzeptionell auf dem Server als die ursprüngliche Funktion auf, die wir aufgerufen haben, um an diesen Punkt zu gelangen.
Wir haben auch eine Datenbankschnittstelle, auf die ein Webserver zugreift, der Anforderungen an die Datenbank sendet. Im Ur / Web-Modell ist dies nicht nur Text, sondern stark typisierte SQL-Syntaxbäume. Und dann antwortet die Datenbank nicht mit Text, sondern mit einer Liste von Datensätzen von Eigenwerten in der Programmiersprache Ur, mit der wir arbeiten.

Daher müssen wir uns keine Gedanken darüber machen, ob Zeichenfolgen falsch in "native" Darstellungen konvertiert werden oder ob "native" Darstellungen in ein anderes Format konvertiert werden, das uns die Datenbank traditionell zur Verfügung stellen kann.
Dies ist ein Schlüsselelement dafür, wie die Ur / Web-Semantik es Programmierern erleichtert, mit vielen Skripten zu arbeiten, die tatsächlich ausgeführt werden können, während die Anwendung ausgeführt wird.
In der Welt der relationalen Datenbanken gibt es eine Standardtransaktionsidee, bei der Sie eine Reihe von Vorgängen ausführen können, ohne sie mit anderen parallelen Threads zu unterbrechen. Und Ur / Web passt dieses Modell an und bettet es in die Semantik der Sprache ein. Wenn daher eine Funktion im Auftrag des Clients auf dem Server ausgeführt wird, erfolgen alle Zugriffe auf die Datenbank in Form eines atomaren Blocks ohne Unterbrechung, die durch alle anderen gleichzeitigen Anforderungen an denselben Server verursacht wird. Sie können dieses Verhalten nicht vermeiden, auch wenn Sie möchten, da diese Transaktionen in die Programmiersprache integriert sind.
Und sie erleichtern die Ausführung gleichzeitiger Abfragen erheblich und helfen möglicherweise dabei, die Sicherheitsprobleme zu vermeiden, die auftreten, wenn bestimmte Abfragekombinationen abwechseln.
Ich möchte eine Antwort auf eine der Fragen erhalten, die in der Zusammenfassung dieses Vortrags gestellt wurden und die mich fasziniert haben. Ur / Web erkennt also, wenn eine Transaktion aufgrund eines parallelen Ausführungsproblems wie einer Sackgasse fehlschlägt, und startet die Transaktion automatisch neu. Jemand, der Fragen beantwortete, schrieb, dass dies den Start von Sicherheitsangriffen erleichtern kann, die von einem Transaktionsfehler aufgrund von Parallelitätsproblemen abhängen. Ich wollte nur die Klasse fragen, kann jemand ein Beispiel für einen solchen Angriff geben, wie Sie es sich vorstellen? Wie kann dies zu Sicherheitsproblemen führen, wenn Sie über ein System verfügen, das Transaktionen in Deadlocks automatisch neu startet? Ich habe keine Antwort auf diese Frage, weshalb ich frage. Diese Frage hat möglicherweise eine so offensichtliche Antwort, dass es sich eindeutig lohnt, darüber zu diskutieren.
Student: Vielleicht kann dies zu einem Ausfall des DoS-Dienstes führen? Wenn er die von Ihnen gesendete Transaktion neu startet und Sie wissen, dass sie nicht erfolgreich sein wird, können Sie diesen Vorgang einfach fortsetzen und es erneut versuchen ...
Professor: Ok, mach weiter ...
Student: Wenn Sie das System dazu zwingen, das zu tun, was Sie wissen, wird es niemals erfolgreich sein. Sie können es immer wieder versuchen und am Ende dazu führen, dass der Dienst fehlschlägt.
Professor: Richtig, aber dazu benötigen Sie mindestens zwei Threads, die gleichzeitig arbeiten. Obwohl dies möglicherweise funktionieren könnte, können Sie möglicherweise einen Denial-of-Service-Angriff starten. In diesem Fall können Sie die Tatsache nutzen, dass Anforderungshandler immer wieder neu gestartet werden und absichtlich einen Konflikt verursachen, und dies verwenden, um die Leistung von DoS-Angriffen zusätzlich zu dem zu erhöhen, was Sie mithilfe eines herkömmlichen Angriffsmodells dieses Typs erhalten können. Nun, ich kann es glauben.
Student: Ist dies der einzige Weg, um einen Transaktionsfehler zu verursachen?
Professor: Ja, dies ist der einzige Weg, um einen Absturz und einen automatischen Neustart zu verursachen.
Student: Vielleicht gibt es einen Dritten, der bedingt scheitern würde. Dann können Sie damit das Verhalten anderer Benutzer überwachen.
Professor: Sie müssen auch feststellen können, dass jemand versagt hat, aber Sie können dies erst nach einiger Zeit tun. Dies kann jedoch auch ein Problem sein. , , , . , . , , , . .
: , , , . , ?
: , , , .
: , , , ? , .
: , , . , .
: , , , , , ?
: , , , , , ? , – , . . , , .
: , , ?
: , , . , , , . , – .
, -. AJAX, .

, . , . , - .

, . , .
, Ur/Web , . — , . , , . — , , .
— , , , . , , , .
. Ur/Web- Ur/Web-. JavaScript, . , . .
, , . , . , , , . , , , .

. , , , , , . . , , JavaScript.
JavaScript , , , JavaScript .
, , Ur/Web- — . , , , . JSON. .

, , . , . . - .
, , , , . : «, », . «» .

, . , ?
: , ?
: RPC , . , .
— , . , , .
: ?
: HTTP-. , - , , , HTTP .
, , . . , Ur/Web. , .

, . , , URL- URL-. . , URL.
URL . - , URL. , HTML . HTML. , XML-, , .
- , . HTML- , .

, , . , , UTF-8. , .
, UTF-8, . - , Tangled Web ( ), Ur/Web, , .
Übrigens, schlagen Sie während dieser Demonstration jederzeit Experimente vor, die Ihnen in den Sinn kommen, damit wir auf meinem System testen können, welche Art von Fehlern es abfangen kann.Ich denke, dies ist der produktivste Weg, um die Fähigkeiten von Ur / Web zu demonstrieren.27:45 minMIT-Kurs "Computer Systems Security". Vorlesung 11: Ur / Web-Programmiersprache, Teil 2Die Vollversion des Kurses finden Sie
hier .
Vielen Dank für Ihren Aufenthalt bei uns. Gefällt dir unser Artikel? Möchten Sie weitere interessante Materialien sehen? Unterstützen Sie uns, indem Sie eine Bestellung
aufgeben oder Ihren Freunden empfehlen, einen
Rabatt von 30% für Habr-Benutzer auf ein einzigartiges Analogon von Einstiegsservern, das wir für Sie erfunden haben: Die ganze Wahrheit über VPS (KVM) E5-2650 v4 (6 Kerne) 10 GB DDR4 240 GB SSD 1 Gbit / s von $ 20 oder wie teilt man den Server? (Optionen sind mit RAID1 und RAID10, bis zu 24 Kernen und bis zu 40 GB DDR4 verfügbar).
VPS (KVM) E5-2650 v4 (6 Kerne) 10 GB DDR4 240 GB SSD 1 Gbit / s bis Dezember kostenlos, wenn Sie für einen Zeitraum von sechs Monaten bezahlen, können Sie
hier bestellen.
Dell R730xd 2 mal günstiger? Nur wir haben
2 x Intel Dodeca-Core Xeon E5-2650v4 128 GB DDR4 6 x 480 GB SSD 1 Gbit / s 100 TV von 249 US-Dollar in den Niederlanden und den USA! Lesen Sie mehr über
den Aufbau eines Infrastrukturgebäudes. Klasse mit Dell R730xd E5-2650 v4 Servern für 9.000 Euro für einen Cent?