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 3 Heute sprechen wir über ein System namens 
Native Client , das 
Google in der realen Welt verwendet. Es ist eine Sandbox-Technologie zum Ausführen von Code auf verschiedenen Plattformen. Es wird im 
Chrome-Browser verwendet , sodass Webanwendungen beliebigen Maschinencode ausführen können. Dies ist eigentlich ein ziemlich cooles System. Es zeigt auch Isolationsfunktionen und eine spezielle Sandbox- oder Berechtigungstrennungstechnik, die als 
Softwarefehlerisolation , 
Softwarefehlerisolation bezeichnet wird , ohne das Betriebssystem oder die virtuelle Maschine zum Erstellen der Sandbox zu verwenden.

Stattdessen verwendet der 
native Client einen völlig anderen Ansatz, um bestimmte Anweisungen in einer Binärdatei zu überprüfen und festzustellen, ob die Ausführung sicher ist oder nicht. Bevor wir uns mit den technischen Details des Systems befassen, wollen wir herausfinden, warum diese Leute wirklich Maschinencode ausführen möchten. Ihr besonderes Interesse gilt der Anwendung dieser Lösung in einem Webbrowser, in dem Sie bereits 
JavaScript- Code, 
Flash Player und einige andere Prozesse ausführen können. Warum sind diese Leute so begeistert von der Möglichkeit, Code auf der 
x86- Plattform auszuführen? Immerhin scheint dies ein Rückschritt zu sein.
Teilnehmerin: Sie möchten sehr schnelle Berechnungen erhalten.
Professor: Ja, das ist ein großer Vorteil des Maschinencodes. Auch wenn es auf lange Sicht unsicher sein kann, bietet es eine hohe Leistung. Alles, was Sie in 
JavaScript nicht tun würden, zum Beispiel ein Programm schreiben und kompilieren, wird wirklich viel schneller funktionieren. Gibt es noch andere Gründe?
Zielgruppe: Vorhandenen Code ausführen?
Professor: richtig. Es ist wichtig, dass nicht alles in 
JavaScript geschrieben werden kann. Wenn Sie also eine vorhandene Anwendung oder in der Branchenterminologie „geerbten“ Code haben, den Sie im Internet ausführen möchten, scheint dies eine großartige Lösung zu sein. Da Sie beispielsweise nur eine vorhandene Bibliothek verwenden können, eine komplexe grafische „Engine“, die sowohl auf die Leistung als auch auf viele andere komplexe Dinge reagiert, die Sie nicht erneut implementieren möchten, ist dies eine gute Lösung.
Wenn Sie nur eine neue Webanwendung programmieren, sollten Sie Ihren eigenen Client verwenden, wenn Sie nicht besonders über Vererbung oder Leistung besorgt sind?
Zielgruppe: Dann müssen Sie kein 
JavaScript verwenden .
Professor: Ja, das ist ein guter Grund. Wenn Sie 
JavaScript nicht mögen, müssen Sie es nicht verwenden, oder? Sie können beispielsweise 
C verwenden , 
Python- Code ausführen und in 
Haskell in einer Sprache schreiben, die Sie für geeigneter halten.
Dies ist also eine ziemlich überzeugende Liste von Motivationen für die Ausführung Ihres eigenen Codes in einem Browser, und es ist ziemlich schwierig, Rechte für eine solche Aktion zu erhalten. In nur einer Sekunde werden wir die technischen Details betrachten, und jetzt möchte ich Ihnen eine einfache Schulungsdemo zeigen, die ich von der 
Native Client- Website erhalten habe.

Dies ist recht einfach, da Sie 
C ++ oder ein 
C- Programm in einem Browser ausführen können. Sie können sich diese Webseite ansehen, bei der es sich um eine 
HTML- Datei handelt, die eine Menge 
JavaScript- Code enthält.

