Які ризики для безпеки встановлення Access-Control-Allow-Origin?


124

Я недавно був набір Access-Control-Allow-Originдля *того , щоб бути в змозі зробити крос-субдомен Ajax дзвінки.
Тепер я не можу не відчувати, що я піддаю своє оточення ризикам безпеки.
Будь ласка, допоможіть мені, якщо я роблю це неправильно.

Відповіді:


69

Відповідаючи Access-Control-Allow-Origin: *, запитуваний ресурс дозволяє ділитися з будь-яким походженням. Це в основному означає, що будь-який сайт може надіслати на ваш сайт запит XHR та отримати доступ до відповіді сервера, що не було б випадком, якби ви не реалізували цю відповідь CORS.

Тож будь-який сайт може надіслати запит на ваш сайт від імені своїх відвідувачів і обробити його відповідь. Якщо у вас є щось реалізоване на зразок схеми автентифікації або авторизації, заснованої на тому, що автоматично надається браузером (файли cookie, сеанси на основі файлів cookie тощо), запити, ініційовані сторонніми сайтами, також будуть використовувати їх.

Це дійсно становить небезпеку для безпеки, особливо якщо ви дозволяєте ділитися ресурсами не лише для вибраних ресурсів, але для кожного ресурсу. У цьому контексті ви повинні ознайомитись, коли безпечно включити CORS? .


2
Якщо ви можете навести конкретний приклад того, як спільний доступ до авторів становить небезпеку для безпеки, я підтримаю це.
Петрус Терон

1
@Gumbo Що з статичним вмістом? (наприклад, статичний вміст cdn, наприклад, javascripts, css, статичний htmls тощо). Чи є якісь проблеми безпеки налаштування Access-Control-Allow-Origin: *на них? Нічого не буде, і вони публічні для всіх?
Умут Бензер

2
@UmutBenzer Це нормально.
Гумбо

25
Насправді ця відповідь не зовсім коректна згідно з чинним стандартом CORS : "Рядок" * "не може використовуватися для ресурсу, що підтримує облікові дані." Таким чином, ви не можете змусити запит на використання перехідної автентифікації у вигляді файлів cookie, кешованої HTTP-аутентифікації або клієнтських SSL-сертифікатів. Однак якщо веб-сайт, наприклад, використовував локальну пам’ять для аутентифікації, це буде проблемою.
Ніклас Б.

2
@NiklasB: Я спробував цей сценарій, і Chrome відповідає стандарту CORS, як ви вже згадували. тобто рядок " " не підтримується запитом облікових даних. Ось що повідомляє Chrome: "XMLHttpRequest не може завантажити localhost: 12346 / привіт . Підстановочний знак" "не може бути використаний у заголовку" Access-Control-Allow-Origin ", коли прапор облікових даних є істинним. Походження" localhost: 12345 " Тому доступ не дозволений. Режим облікових даних XMLHttpRequest керується атрибутом withCredentials. "
factotum

37

Access-Control-Allow-Origin: *цілком безпечно додавати до будь-якого ресурсу, якщо тільки цей ресурс не містить приватних даних, захищених чимось іншим, ніж стандартні облікові дані (файли cookie, базовий auth, клієнтські сертифікати TLS).

Напр .: Дані, захищені файлами cookie, є безпечними

Уявіть https://example.com/users-private-data, що може відкривати приватні дані залежно від стану входу користувача. Цей стан використовує сесійне cookie. Це безпечно , щоб додати Access-Control-Allow-Origin: *до цього ресурсу, так як цей заголовок дозволяє отримати доступ до відповіді , тільки якщо запит зроблено без печива і печиво потрібно , щоб отримати особисті дані. В результаті приватні дані не просочуються.

Напр .: Дані, захищені локацією / ip / внутрішньою мережею, не є безпечними (на жаль, часто зустрічаються з інтрамережами та побутовою технікою):

Уявіть https://intranet.example.com/company-private-data, що відкриває дані приватної компанії, але це можна отримати, лише якщо ви перебуваєте в мережі Wi-Fi компанії. Це небезпечно , щоб додати Access-Control-Allow-Origin: *до цього ресурсу, так як він захищений використовувати що - то інше , ніж стандартні облікові дані. В іншому випадку поганий сценарій може використовувати вас як тунель до інтрамережі.

Практичне правило

