Was sind die Sicherheitsrisiken beim Festlegen von Access-Control-Allow-Origin?

124

Ich musste mich vor kurzem auf einstellen Access-Control-Allow-Origin, *um domänenübergreifende Ajax-Anrufe tätigen zu können.
Jetzt kann ich nicht anders, als das Gefühl zu haben, dass ich meine Umgebung Sicherheitsrisiken aussetze.
Bitte helfen Sie mir, wenn ich es falsch mache.

Hamed Momeni
quelle

Antworten:

69

Durch die Antwort mit ermöglicht Access-Control-Allow-Origin: *die angeforderte Ressource die Freigabe für jeden Ursprung. Dies bedeutet im Grunde, dass jede Site eine XHR-Anfrage an Ihre Site senden und auf die Antwort des Servers zugreifen kann, was nicht der Fall wäre, wenn Sie diese CORS-Antwort nicht implementiert hätten.

So kann jede Site im Namen ihrer Besucher eine Anfrage an Ihre Site stellen und deren Antwort verarbeiten. Wenn Sie ein Authentifizierungs- oder Autorisierungsschema implementiert haben, das auf etwas basiert, das automatisch vom Browser bereitgestellt wird (Cookies, Cookie-basierte Sitzungen usw.), werden diese auch von den von Websites Dritter ausgelösten Anforderungen verwendet.

Dies stellt in der Tat ein Sicherheitsrisiko dar, insbesondere wenn Sie die gemeinsame Nutzung von Ressourcen nicht nur für ausgewählte Ressourcen, sondern für jede Ressource zulassen. In diesem Zusammenhang sollten Sie sich ansehen, wann es sicher ist, CORS zu aktivieren. .

Gumbo
quelle
2
Wenn Sie ein konkretes Beispiel dafür geben können, wie der gemeinsame Authentifizierungszugriff ein Sicherheitsrisiko darstellt, werde ich dies positiv bewerten.
Petrus Theron
1
@Gumbo Was ist mit statischen Inhalten? (z. B. statische CDN-Inhalte wie Javascripts, CSS, statische HTML-Dateien usw.) Gibt es Sicherheitsprobleme bei der Einstellung Access-Control-Allow-Origin: *? Es wird kein Nogin usw. geben, sie sind für alle öffentlich?
Umut Benzer
2
@UmutBenzer Das ist ok.
Gumbo
25
Tatsächlich ist diese Antwort gemäß dem aktuellen CORS-Standard nicht ganz richtig : "Die Zeichenfolge '*' kann nicht für eine Ressource verwendet werden, die Anmeldeinformationen unterstützt." Sie können eine Anforderung daher nicht erzwingen, die vorübergehende Authentifizierung in Form von Cookies, zwischengespeicherter HTTP-Authentifizierung oder Client-SSL-Zertifikaten zu verwenden. Wenn die Website beispielsweise lokalen Speicher zur Authentifizierung verwenden würde, wäre dies ein Problem.
Niklas B.
2
@NiklasB: Ich habe dieses Szenario ausprobiert und Chrome folgt dem von Ihnen erwähnten CORS-Standard. dh die Zeichenfolge " " wird bei einer Anforderung von Anmeldeinformationen nicht unterstützt. Von Chrome wird Folgendes gemeldet: "XMLHttpRequest kann localhost nicht laden : 12346 / hallo . Ein Platzhalter ' ' kann nicht im Header 'Access-Control-Allow-Origin' verwendet werden, wenn das Anmeldeinformationsflag wahr ist. Origin ' localhost: 12345 ' ist daher kein Zugriff zulässig. Der Anmeldeinformationsmodus einer XMLHttpRequest wird durch das Attribut withCredentials gesteuert. "
Faktotum
37

Access-Control-Allow-Origin: *Das Hinzufügen zu jeder Ressource ist absolut sicher, es sei denn , diese Ressource enthält private Daten, die durch andere als die Standardanmeldeinformationen (Cookies, Basisauthentifizierung, TLS-Clientzertifikate) geschützt sind.

ZB: Durch Cookies geschützte Daten sind sicher

Stellen Sie sich vor https://example.com/users-private-data, Sie können je nach Anmeldestatus des Benutzers private Daten verfügbar machen. Dieser Status verwendet ein Sitzungscookie. Das Hinzufügen zu dieser Ressource ist sicherAccess-Control-Allow-Origin: * , da dieser Header nur dann den Zugriff auf die Antwort ermöglicht, wenn die Anforderung ohne Cookies erfolgt und Cookies erforderlich sind, um die privaten Daten abzurufen. Infolgedessen gehen keine privaten Daten verloren.

Beispiel: Daten, die durch Standort / IP / internes Netzwerk geschützt sind, sind nicht sicher (leider häufig bei Intranets und Haushaltsgeräten):