Der Grund für das Vorhandensein dieses 
JavaScript- Codes besteht darin, dass Sie mit Teilen des 
nativen Clients interagieren können. In Bezug auf den Betrieb des Browsers bedeutet eine solche Lösung, dass Sie eine Art Webseite haben, die 
JavaScript- Code enthält. Diese Lösung arbeitet mit den Berechtigungen der Seiten und ermöglicht es Ihnen, verschiedene Dinge auf der Webseite selbst zu tun, z. B. unter bestimmten Umständen mit dem Netzwerk zu kommunizieren.
Mit Native Client können Sie Ihr Modul im Browser ausführen, sodass 
JavaScript- Code mit ihm interagieren und eine Antwort erhalten kann. Dies zeigt einen Teil des 
JavaScript- Codes, den der 
native Client benötigt, um mit dem spezifischen 
NaCl- Modul zu interagieren, das wir ausführen möchten.

Und Sie können Nachrichten an dieses Modul senden. Wie wird das gemacht? Sie nehmen das Objekt dieses Moduls in 
JavaScript , nennen es 
postMessage und unterstützen somit das Senden dieser Nachricht an das 
NaCl- Modul. Wenn das 
NaCl- Modul antwortet, startet es die Nachrichtenfunktion in 
JavaScript . In diesem speziellen Fall wird im Browser nur ein Dialogfeld angezeigt.

Auf der 
JavaScript- Seite ist dies also eine ziemlich einfache Webseitenoberfläche. Das einzige, was Sie zusätzlich tun müssen, ist, das 
NaCl- Modul auf diese Weise zuzuweisen. Das heißt, Sie fügen 
hier einfach ein Modul mit einer bestimmten 
ID ein . Am interessantesten ist hier der 
Hallo- Code mit der Erweiterung 
nmf . Er sagt nur, dass es eine ausführbare Datei gibt, die Sie herunterladen und in einer 
NaCl- Umgebung damit arbeiten müssen.

Dieser native Code ist wirklich wie jeder andere C ++ - Code, den Sie schreiben können. Der interessante Teil ist diese 
HandleMessage- Nachrichtenverarbeitungsfunktion.

Dies ist eine 
C ++ - Klasse. Wenn 
JavaScript- Code eine Nachricht an 
Native Code sendet, wird diese Funktion ausgeführt. Es führt eine 
if (message = = 'hello') Prüfung durch. In diesem Fall wird eine Art Antwortzeile erstellt und zurückgesendet. Das ist ziemlich einfaches Zeug. Aber für Einzelheiten versuchen wir, es auszuführen und zu sehen, was passiert.
Wir können einen kleinen Webserver erstellen und ausführen, der diese Seite und das 
Native Client- Modul bedient. Hier kann ich zu dieser 
URL gehen und hier sehen wir die 
NaCl- Webseite. Das Modul erhielt unsere Begrüßungsnachricht von 
JavaScript , antwortete mit einer Zeichenfolge in 
JavaScript und der 
JavaScript- Code löste einen Popup-Dialog mit dieser Antwort aus.

Also funktioniert es wirklich.
Versuchen Sie herauszufinden, ob der 
native Client abstürzen kann. Ich hoffe nicht, aber wir können diesen Code und diesen Puffer nehmen und eine Menge Unsinn darin schreiben, zum Beispiel 65536, und sehen, was passiert.

Ich hoffe, dies sollte nicht zum Absturz meines Browsers führen, da der 
native Client versucht, eine Isolation bereitzustellen. Aber mal sehen, was passiert.
Starten Sie den Webserver neu. Wir sehen, dass der Zugang zum Modul noch erfolgreich ist, unser Browser wurde nicht verletzt. Das Messaging mit dem Client fand jedoch nicht statt, sodass das Dialogfeld fehlt. Schauen wir uns die 
JavaScript- Konsole unten auf der Seite an und sehen wir, dass das 
Native Client- Modul uns über den Ausfall des 
NaCl- Moduls informiert.

