Wie kann ich sicherstellen, dass meine über ein CDN gelieferten JavaScript-Dateien nicht geändert werden?

88

Ich arbeite an einem Szenario, in dem einige JavaScript-Dateien auf einem CDN gehostet werden sollen. Ich möchte einen Mechanismus haben, damit ich beim Herunterladen dieser Dateien auf der Benutzerseite sicherstellen kann, dass die Dateien nicht manipuliert wurden und tatsächlich vom angegebenen CDN stammen.

Ich verstehe, dass die Aufgabe sehr einfach ist, wenn ich SSL verwende, aber ich möchte trotzdem sicherstellen, dass die richtigen Dateien auch auf HTTP ohne SSL bereitgestellt werden.

Soweit ich suchen konnte, gibt es keinen Mechanismus wie die digitale Signatur für JavaScript-Dateien, der plattformübergreifend unterstützt wird. Vielleicht wird es nicht benötigt?

Ist in Browsern eine Methode integriert, mit der der Autor der JavaScript-Dateien überprüft werden kann? Kann ich irgendetwas tun, um dies auf sichere Weise zu tun?

baba26
quelle
13
Obwohl ich diese Frage interessant finde, ist sie nicht nicht zum Thema?
evolutionxbox
20
Warum sollten Sie Dateien auf http bereitstellen?
NJZK2
12
"Aber warum gibt es keinen solchen Mechanismus?" Weil es wirklich schwer ist . Sobald Ihre Daten Ihren Server verlassen haben, ist es Toast. HTTPS hilft, aber wenn es sich um eine einfache HTTP-Verbindung handelt, kann jede Validierung fehlschlagen (oder besser gesagt - bestehen). Ein MITM-Angriff kann nur Ihre erwartete Signatur und / oder die Signatur dessen ändern, was Ihnen zur Verfügung gestellt wird, bevor der Browser die Erwartungen erfüllt. Wenn der Benutzer also eine Nutzlast erhält, wird dies als absolut sicher angesehen ... wenn dies nicht unbedingt der Fall ist.
VLAZ
4
"Aber warum gibt es keinen solchen Mechanismus?" Weil es in HTTPS bereits eine billige, effektive und allgemein anwendbare Lösung gibt.
Kevin Krumwiede
9
Dies sollte wahrscheinlich auf ServerFault oder Security erfolgen, da es wirklich darum geht, Dateien auf sichere Weise bereitzustellen, und jede Beziehung zur Programmierung nur insofern tangential ist, als diese Dateien zufällig Quellcode darstellen.
underscore_d

Antworten:

140

Tatsächlich wird eine solche Funktion derzeit unter dem Namen Subresource Integrity entworfen . Schauen Sie sich das integrityAttribut des <script>Tags an. Obwohl es noch nicht vollständig angenommen wurde , erfüllt es genau diesen Zweck.

integrity

Enthält Inline-Metadaten, mit denen ein Benutzeragent überprüfen kann, ob eine abgerufene Ressource ohne unerwartete Manipulation bereitgestellt wurde. Siehe Subressourcenintegrität.

Quelle

Subresource Integrity (SRI) ist eine Sicherheitsfunktion, mit der Browser überprüfen können, ob Dateien, die sie abrufen (z. B. von einem CDN), ohne unerwartete Manipulation bereitgestellt werden. Es ermöglicht Ihnen, einen kryptografischen Hash bereitzustellen, mit dem eine abgerufene Datei übereinstimmen muss.

Quelle


Beispiel:

<script src="https://example.com/example-framework.js"
    integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
    crossorigin="anonymous"></script>

Beachten Sie jedoch, dass dies Sie nicht vor Man in the Middle-Angriffen schützt, wenn Sie Ihre Ressourcen über einfaches HTTP übertragen. In diesem Fall kann der Hash-Code vom Angreifer gefälscht werden, wodurch die Verteidigung gegen manipulierte Skriptdateien unbrauchbar wird.

Aus diesem Grund sollten Sie zusätzlich zu den oben beschriebenen Sicherheitsmaßnahmen immer sichere HTTPS-Verbindungen anstelle von einfachem HTTP verwenden.