Уявіть, що побачить користувач, якби він отримав доступ до ресурсу у вікні анонімного перегляду. Якщо ви задоволені тим, що всі бачать цей вміст (включаючи вихідний код, який отримав веб-переглядач), це сміливо додавати Access-Control-Allow-Origin: *.


повинен "оскільки він дозволяє лише запити без файлів cookie" бути ", як це дозволяє лише запити з файлами cookie"?
DJCordhose

3
@DJCordhose ні. Access-Control-Allow-Origin: *дозволяє лише запити без файлів cookie. Я відредагував відповідь, щоб трохи уточнити.
JaffaTheCake

Яка різниця між "*" та регістром без цього заголовка взагалі. Це те саме?
Nigrimmist

Мені б хотілося, якби "Інакше поганий сценарій міг би використовувати вас як тунель до інтрамережі", можна було б пояснити далі.
Сем Рюбі

@Nigrimmist Тоді запит на попередній політ буде відмовлений, а доступ до ресурсів буде заблокований
iamareebjamal

9

AFAIK, Access-Control-Allow-Origin - це лише заголовок http, що надсилається з сервера до браузера. Обмеження його певною адресою (або відключення її) не робить ваш сайт більш безпечним для, наприклад, роботів. Якщо роботи хочуть, вони можуть просто проігнорувати заголовок. Звичайні веб-переглядачі там (Explorer, Chrome тощо) за замовчуванням шанують заголовок. Але така програма, як Postman, просто ігнорує її.

Кінцевий сервер насправді не перевіряє, що таке "походження" запиту, коли він повертає відповідь. Він просто додає заголовок http. Саме браузер (клієнтський кінець) надіслав запит, який вирішує прочитати заголовок контролю доступу та діяти на нього. Зауважте, що у випадку XHR він може скористатися спеціальним запитом "OPTIONS", щоб спочатку запитати заголовки.

Отже, кожен, хто має здібності до творчих сценаріїв, може легко проігнорувати весь заголовок, що б там не було встановлено.

Див. Також Можливі проблеми безпеки щодо налаштування Access-Control-Allow-Origin .


Тепер фактично відповісти на питання

Я не можу не відчути, що я піддаю своє оточення ризикам безпеки.

Якщо хтось хоче напасти на вас, він може легко обійти Access-Control-Allow-Origin. Але ввімкнувши "*", ви надаєте зловмиснику ще кілька "векторів атак", наприклад, використовуючи звичайні веб-браузери, які шанують цей HTTP-заголовок.


6
Подивіться на це з точки зору необережного кінцевого споживача. Хтось може створити шкідливу веб-сторінку, яка вводить JavaScript для передачі даних між реальним сайтом та шкідливим сайтом (скажімо, він хоче вкрасти ваш пароль). Веб-браузер кінцевого користувача зазвичай блокує цю комунікацію між веб-сайтами, але якщо встановлено Access-Control-Allow-Origin, то це буде дозволено, і кінцевий користувач не стане мудрішим.
Brain2000

3
Так, налаштування Access-Control-Allow-Origin *на шкідливий веб-сайт, на якому розміщуються сценарії для крадіжки паролів, сильно не рекомендується :-)
commonpike

6
@commonpike Ви вірні в тому, що хтось може створити сценарій, щоб просто повністю проігнорувати заголовок. Якщо дані доступні, вони доступні із заголовками CORS або без них. Є ще один вектор нападу, який ти не розглядаєш. Припустимо, я заходжу на веб-сайт свого банку. Якщо я перейду на іншу сторінку, а потім повернусь до свого банку, я все ще ввійду в систему через cookie. Інші користувачі в Інтернеті можуть звертатися до тих же URL-адрес, що і в моєму банку, але вони не зможуть отримати доступ до мого рахунку без файлу cookie. Якщо дозволено запити між походженнями, шкідливий веб-сайт може фактично себе представити ...
Бред

5
@commonpike ... користувач. По-іншому, ви можете просто зайти на мій сайт (який навіть може бути звичайним сайтом, без нічого підозрілого ... можливо, це справжній законний сайт, щойно викрали!), Але якийсь JavaScript, який робить HTTP-запити у ваш банк, щоб передати деякі кошти на мій рахунок. Банк не знає різниці між запитами зі своїх сторінок або запитами з інших сторінок. У обох є файл cookie, що дозволяє успішному запиту.
Бред