Es ist möglich, dass das von mir eingegebene Argument einen Pufferüberlauf oder den Zugriff auf eine falsche Adresse verursacht hat. In jedem Fall kann das 
NaCl- Modul jedoch eine versehentliche Speicherbeschädigung so isolieren, dass der Browser nicht beeinträchtigt wird.
Dies ist eine kurze Demonstration dieses Systems in der Form, in der Sie es als Endbenutzer oder Entwickler verwenden können. Schauen wir uns noch ein paar Beispiele an. Zum Beispiel, wie der 
native Client funktioniert oder warum wir genau dies und kein alternatives Design benötigen.
Wenn Sie also Ihren eigenen Code isolieren möchten, gibt es verschiedene Alternativen, mit denen Sie dies tun können. Tatsächlich hatten Benutzer Probleme mit der Verwendung von Legacy-Code und anderen Sprachen, bevor der 
native Client angezeigt wurde. Sie lösten sie auf verschiedene Weise, die möglicherweise nicht so sicher und bequem waren wie der 
native Client , aber dieselben Isolationsfunktionen bereitstellten.
Was sollten Sie also tun, wenn Sie wirklich Maschinencode in einem Browser ausführen möchten? Eine Option ist das Vertrauen in den Entwickler. Möglicherweise besteht eine Variante dieses Ansatzes darin, dass Sie den Benutzer fragen, ob er einen Code in seinem Browser ausführen möchte oder nicht.
Jeder versteht ungefähr, was für ein Plan das ist, oder? Anstelle all dieser 
Native Client- Kompilierungsstrategie könnte ich beispielsweise einfach ein 
C- Programm erstellen, es in einem Browser ausführen und er würde mich fragen, ob ich diese Site ausführen möchte oder nicht. Und wenn ich auf "Ja" klicke und versehentlich im Speicher des Browsers "mähe", stürzt es ab. Also ist es möglich, richtig? Dies löst natürlich all diese Probleme, aber was ist daran falsch?
Ich denke, das Schlimme ist, dass diese Lösung unsicher ist. Dies ist eine Möglichkeit, dieses System und viele andere Systeme zu umgehen.
Microsoft hatte ein System namens 
ActiveX , das diesen Plan im Grunde implementierte. Sie können die Binärdateien an 
IE , den Browser auf Ihrem Computer, senden. Bis sie mit einem Zertifikat eines bestimmten Entwicklers zurückkehren, das beispielsweise von 
Microsoft oder einer anderen Person signiert wurde, führt der Browser Ihren Code nicht aus. Halten Sie dies für einen nützlichen Plan?
Teilnehmerin: Dies ist Vertrauenssache!
Professor: Ja, das ist es. Sie müssen wirklich ein wenig darauf vertrauen, dass der Entwickler nur die „Binärdateien“ signiert, die nichts falsch machen. Aber es ist oft unmöglich herauszufinden, ob dies eine schlechte Sache ist oder nicht, also schreiben sie einfach 
C- Code und signieren ihn blind, ohne viel Arbeit zu erledigen. In diesem Fall können in Zukunft möglicherweise bestimmte Probleme auftreten.
Ebenso garantiert die Entscheidung, den Benutzer zu fragen, ob er wirklich etwas ausführen möchte, überhaupt keine Sicherheit. Auch wenn der Benutzer vorsichtig sein möchte, ist nicht klar, wie er sich entscheiden soll. Angenommen, ich möchte wirklich verstehen, ob ich dieses Programm funktionieren lassen kann? Mir wurde gesagt, dass alles in Ordnung ist, vielleicht wurde es von seriösen Entwicklern von 
Google.com oder 
Microsoft.com erstellt . Dies ist jedoch die ausführbare Datei 
foo.exe und ich weiß absolut nicht, was sich darin befindet. Selbst wenn ich seinen Code zerlege, wird es sehr schwierig sein zu sagen, ob er etwas Schlechtes tun wird oder nicht. Daher ist es für den Benutzer wirklich schwierig zu entscheiden, ob die Codeausführung für das System sicher ist.