Timo
quelle
9
Ich denke, es ist erwähnenswert, dass die Integritätsprüfung leicht gefälscht werden kann, vorausgesetzt, OP plant, ihren HTML-Code in HTTP sowie seine Asset-Dateien zu senden. Wenn ihre Site HTTPS ist und sie Assets über HTTP bereitstellen möchten, werden die meisten Browser dies nicht mögen und die HTTP-Assets stillschweigend ignorieren.
MonkeyZeus
3
@MonkeyZeus Dies wäre jedoch nur im Falle eines MITM-Angriffs oder wenn unser eigener Server kompromittiert ist, richtig? Mein Verständnis ist, dass die Frage ausdrücklich fragt, wie man sich gegen ein kompromittiertes CDN verteidigt.
Timo
10
@ TimoSta Genau! Ohne diese Überprüfungen kann https://code.jquery.com/jeder, der Kompromisse code.jquery.comeingeht, Ihre Site mit XSS versehen, unabhängig davon, ob code.jquery.comüber HTTPS auf sie zugegriffen wird oder nicht . Mit diesen Überprüfungen kann der Angreifer das Laden der Skripte nur verhindern und nicht durch böswillige ersetzen.
Ajedi32
1
@MonkeyZeus Ich habe meiner Antwort eine Notiz hinzugefügt, in der Ihre Bedenken dargelegt werden. Stimmen Sie dem Wortlaut zu?
Timo
1
@ TimoSta Sehr schön, ich mag es! Übrigens habe ich +1 gemacht, noch bevor ich meinen ersten Kommentar gepostet habe :-)
MonkeyZeus
36

Sie suchen nach Integritätsprüfungen für Unterressourcen .

Hier ist zum Beispiel das jQuery-CDN-Snippet:

<script src="https://code.jquery.com/jquery-3.1.0.js"
        integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk="
        crossorigin="anonymous"></script>
Brian
quelle
2
Völlig nutzlos, da ein Angreifer das Integritätsfeld ändern kann, während er das heruntergeladene Skript ändert.
Leichtigkeitsrennen im Orbit
15
@LightnessRacesinOrbit: Nicht, wenn Sie Ihre eigene Domain steuern, auf die über HTTPS zugegriffen wird, aber nicht steuern code.jquery.com. Dies kann Sie vor einer Gefährdung schützen code.jquery.com.
SilverlightFox
2
@ SilverlightFox: Okay, völlig nutzlos gegen MITM-Angriffe *
Leichtigkeitsrennen im Orbit
@ LightnessRacesinOrbit Ja. Immer noch sehr nützlich und hätte diesen Angriff zum Beispiel verhindert: bleepingcomputer.com/news/security/…
Adrian Mouat
6

Haftungsausschluss: Wie immer sollten Sie diese Mechanismen nur bei der Verwendung von https als nützlich erachten, da sie über MitM mit http problemlos deaktiviert werden können

Zusätzlich zu dem Mechanismus in den obigen Antworten können Sie auch die http-Antwortheader der Inhaltssicherheitsrichtlinie auf der übergeordneten Seite verwenden.

http://www.html5rocks.com/de/tutorials/security/content-security-policy/

Inhaltssicherheitsrichtlinie: script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng ='

Hier sind einige Dinge zu beachten. Das Präfix sha * - gibt den Algorithmus an, mit dem der Hash generiert wird. Im obigen Beispiel wird sha256- verwendet. CSP unterstützt auch sha384- und sha512-. Berücksichtigen Sie beim Generieren des Hashs nicht die Tags. Auch Groß- und Kleinschreibung und Leerzeichen spielen eine Rolle, einschließlich führender oder nachfolgender Leerzeichen.

Mit Chrome 40 oder höher können Sie DevTools öffnen und dann Ihre Seite neu laden. Die Registerkarte Konsole enthält Fehlermeldungen mit dem richtigen sha256-Hash für jedes Ihrer Inline-Skripte.

