it-swarm.com.de

Wie schützt das Setzen von Origin auf null in einer umgeleiteten CORS-Anforderung vor einem verwirrten stellvertretenden Angriff?

Auszug aus hier :

Wenn eine Origin-übergreifende Ressource an einem neuen Origin zu einer anderen Ressource umleitet, setzt der Browser den Wert des Origin-Headers nach der Umleitung auf null. Dies verhindert zusätzliche verwirrte stellvertretende Angriffe, verursacht jedoch die Kosten für das transparente Verschieben von CORS-Ressourcen, die (Cookie-basierte) Anmeldeinformationen und einfache Anforderungen unterstützen, domänenübergreifend mit 3xx-Statuscodes, wie dies bei Nicht-CORS-Ressourcen möglich ist. Es ist möglich, Ressourcen mit demselben Ursprung an einen Ursprungsort umzuleiten (nur einzelner Hop), da Browser den CORS-Algorithmus transparent auf solche Anforderungen anwenden und den Origin-Header für den ersten Hop einschließen.

Wie würde das Beibehalten des Origin-Headers für die umgeleitete Anforderung einen verwirrten stellvertretenden Angriff ermöglichen?

10
Raniz

Dieser Absatz ist knapp geschrieben, und die Verwendung von "Weiterleitungen zu einer anderen Ressource an einem neuen Ursprung" im ersten Satz ist nicht ganz richtig.

Hier ist ein einfaches Beispiel. Angenommen, Sie sind böswillig, und es gibt eine Webanwendung, die die Dienste einer privilegierten API über CORS verwendet, sodass der Ursprung der Webanwendung von der privilegierten API als vertrauenswürdig eingestuft wird. Angenommen, Sie möchten Zugriff auf die Daten hinter dieser privilegierten API erhalten, aber Ihr Ursprung ist natürlich nicht vertrauenswürdig.

Sie erstellen einen einfachen nützlichen Dienst, den Sie über CORS anbieten, und Sie erhalten die Webanwendung, um Ihren Dienst in eine Seite - eine beliebige Seite - unter ihrem vertrauenswürdigen Ursprung aufzunehmen. Diese Seite muss nicht auf die privilegierte API zugreifen.

(Sobald Sie auf der Seite Ihres Opfers sind, können Sie natürlich tun, was Sie wollen, aber tragen Sie es mit mir.)

Wenn Sie sich dafür entscheiden, Ihren CORS-Dienst von der Ausgabe eines 200 mit einigen Daten zu ändern, um einen 3xx an die privilegierten API-übergreifenden Ressourcendomänen auszugeben, entsteht ein Vertrauensproblem.

Der tatsächliche Ursprung - die Seite, auf der Ihre Ressource eingebettet ist - wird von der privilegierten API als vertrauenswürdig eingestuft. Die Anforderung wurde jedoch nicht ausgegeben, und möglicherweise möchte sie zu diesem bestimmten Zeitpunkt nicht mit der privilegierten API sprechen.

Stattdessen haben Sie die Umleitung ausgegeben, und obwohl Sie teilweise vom Ursprung als vertrauenswürdig eingestuft werden, wird Ihnen von der privilegierten API nicht vertraut. Wenn der Browser Ihrem 3xx folgt und den Origin mitsendet, können Sie das Vertrauen, das die privilegierte API dem Origin entgegenbringt, unrechtmäßig zurücknehmen.

Was soll der Browser tun? Eine vernünftige Antwort ist, dem 3xx überhaupt nicht zu folgen, aber das würde Anwendungsfälle verbieten, für die Vertrauen nicht von Bedeutung ist. Das Ausgeben der Anforderung mit einem "null" Origin ermöglicht diese Anwendungsfälle, verhindert jedoch die Ausnutzung des Vertrauens, das das Senden entlang des ursprünglichen Origin-Headers ermöglichen würde.

8
Jonah Benton

Sehen Sie sich den Origin-Header in Bezug auf die CSRF-Verteidigung an.

Sagen wir a.com Hosts ...

Wenn der Ursprung nach originübergreifenden Weiterleitungen beibehalten würde, wäre der folgende CSRF-Angriff möglich:

  1. Ein Benutzer meldet sich auf der Website a.com an.
  2. Der Benutzer besucht eine Seite, die eine CORS-Anfrage an b.com mit Origin: https://a.com Stellt.
  3. b.com antwortet mit einer Umleitung zu einem CSRF-geschützten Endpunkt auf a.com.
  4. Der Browser des Benutzers folgt der Umleitung und fordert die URL mit Origin: https://a.com An.
  5. Der a.com Server verarbeitet die Anfrage, weil er glaubt, dass sie von a.com stammt, was nicht ganz korrekt ist, weil ...

    • b.com hatte die volle Kontrolle über die angeforderte URL, einschließlich der Abfrageparameter.
    • alle Daten im Anfragetext wären ursprünglich für b.com bestimmt gewesen, nicht für a.com, und die Datennutzlast wurde möglicherweise sorgfältig erstellt schädlich, wenn an den Endpunkt a.com gesendet. (Nehmen wir an, es war ein POST mit einer 307-Weiterleitung.)

Die Tatsache, dass a.com CORS-Anfragen an b.com stellt, bedeutet nicht, dass es b.com vollständig vertraut .

Dies wird in einem verwandten Chrome Fehler: https://bugs.chromium.org/p/chromium/issues/detail?id=465517 besprochen


Wenn der Origin-Header eine Liste aller Ursprünge in der Umleitungskette enthält, können möglicherweise Anwendungen erstellt werden, die originübergreifende Weiterleitungen sicher tolerieren. Leider haben die Browser-Anbieter das nie implementiert. Aus demselben CORS for Developers-Dokument zitiert in der Frage:

Obwohl die CORS-Spezifikation impliziert, dass Sie mehrere Ursprünge im Header Access-Control-Allow-Origin auflisten können, ist in der Praxis von allen modernen Browsern nur ein einziger Wert zulässig. Die Mehrwertsyntax sollte ermöglichen, dass alle Ursprünge in einer Umleitungskette aufgelistet werden, wie dies in RFC6454 zulässig ist. Dies wurde jedoch nie implementiert.

3
Andre D