Auf diese Weise kann der 
native Client als Mechanismus fungieren, mit dem Benutzer sicher sein können, ob sie zu einem Programm Ja oder Nein sagen sollen.
In der Praxis sollte meiner Meinung nach letzte Woche eine Option von unserem Gastdozenten Paul Yang vorgeschlagen werden. Er empfahl, das Plugin " 
Play Extension " oder "Play the Extension" im 
Chrome-Browser auszuführen . Das heißt, es stellt sich heraus, dass Sie vor dem Starten einer Erweiterung, einschließlich des 
nativen Clients , auf dieses Element klicken müssen. In gewisser Weise entspricht dies der Frage an den Benutzer. In diesem Fall ist das System jedoch auch dann sicher, wenn der Benutzer mit „Ja“ antwortet, da der 
native Client in die Arbeit 
einbezogen wird . In diesem Sinne haben wir einen doppelten Sicherheitsmechanismus: Fragen Sie zuerst den Benutzer und starten Sie dann mit einer positiven Antwort den Sandbox-Client, damit der Browser nicht abstürzt.
Ein weiterer Ansatz, der angewendet werden sollte, ist die Verwendung der Sandbox, die mithilfe des Betriebssystems oder der Hardware implementiert wird, oder die Isolierung von Prozessen. Dies haben wir in den letzten beiden Vorlesungen untersucht.
Vielleicht würden Sie 
Unix- Isolationsmechanismen verwenden. Wenn Sie etwas komplexeres hätten, würden Sie 
FreeBSD oder 
Capsicum verwenden . Es eignet sich hervorragend zum Isolieren eines Codeteils in der Sandbox, da Sie dessen Funktionen einschränken können. 
Linux hat einen ähnlichen Mechanismus namens 
Seccomp , den wir in der letzten Vorlesung kurz behandelt haben. Er ermöglicht es Ihnen auch, solche Dinge zu tun.
Daher gibt es bereits einen Mechanismus zum isolierten Schreiben von Code auf Ihrem Computer. Warum sind diese Leute gegen die Verwendung dieser bestehenden Lösung? Es scheint, als würden sie aus irgendeinem Grund „das Rad erfinden“. Also, was ist los?
Teilnehmerin: Vielleicht wollen sie Fehler minimieren?
Professor: Ja, in gewisser Weise vertrauen sie dem Betriebssystem nicht. Vielleicht sind sie tatsächlich besorgt über Betriebssystemfehler. Es ist wahrscheinlich, dass der 
FreeBSD- Kernel oder der 
Linux-Kernel ziemlich viel 
C- Code enthält, den sie nicht wollen oder nicht auf Richtigkeit prüfen können, selbst wenn sie wollten. In 
Capsicum oder 
Seccomp erfolgt die Arbeit auf der Grundlage des Isolationsplans. Es reicht also aus, dass der Kernel nur über einen kleinen, zuverlässigen Code verfügt, sodass die Sandbox die Isolation beibehält und anwendet.
 Zielgruppe:
Zielgruppe: Da Sie viel mehr Möglichkeiten zur Verwendung von Browsern haben, müssen Sie sich mit verschiedenen Betriebssystemen wie iOS und Android auseinandersetzen und auf ...
Professor: Ja, eine weitere interessante Überlegung ist, dass normalerweise viele Betriebssysteme Fehler aufweisen. Darüber hinaus sind verschiedene Betriebssysteme in gewisser Weise nicht miteinander kompatibel. Dies bedeutet, dass jedes Betriebssystem seinen eigenen Mechanismus hat, wie hier gezeigt: 
Unix hat 
Capsicum , 
Linux hat 
Seccomp , aber dies sind nur Variationen von 
Unix . 
Mac OS hat 
Sicherheitsgurt , 
Windows hat etwas anderes und die Liste geht weiter.
Letztendlich verfügt jede Plattform, mit der Sie arbeiten, über einen eigenen Isolationsmechanismus. Und was sie wirklich nicht allzu sehr stört, ist, dass sie unterschiedlichen Code für 
Mac , 
Windows und 
Linux schreiben müssen. Dies wirkt sich jedoch mehr darauf aus, wie Sie diese Dinge schreiben, damit sie in der Sandbox funktionieren. Denn im 
Native Client schreiben Sie tatsächlich einen Code, der genauso ausgeführt wird wie der "native" Betriebssystemcode, genauso wie 
Apple- Code, 
Windows- Code oder 
Linux -Systemcode ausgeführt werden.
Wenn Sie diese Isolationsmechanismen verwenden, unterliegen sie tatsächlich unterschiedlichen Einschränkungen für das in der Sandbox platzierte Programm. Sie müssen also ein Programm schreiben, das in der 
Linux- Sandbox ausgeführt wird, ein anderes Programm, das in der 
Windows- Sandbox ausgeführt wird, und so weiter.
Das ist für sie wirklich inakzeptabel. Sie wollen sich nicht mit solchen Problemen befassen. Welche anderen Überlegungen haben Sie?
Zielgruppe: vermutlich Systemleistung. Wenn Sie 
Capsicum verwenden , müssen Sie auf ausreichende Ressourcen achten, um sicherzustellen, dass die Prozesse in der Sandbox funktionieren. Hier können sie das gleiche Problem haben.
Professor: Ja, das stimmt. Der Isolationsplan für Software-Abstürze ist tatsächlich sehr ressourcenintensiv, was auf Betriebssystemebene zu einem Mangel an Ressourcen zur Unterstützung der Sandbox führen kann. Es stellt sich heraus, dass sie in ihrem eigenen 
nativen Client sowohl ihre Sandbox als auch ihre Betriebssystem-Sandbox verwenden, um zusätzliche Sicherheit zu bieten. Tatsächlich gewinnen sie also nicht an der Leistung ihrer Implementierung, obwohl sie dies wahrscheinlich könnten.
Teilnehmerin: Vielleicht wollen sie alles kontrollieren. Da sie steuern können, was im Browser passiert, aber wenn sie es an den Computer des Clients unter dem Betriebssystem senden, wissen sie nicht, was dort passieren könnte.
Professor: Man kann sagen, dass das Betriebssystem möglicherweise Fehler aufweist oder die Sandbox nicht gut genug verwaltet. Oder die Benutzeroberfläche ist etwas anders, sodass Sie nicht wissen, was das Betriebssystem preisgeben wird.
Zielgruppe: Dies verhindert nicht, dass der Code einige schlechte Dinge tut. Es gibt viele Dinge, die Code tut, zum Beispiel, wenn Sie eine statische Analyse durchführen möchten, aber Code-Schleifen verhindern, dass das Programm funktioniert.
Professor: Tatsächlich ist es sehr schwierig festzustellen, ob es einen Prozess mit Endlosschleifen gibt oder nicht, aber im Prinzip können Sie mit diesem Ansatz einige Codeprobleme erkennen. Ich denke, dass ein wirklich interessantes Beispiel, von dem ich bis zum Lesen ihres Artikels nichts wusste, zeigt, dass diese Leute sich Sorgen über Hardwarefehler machen und nicht nur über Betriebssystemschwachstellen, die vom Code ausgeführt werden können. Beispielsweise verfügt der Prozessor selbst über einige Anweisungen, die dazu führen können, dass der Computer einfriert oder neu gestartet wird. Grundsätzlich sollte Ihr Gerät keinen solchen Fehler aufweisen, da das Betriebssystem darauf angewiesen ist, dass die Hardware in jedem Fall dazu beiträgt, den Kernel zu erreichen, um die Folgen eines Benutzerfehlers zu beseitigen.
Aber es stellt sich heraus, dass die Prozessoren so komplex sind, dass sie Fehler haben, und diese Leute sagen, dass sie Beweise dafür gefunden haben. Wenn der Prozessor einige komplexe Anweisungen nicht erwartet hat, wird er gestoppt, anstatt den Systemkern zu verarbeiten. Das ist schlecht. Ich denke, das ist nicht katastrophal, wenn ich nur ein paar nützliche Dinge auf meinem Laptop laufen lasse, aber viel schlimmer, wenn der Computer beim Besuch einer Webseite einfriert.
Daher wollten sie ein höheres Schutzniveau für die 
Native Client- Module schaffen als dasjenige, das eine Isolation auf Betriebssystemebene bietet, auch ohne Hardwarefehler. In Bezug auf Sicherheit verhalten sie sich also wie paranoide, einschließlich des Hardware-Sicherheitsproblems.
Lassen Sie uns nun sehen, wie der 
native Client Prozesse in der Sandbox tatsächlich isoliert. Daher verfolgt der 
native Client einen anderen Ansatz, der als "Isolieren von Softwarefehlern" bezeichnet werden kann.