Dieser Mechanismus gibt es schon seit einiger Zeit, daher ist die Browserunterstützung wahrscheinlich ziemlich gut. Überprüfen Sie dies unbedingt.

Wenn Sie außerdem sicherstellen möchten, dass ältere, nicht kompatible Browser nicht unsicher sind, können Sie oben auf der Seite ein synchrones Umleitungsskript einfügen, das von der Richtlinie nicht zugelassen wird.

Fabio Beltramini
quelle
gibt es schon seit einiger Zeit, aber die Browserunterstützung ist nicht besonders gut. caniuse.com/subresource-integrity
Sp0T
@ Sp0t - Die Subressourcenintegrität (worum es in Ihrem Link geht) ist der Mechanismus in den anderen Antworten. Meine Antwort bezieht sich auf Richtlinien zur Inhaltssicherheit, die viel besser unterstützt werden
Fabio Beltramini,
3

Es gibt einen wichtigen Punkt darüber, was diese Art der Unterzeichnung kann und was nicht. Es kann den Benutzer vor hypothetischen Angriffen schützen, bei denen jemand Ihren Code ändert. Es kann Ihrer Site nicht versichern, dass Ihr Code der ausgeführte Code ist. Mit anderen Worten, Sie können immer noch nichts vertrauen, was vom Client auf Ihre Website gelangt.

ddyer
quelle
2

Wenn Ihr gegnerisches Modell einem Angreifer erlaubt, JavaScript-Dateien so zu ändern, wie sie von einem CDN übermittelt werden, erlaubt Ihr gegnerisches Modell einem Angreifer, die übermittelte verweisende Quelle zu ändern, um jeden Überprüfungsversuch zu entfernen und die Quelladresse in eine andere als zu ändern das CDN und / oder den Verweis auf das JavaScript vollständig zu entfernen.

Lassen Sie uns nicht die Dose mit Würmern öffnen, mit denen Ihre Anwendung feststellen kann, ob der Resolver des Benutzers über HTTP-Anforderungen (oder einen anderen Mechanismus ohne überprüfte Vertrauenskette) korrekt in das CDN aufgelöst wird oder nicht.

/ etc / hosts:

#  ...
1.2.3.4    vile-pirates.org    trustworthy.cdn
#  ...
Eric Towers
quelle
2
Der erste Satz ist eindeutig falsch. Was passiert, wenn die verweisende Seite über HTTPS und die JavaScript-Datei über HTTP-not-S geladen wird?
user253751
Oder was ist, wenn das CDN selbst kompromittiert ist, aber nicht Ihr eigener Server?
Ajedi32
@immibis: Ich gehe davon aus, dass OP nicht so irrational ist, dass ich ein solches Szenario vorschlage.
Eric Towers
1
@immibis Ist das nicht der Grund, warum Browser HTTPS-Seiten im Allgemeinen nicht erlauben, JS über HTTP zu laden?
Barmar
1
@immibis Ich sagte, dass es eine Situation verbessert, die nicht einmal möglich ist, weil Browser es nicht zulassen.
Barmar
1

Sie können dies mit Subresource Integrity sicherstellen. Viele öffentliche CDNs enthalten SRI-Hashes im einbettbaren Code, der auf CDN-Websites angeboten wird. Wenn Sie beispielsweise auf PageCDN auf der jQuery-CDN- Seite auf jquery file klicken , können Sie entweder die URL kopieren oder das Skript-Tag verwenden, das den folgenden SRI-Hash enthält:

<script src="https://pagecdn.io/lib/jquery/3.4.1/jquery.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>

Beim Laden der Seite gibt der Browser eine Anforderung für diese Ressource aus und nach Abschluss der Anforderung wird der Hash der empfangenen Datei mit dem Hash abgeglichen, der als Integritätswert im Skript-Tag angegeben ist. Wenn beide Hashes nicht übereinstimmen, verwirft der Browser die JQuery-Datei.

Derzeit wird diese Funktion von 91% der Browser weltweit unterstützt. Weitere Details zu caniuse .

5377037
quelle