Stellen Sie sich vor https://intranet.example.com/company-private-data, Sie legen private Unternehmensdaten offen, auf die jedoch nur zugegriffen werden kann, wenn Sie sich im WLAN-Netzwerk des Unternehmens befinden. Das Hinzufügen zu dieser Ressource ist nicht sicherAccess-Control-Allow-Origin: * , da sie durch andere als die Standardanmeldeinformationen geschützt ist. Andernfalls könnte ein schlechtes Skript Sie als Tunnel zum Intranet verwenden.

Faustregel

Stellen Sie sich vor, was ein Benutzer sehen würde, wenn er in einem Inkognito-Fenster auf die Ressource zugreifen würde. Wenn Sie mit allen zufrieden sind, die diesen Inhalt sehen (einschließlich des Quellcodes, den der Browser erhalten hat), können Sie ihn sicher hinzufügen Access-Control-Allow-Origin: *.

JaffaTheCake
quelle
sollte "da nur Anfragen ohne Cookies zulässig sind" "da nur Anfragen mit Cookies zulässig sind"?
DJCordhose
3
@ DJCordhose Nr. Access-Control-Allow-Origin: *erlaubt nur Anfragen ohne Cookies. Ich habe die Antwort bearbeitet, um ein wenig zu klären.
JaffaTheCake
Was ist der Unterschied zwischen "*" und Groß- / Kleinschreibung ohne diesen Header? Ist es das Gleiche?
Nigrimmist
Ich würde es lieben, wenn "Andernfalls könnte ein schlechtes Skript Sie als Tunnel zum Intranet verwenden" weiter erklärt werden könnte.
Sam Rueby
@Nigrimmist Dann schlägt die Preflight-Anfrage fehl und der Ressourcenzugriff wird blockiert
iamareebjamal
9

AFAIK, Access-Control-Allow-Origin ist nur ein http-Header, der vom Server an den Browser gesendet wird. Wenn Sie es auf eine bestimmte Adresse beschränken (oder deaktivieren), wird Ihre Site beispielsweise für Roboter nicht sicherer. Wenn Roboter wollen, können sie den Header einfach ignorieren. Die regulären Browser (Explorer, Chrome usw.) berücksichtigen standardmäßig den Header. Aber eine Anwendung wie Postman ignoriert sie einfach.

Das Serverende überprüft nicht wirklich, woher die Anfrage stammt, wenn es die Antwort zurückgibt. Es wird nur der http-Header hinzugefügt. Es ist der Browser (das Client-Ende), der die Anforderung gesendet hat, die entscheidet, den Header für die Zugriffssteuerung zu lesen und darauf zu reagieren. Beachten Sie, dass im Fall von XHR möglicherweise eine spezielle 'OPTIONS'-Anforderung verwendet wird, um zuerst nach den Headern zu fragen.

Jeder mit kreativen Skriptfähigkeiten kann den gesamten Header leicht ignorieren, unabhängig davon, was darin festgelegt ist.

Siehe auch Mögliche Sicherheitsprobleme beim Festlegen von Access-Control-Allow-Origin .


Nun, um die Frage tatsächlich zu beantworten

Ich kann nicht anders, als das Gefühl zu haben, dass ich meine Umgebung Sicherheitsrisiken aussetze.

Wenn jemand Sie angreifen möchte, kann er die Access-Control-Allow-Origin leicht umgehen. Wenn Sie jedoch '*' aktivieren, geben Sie dem Angreifer ein paar weitere 'Angriffsvektoren', mit denen er spielen kann, z. B. mit normalen Webbrowsern, die diesen HTTP-Header berücksichtigen.