3
@commonpike Дозвольте навести вам більш поширений приклад ... той, який відбувається постійно. Припустимо, у вас є звичайний домашній маршрутизатор, наприклад, Linksys WRT54g або щось подібне. Припустимо, що маршрутизатор дозволяє запити перехресного походження. Сценарій на моїй веб-сторінці може робити запити HTTP на загальні IP-адреси маршрутизатора (наприклад 192.168.1.1) і перенастроювати маршрутизатор, щоб дозволити атаки. Він навіть може використовувати ваш маршрутизатор безпосередньо як вузол DDoS. (Більшість маршрутизаторів мають тестові сторінки, які дозволяють проводити пінг-файли або прості перевірки HTTP-сервера. Це можна масово зловживати.)
Бред

7

Ось два приклади, розміщені як коментарі, коли підключення підкреслює справді проблематично:

Припустимо, я заходжу на веб-сайт свого банку. Якщо я перейду на іншу сторінку, а потім повернусь до свого банку, я все ще ввійду в систему через cookie. Інші користувачі в Інтернеті можуть звертатися до тих же URL-адрес, що і в моєму банку, але вони не зможуть отримати доступ до мого рахунку без файлу cookie. Якщо дозволено запити між походженнями, шкідливий веб-сайт може ефективно себе представити.

- Бред

Припустимо, у вас є звичайний домашній маршрутизатор, наприклад, Linksys WRT54g або щось подібне. Припустимо, що маршрутизатор дозволяє запити перехресного походження. Сценарій на моїй веб-сторінці може робити запити HTTP до загальних IP-адрес маршрутизатора (наприклад, 192.168.1.1) та перенастроювати маршрутизатор, щоб дозволити атакам. Він навіть може використовувати ваш маршрутизатор безпосередньо як вузол DDoS. (Більшість маршрутизаторів мають тестові сторінки, які дозволяють проводити пінг-файли чи прості перевірки HTTP-сервера. Це можна масово зловживати.)

- Бред

Я вважаю, що ці коментарі повинні були відповісти, оскільки вони пояснюють проблему на прикладі реального життя.


8
За винятком цього не вийде. "Рядок" * "не можна використовувати для ресурсу, який підтримує облікові дані." w3.org/TR/cors/#resource-requests
байо

@bayotop Як браузер розрізняє сторінки, для яких потрібна автентифікація, та сторінки, які мають інші дані у заголовках?
весілля

Після прочитання наданого посилання з'являється "підтримує прапор облікових даних", який використовується для цієї мети. Здається, це встановлено вручну, тому, мабуть, якщо хтось не знав, як правильно встановити CORS, він міг також помилитися з цим прапором, тому я вважаю, що вищевказані вразливі місця можливі.
весілля

2
@wedstrom Прапор встановлюється тим, хто подає запит. У будь-якому випадку, наведені вище сценарії є прикладами атак CSRF. Дозволення походження "*" не зробить вас більш вразливими, ніж ви вже є (можливо, трохи у рідкісних випадках). У більшості випадків ви можете зробити зловмисний запит на веб-сайт, використовуючи форми, так що CORS не має значення. У випадках, коли вам потрібно зробити запит AJAX, запити перед польотом будуть надходити (це саме той момент, коли переходить браузер, коли ACAO: '*' та Access-Control-Allow-Credentials: 'true').
байо

0

У сценарії, коли сервер намагається повністю відключити CORS, встановивши нижче заголовків.

  • Access-Control-Allow-Origin: * (повідомляє браузеру, що сервер приймає запити між веб-сайтами від будь-якого ORIGIN)

  • Access-Control-Allow-Credentials: true (повідомляє браузеру, що запити на веб-сайті можуть надсилати файли cookie)

У веб-переглядачах існує безпечна помилка, що призведе до помилки нижче

"Credential is not supported if the CORS header ‘Access-Control-Allow-Origin’ is ‘*’"

Тож у більшості сценаріїв налаштування "Access-Control-Allow-Origin" *не буде проблемою. Однак для захисту від атак сервер може підтримувати список дозволених джерел і кожного разу, коли сервер отримує запит на перехресне походження, він може перевірити заголовок ORIGIN щодо списку дозволених джерел, а потім повторити те саме в Access-Control-Allow-Origin заголовок.

Оскільки заголовок ORIGIN неможливо змінити, запустивши JavaScript у браузері, шкідливий сайт не зможе його підробити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.