Защита CSRF с заголовком CORS Origin по сравнению с токеном CSRF

103

Этот вопрос касается только защиты от атак с подделкой межсайтовых запросов.

В частности, речь идет о том, насколько эффективна защита с помощью заголовка Origin (CORS) и защита с помощью токена CSRF?

Пример:

  • Алиса вошла в систему (используя cookie) в своем браузере на https://example.com . Я предполагаю, что она использует современный браузер.
  • Алиса посещает https://evil.com , а клиентский код evil.com выполняет какой-то запрос к https://example.com (классический сценарий CSRF).

Так:

  • Если мы не проверим заголовок Origin (на стороне сервера) и токен CSRF, у нас будет дыра в безопасности CSRF.
  • Если мы проверим токен CSRF, мы в безопасности (но это немного утомительно).
  • Если мы проверим заголовок Origin, запрос от клиентского кода evil.com должен быть заблокирован так же, как и при использовании токена CSRF, за исключением случаев, когда код evil.com может каким-то образом установить заголовок Origin.

Я знаю, что это невозможно с XHR (см., Например, Безопасность для совместного использования ресурсов между источниками ), по крайней мере, нет, если мы верим, что спецификация W3C будет правильно реализована во всех современных браузерах (можем ли мы?)

Но как насчет других типов запросов - например, отправки формы? Загружаете тег script / img / ...? Или каким-либо другим способом, который страница может использовать для (легального) создания запроса? А может, какой-нибудь известный взлом JS?

Примечание: я не говорю о

  • нативные приложения,
  • манипулируемые браузеры,
  • ошибки межсайтового скриптинга на странице example.com,
  • ...
Крис Леркер
источник
1
Я считаю, что многие прокси удаляют заголовок origin.
thefourtheye
А для тегов отправки формы и img / script мы должны полагаться на CSP, хотя не уверены в старых браузерах.
thefourtheye
3
@thefourtheye: поскольку соединение инициируется через TLS, у пользователя есть гораздо более серьезная проблема, чем у CSRF, если прокси-сервер может перебить его / ее.
Perseids
2
@thefourtheye, зачем им раздеваться Origin? Это свело бы на нет защиту CORS.
Пол Дрейпер
1
Мне нравится этот вопрос и ответы на него, потому что они о чем-то конкретном, но они также напоминают мне о разнице между CSRF и CORS. (Я признаю, что это нелегко спутать понятия ... Но мне все же удается их запутать.)
Красный горошек,

Ответы:

41

знайте, что это невозможно с XHR (см., например, Безопасность для совместного использования ресурсов между источниками), по крайней мере, нет, если мы доверяем спецификации W3C, которая будет правильно реализована во всех современных браузерах (можем ли мы?)

В конце концов, вы должны «доверять» клиентскому браузеру безопасное хранение данных пользователя и защиту клиентской части сеанса. Если вы не доверяете клиентскому браузеру, вам следует вообще прекратить использование Интернета для чего-либо, кроме статического контента. Даже с использованием токенов CSRF вы доверяете клиентскому браузеру правильно соблюдать политику одного и того же происхождения .

Хотя в браузере уже были уязвимости, например, в IE 5.5 / 6.0, когда злоумышленники могли обойти политику одного и того же происхождения и выполнить атаки, обычно вы можете ожидать, что они будут исправлены, как только обнаружены, и большинство браузеров будут автоматически обновляться. , этот риск будет в основном снижен.

Но как насчет других типов запросов - например, отправки формы? Загружаете тег script / img / ...? Или каким-либо другим способом, который страница может использовать для (легального) создания запроса? А может, какой-нибудь известный взлом JS?

OriginЗаголовок , как правило , отправляется только для запросов кросс-доменных XHR. Запросы изображений не содержат заголовок.

Примечание: я не говорю о

  • нативные приложения,

  • манипулируемые браузеры,

  • ошибки межсайтового скриптинга на странице example.com,

Я не уверен, относится ли это к управляемым браузерам или нет, но старые версии Flash допускали установку произвольных заголовков, которые позволяли бы злоумышленнику отправить запрос с поддельным refererзаголовком с машины жертвы для выполнения атаки.

SilverlightFox
источник
Пример Flash - хороший пример, и, возможно, другие плагины могут иметь аналогичную уязвимость. Я могу (к сожалению) защитить Алису от CSRF, только если она использует современный браузер и т. Д., Это ясно. Но вполне разумно, что даже будучи осведомленным о безопасности пользователем, она могла установить сторонние плагины, особенно если они принадлежат крупным (заслуживающим доверия) компаниям. Даже если они могут писать безопасные плагины, я не уверен на 100%, если они также думают о CSRF! Поэтому, если песочницы браузера не ограничивают плагины от нарушения SOP (может быть?), Я бы рекомендовал придерживаться токена CSRF.
Chris Lercher
@ChrisLercher: Да, современные плагины кажутся немного более надежными. Однако в любой момент может быть выпущена новая версия, которая позволит злоумышленнику использовать ее таким образом, чтобы обойти защиту браузера. Лучший способ справиться с этим (например, токен / заголовок) будет зависеть от конфиденциальности ваших данных и приемлемости такого риска. Flash действительно подчиняется СОП, но источником плагина Flash является сайт, с которого он был загружен (а не вызывающий сайт, такой как JavaScript). Существует crossdomain.xmlвозможность включения междоменного взаимодействия.
SilverlightFox
27

Веб-контент не может вмешиваться в заголовок Origin. Более того, согласно той же политике происхождения, один источник не может даже отправлять настраиваемые заголовки в другие источники. [1]

Таким образом, проверка заголовка Origin так же хорошо блокирует атаки, как и использование токена CSRF.

Основное беспокойство при использовании этого метода заключается в том, позволяет ли он работать всем законным запросам. Спрашивающий знает об этой проблеме и установил вопрос, чтобы исключить основные случаи (без старых браузеров, только HTTPS).

Производители браузеров следуют этим правилам, но как насчет плагинов? Может и нет, но вопрос не принимает во внимание «манипулируемые браузеры». А как насчет ошибок в браузере, которые позволяют злоумышленнику подделать заголовок Origin? Могут быть ошибки, которые позволяют токену CSRF просачиваться через источники, поэтому потребуется больше работы, чтобы доказать, что один лучше, чем другой.

гость
источник
5
Я только что протестировал Firefox 47, и он не отправляет заголовок происхождения для сообщения формы с перекрестным происхождением (распространенный способ атаки на службы REST, которые не включают CORS для XHR), поэтому я не думаю, что проверка заголовка источника будет эффективным, если пользователь использует Firefox.
Энди
3
Для справки: проблема с тем, что Firefox не отправляет заголовок "Origin", отслеживается в Bugzilla: bugzilla.mozilla.org/show_bug.cgi?id=446344 В этом случае вы можете вернуться к проверке заголовка "Referer", но, по моему опыту, некоторые Пользователи Firefox блокируют заголовок «Referer» из соображений конфиденциальности (хотя, IMHO, этого было бы достаточно, чтобы удалить путь и запрос).
Steffen