Commonpike
quelle
6
Betrachten Sie dies aus der Sicht eines unachtsamen Endbenutzers. Jemand kann eine bösartige Webseite einrichten, die JavaScript einfügt, um Daten zwischen der realen Site und einer bösartigen Site zu übertragen (sagen wir, sie möchten Ihr Passwort stehlen). Der Webbrowser des Endbenutzers blockiert normalerweise diese standortübergreifende Kommunikation. Wenn jedoch Access-Control-Allow-Origin festgelegt ist, ist dies zulässig, und der Endbenutzer ist nicht klüger.
Brain2000
3
Ja, das Einstellen Access-Control-Allow-Origin *auf einer bösartigen Website, auf der Skripte zum Stehlen von Passwörtern
gehostet werden,
6
@commonpike Sie haben Recht, dass jemand ein Skript erstellen könnte, um den Header einfach vollständig zu ignorieren. Wenn auf die Daten zugegriffen werden kann, kann mit oder ohne CORS-Header darauf zugegriffen werden. Es gibt noch einen anderen Angriffsvektor, den Sie nicht berücksichtigen. Angenommen, ich logge mich auf der Website meiner Bank ein. Wenn ich auf eine andere Seite gehe und dann zu meiner Bank zurückkehre, bin ich immer noch wegen eines Cookies angemeldet. Andere Benutzer im Internet können in meiner Bank dieselben URLs wie ich verwenden, können jedoch ohne das Cookie nicht auf mein Konto zugreifen. Wenn Cross-Origin-Anfragen zulässig sind, kann sich eine böswillige Website effektiv als ...
Brad
5
@commonpike ... der Benutzer. Anders ausgedrückt, Sie könnten einfach meine Site besuchen (die sogar eine normale Site sein könnte, ohne dass etwas Verdächtiges vorliegt ... vielleicht ist es eine echte legitime Site, die gerade entführt wurde!), Aber etwas JavaScript, das HTTP-Anfragen an Ihre Bank sendet, um einige zu übertragen Geld auf mein Konto. Die Bank kennt den Unterschied zwischen Anfragen von ihren Seiten oder Anfragen von anderen Seiten nicht. Beide haben dieses Cookie, mit dem die Anforderung erfolgreich ausgeführt werden kann.
Brad
3
@commonpike Lassen Sie mich Ihnen ein häufigeres Beispiel geben ... eines, das ständig vorkommt. Angenommen, Sie haben einen gemeinsamen Heimrouter, z. B. einen Linksys WRT54g oder ähnliches. Angenommen, der Router erlaubt Ursprungsübergreifende Anforderungen. Ein Skript auf meiner Webseite kann HTTP-Anforderungen an allgemeine Router-IP-Adressen (wie 192.168.1.1) stellen und Ihren Router neu konfigurieren, um Angriffe zuzulassen. Es kann Ihren Router sogar direkt als DDoS-Knoten verwenden. (Die meisten Router haben Testseiten, die Pings oder einfache HTTP-Serverprüfungen ermöglichen. Diese können massenhaft missbraucht werden.)
Brad
7

Hier sind 2 Beispiele als Kommentare, wenn ein Platzhalter wirklich problematisch ist:

Angenommen, ich logge mich auf der Website meiner Bank ein. Wenn ich auf eine andere Seite gehe und dann zu meiner Bank zurückkehre, bin ich immer noch wegen eines Cookies angemeldet. Andere Benutzer im Internet können in meiner Bank dieselben URLs wie ich verwenden, können jedoch ohne das Cookie nicht auf mein Konto zugreifen. Wenn originensübergreifende Anfragen zulässig sind, kann sich eine böswillige Website effektiv als Benutzer ausgeben.

- Brad

Angenommen, Sie haben einen gemeinsamen Heimrouter, z. B. einen Linksys WRT54g oder ähnliches. Angenommen, der Router erlaubt Ursprungsübergreifende Anforderungen. Ein Skript auf meiner Webseite kann HTTP-Anforderungen an allgemeine Router-IP-Adressen (wie 192.168.1.1) senden und Ihren Router neu konfigurieren, um Angriffe zuzulassen. Es kann Ihren Router sogar direkt als DDoS-Knoten verwenden. (Die meisten Router verfügen über Testseiten, die Pings oder einfache HTTP-Serverprüfungen ermöglichen. Diese können massenhaft missbraucht werden.)

- Brad

Ich bin der Meinung, dass diese Kommentare Antworten sein sollten, weil sie das Problem anhand eines Beispiels aus dem wirklichen Leben erklären.

Christian Gollhardt
quelle
8
Nur dass das nicht funktioniert. "Die Zeichenfolge '*' kann nicht für eine Ressource verwendet werden, die Anmeldeinformationen unterstützt." w3.org/TR/cors/#resource-requests
Bayo
@bayotop Wie unterscheidet der Browser zwischen Seiten, für die eine Authentifizierung erforderlich ist, und Seiten mit anderen Daten in den Kopfzeilen?
Wedstrom
Nach dem Lesen des bereitgestellten Links wird das Flag "Unterstützte Anmeldeinformationen" verwendet, das für diesen Zweck verwendet wird. Es scheint manuell gesetzt zu werden. Wenn also jemand nicht wusste, wie man CORS richtig einrichtet, könnte er dieses Flag vermutlich auch falsch verstehen. Daher glaube ich, dass die oben genannten Sicherheitslücken möglich sind.
Wedstrom
2
@wedstrom Das Flag wird von demjenigen gesetzt, der die Anfrage stellt. Wie auch immer, die obigen Szenarien sind Beispiele für CSRF-Angriffe. Wenn Sie den Ursprung '*' zulassen, werden Sie nicht anfälliger als bisher (möglicherweise in seltenen Fällen ein wenig). In den meisten Fällen können Sie die böswillige standortübergreifende Anfrage mithilfe von Formularen stellen, sodass CORS keine Rolle spielt. In Fällen, in denen Sie eine AJAX-Anfrage ausführen müssen, werden Anfragen vor dem Flug gestört (dies ist der Punkt, an dem der Browser eingeht, wenn ACAO: '*' und Access-Control-Allow-Credentials: 'true').
Bayo