Es ist nicht geplant, sich darauf zu verlassen, dass das Betriebssystem oder die Ausrüstung die Dinge überprüft, während das Programm ausgeführt wird, sondern sich darauf zu verlassen, dass sie die Anweisungen im Voraus überprüfen und entscheiden, dass sie vollständig sicher ausgeführt werden können. Daher reicht es in der Tat aus, die Binärdatei zu überprüfen, um alle möglichen Anweisungen zu überprüfen und festzustellen, ob sie sicher oder unsicher sind. Sobald Sie entschieden haben, dass alles sicher ist, können Sie den Prozess einfach starten, da Sie wissen, dass er aus sicheren Dingen besteht und keine Fehler auftreten.
Sie sehen sich also fast alle Anweisungen im Binärcode an, der an den Browser gesendet wird, und entscheiden, ob bestimmte Anweisungen sicher sind oder nicht.
? . ? , , .
- 
ALU , , . , . , , . , , , .

? , , . , , , . , «» , ? .
, , , - , . «» , - . , «» , . , , , , .
, ( ) . . , 
if , , . , , – .
, , , . . , , . , , , , «» .

. , , . , , .
, , , , - , . , , , , . 
Trusted Service Runtime , . . 
Google . , 
NaCl .
, , , , , — , — . , .
: , , 
NaCl ? , ?
: , , , 
NaCl . , 
malloc pthread_create , 
Trusted Service Runtime . - , 
Unix , - . , , 
JavaScript -. 
RPC JavaScript , .

, , 
NaCl Unix -, - , -.
. , 
Native Client . – 
Native Client ?
, 
Native Client . , , . , , 
x86 . , , «», .
, . , , 0 256 . , , , , .
? , ?
: , .
: , . , , . , , ? , ?
: .
: !
: -, , . .
: , . , . , , . , , , 
Trusted Service Runtime . , , 
Trusted Service Runtime , . , .
, , 
NaCl , . , 0. , 
NaCl . .
28:00
:
MIT-Kurs "Computer Systems Security". 7: « Native Client», 2.
, . Gefällt dir unser Artikel? Möchten Sie weitere interessante Materialien sehen? Unterstützen Sie uns, indem Sie eine Bestellung 
aufgeben oder sie Ihren Freunden empfehlen. 
Habr-Benutzer erhalten 30% Rabatt 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 $ 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).
3 Monate kostenlos bei Bezahlung eines neuen Dell R630 für einen Zeitraum von sechs Monaten - 2 x Intel Deca-Core Xeon E5-2630 v4 / 128 GB DDR4 / 4 x 1 TB Festplatte oder 2 x 240 GB SSD / 1 Gbit / s 10 TB - ab 99,33 USD pro Monat , nur bis Ende August, Bestellung kann hier sein .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?