CSP: как защитить своих пользователей — Алексей...

65
Яндекс

description

XSS, несмотря на всю изученность, является одной из самых распространённых уязвимостей сайтов. Даже если вы знаете методы защиты и пишете безопасный код, уверены ли в том, что ваш сайт работает в безопасном окружении? Ведь вирусы и расширения могут менять любые методы и получать доступ к любым данным! К счастью, появился Content Security Policy. За 20 минут я расскажу вам, как с его помощью без особых усилий наладить эффективную защиту сайта от различных видов атак и блокировать выполнение нежелательного кода.

Transcript of CSP: как защитить своих пользователей — Алексей...

Page 1: CSP: как защитить своих пользователей — Алексей Андросов

Яндекс

Page 2: CSP: как защитить своих пользователей — Алексей Андросов

Я

Content Security Policy:защити своих пользователей

Андросов Алексей Старший разработчик интерфейсовЯ.Субботник, Киев, 22.11.2014

ндекс Почта

Page 3: CSP: как защитить своих пользователей — Алексей Андросов

Я расскажу про…

1. Какие проблемы безопасности есть

2. Что такое CSP и как он работает

3. CSP1, CSP2 и их отличия

4. Полезные советы

5. Как внедрить CSP на свой сайт

3

Page 4: CSP: как защитить своих пользователей — Алексей Андросов

Безопасность персональных данных

1. Имидж и престиж компании

2. Счастье пользователей

4

Page 5: CSP: как защитить своих пользователей — Алексей Андросов

XSS?

Page 6: CSP: как защитить своих пользователей — Алексей Андросов

XSS

Сross Site Sсriрting - исполнение вредноносного кода в браузере пользователя.

6

Page 7: CSP: как защитить своих пользователей — Алексей Андросов

XSS

7

Page 8: CSP: как защитить своих пользователей — Алексей Андросов

Защита от XSS

Экранирование ввода. Ничего кроме простого текста, вставитьнельзя :(

HttpOnly куки. Авторизацию не украсть, но можно все другиеданные.

Ограничение ввода через bbcode , markdown и т.п. Но имеетограниченное применение

В IE и Chrome есть встроенная защита ( X-XSS-Protection: 1 )

8

Page 9: CSP: как защитить своих пользователей — Алексей Андросов
Page 10: CSP: как защитить своих пользователей — Алексей Андросов

Санитайзер!

Санитайзер – умный парсер, который оставляет в сообщении только безопасные

элементы.

Но остается проблема, что санитайзер можно “пробить”

10

Page 11: CSP: как защитить своих пользователей — Алексей Андросов

Но это мелочи…

Page 12: CSP: как защитить своих пользователей — Алексей Андросов

Браузер – окружение,которое вы не

контроллируете!

Page 13: CSP: как защитить своих пользователей — Алексей Андросов
Page 14: CSP: как защитить своих пользователей — Алексей Андросов
Page 15: CSP: как защитить своих пользователей — Алексей Андросов
Page 16: CSP: как защитить своих пользователей — Алексей Андросов

Не все плагины одинаково полезны

Могут бесконтрольно менять окружение

Исполнять на вашем сайте любой код

Воровать любые данные

bit.ly/yasb-kiev-csp-plugins

16

Page 17: CSP: как защитить своих пользователей — Алексей Андросов

CSP!

Page 18: CSP: как защитить своих пользователей — Алексей Андросов

Content Security Policy

Это не панацея и не 100%-защита.

Это еще один мощный уровень защиты.

Есть хитрые способы его обойти bit.ly/yasb-kiev-csp-hack

18

Page 19: CSP: как защитить своих пользователей — Алексей Андросов

История

Придумала Mozilla. Первая реализация появилась в Firefox 4 (2011 год).

В 2012 году стал стандартом W3C w3.org/TR/CSP

Уже есть CSP2 в статусе Last Call w3.org/TR/CSP2

19

Page 20: CSP: как защитить своих пользователей — Алексей Андросов

CSP

С помощью HTTP-заголовка определяет белый список источников , откуда браузер

может загружать ресурсы.

Content-Security-Policy: <политика>

Content-Security-Policy-Report-Only: <политика>

Источник: [протокол://]домен[:порт]

20

Page 21: CSP: как защитить своих пользователей — Алексей Андросов

Можно использовать сейчас!

Поддержка в 80% браузеров!

Android 4.4+

Chrome 25+

Firefox 23+

IE/IE Mobile 10+ заголовок X-Content-Security-Policy, почтистандартный

iOS/Safari 7+

21

Page 22: CSP: как защитить своих пользователей — Алексей Андросов

Маленький заголовок – большая защита!

Content-Security-Policy :

default-src 'none';

frame-src awaps.yandex.ru;

img-src 'self' yastatic.net *.yandex.net;

script-src 'unsafe-eval' 'unsafe-inline' yastatic.net;

style-src 'unsafe-inline' yastatic.net;

report-uri /csp-report?from=mail

01.

02.

03.

04.

05.

06.

07.

22

Page 23: CSP: как защитить своих пользователей — Алексей Андросов

Маленький заголовок – большая защита!

Content-Security-Policy:

default-src 'none';

frame-src awaps.yandex.ru;

img-src 'self' yastatic.net *.yandex.net;

script-src 'unsafe-eval' 'unsafe-inline' yastatic.net;

style-src 'unsafe-inline' yastatic.net;

report-uri /csp-report?from=mail

01.

02.

03.

04.

05.

06.

07.

23

Page 24: CSP: как защитить своих пользователей — Алексей Андросов

Маленький заголовок – большая защита!

Content-Security-Policy:

default-src 'none' ;

frame-src awaps.yandex.ru;

img-src 'self' yastatic.net *.yandex.net;

script-src 'unsafe-eval' 'unsafe-inline' yastatic.net;

style-src 'unsafe-inline' yastatic.net;

report-uri /csp-report?from=mail

01.

02.

03.

04.

05.

06.

07.

24

Page 25: CSP: как защитить своих пользователей — Алексей Андросов

Маленький заголовок – большая защита!

Content-Security-Policy:

default-src 'none';

frame-src awaps.yandex.ru;

img-src 'self' yastatic.net *.yandex.net;

script-src 'unsafe-eval' 'unsafe-inline' yastatic.net;

style-src 'unsafe-inline' yastatic.net;

report-uri /csp-report?from=mail

01.

02.

03.

04.

05.

06.

07.

25

Page 26: CSP: как защитить своих пользователей — Алексей Андросов

Как это работает

<script src="//evil.com/give-me-your-money.js"></script>

Content-Security-Policy:

default-src 'none';

img-src 'self' yastatic.net *.yandex.net;

script-src 'unsafe-eval' 'unsafe-inline' yastatic.net;

style-src 'unsafe-inline' yastatic.net;

report-uri /csp-report?from=mail

01.

02.

03.

04.

05.

06.

26

Page 27: CSP: как защитить своих пользователей — Алексей Андросов

Как это работает

< script src="//evil.com/give-me-your-money.js"></script>

Content-Security-Policy:

default-src 'none';

img-src 'self' yastatic.net *.yandex.net;

script-src 'unsafe-eval' 'unsafe-inline' yastatic.net;

style-src 'unsafe-inline' yastatic.net;

report-uri /csp-report?from=mail

01.

02.

03.

04.

05.

06.

27

Page 28: CSP: как защитить своих пользователей — Алексей Андросов

Как это работает

<script src="// evil.com /give-me-your-money.js"></script>

Content-Security-Policy:

default-src 'none';

img-src 'self' yastatic.net *.yandex.net;

script-src 'unsafe-eval' 'unsafe-inline' yastatic.net ;

style-src 'unsafe-inline' yastatic.net;

report-uri /csp-report?from=mail

01.

02.

03.

04.

05.

06.

28

Page 29: CSP: как защитить своих пользователей — Алексей Андросов

Как это работает

<script src="// evil.com /give-me-your-money.js"></script>

Content-Security-Policy:

default-src 'none';

img-src 'self' yastatic.net *.yandex.net;

script-src 'unsafe-eval' 'unsafe-inline' yastatic.net ;

style-src 'unsafe-inline' yastatic.net;

report-uri /csp-report?from=mail

Совпадения нет – безусловная блокировка!

01.

02.

03.

04.

05.

06.

29

Page 30: CSP: как защитить своих пользователей — Алексей Андросов

Политика

Политика состоит из директив.

Директива определяет источники для каждого типа содержимого.

img-src 'self' yastatic.net *.yandex.net

30

Page 31: CSP: как защитить своих пользователей — Алексей Андросов

Директивы

connect-src для XMLHttpRequest, WebSocket, EventSource

font-src

frame-src

img-src

media-src для <audio>, <video>

object-src , например Flash

script-srс

style-src31

Page 32: CSP: как защитить своих пользователей — Алексей Андросов

Директивы

default-src – список источников по умолчанию

report-uri – URL, куда который будут отправляться JSON-отчеты о нарушениях.

32

Page 33: CSP: как защитить своих пользователей — Алексей Андросов

Ключевые слова

В директивах можно использовать как хосты, так и ключевые слова

'self' – текущий хост

'none' – ничего нельзя

'unsafe-inline' для script-src и style-src .

'unsafe-eval' для script-src .

33

Page 34: CSP: как защитить своих пользователей — Алексей Андросов

‘unsafe-inline’ для script-src

<script>

alert('Look at me!')

</script>

<a onclick="alert('Look at me!')" >link</a>

Старайтесь его избегать. Напрямую разрешает XSS!

CSP1 – разрешает все или ничего, CSP2 – можно разрешать отдельные скрипты

01.

02.

03.

04.

34

Page 35: CSP: как защитить своих пользователей — Алексей Андросов

‘unsafe-inline’ для style-src

<style>

.body {color: #000}

</style>

Придется разрешить, если вы используете фреймворки с feature detection. Например,

jQuery или Modernizr.

01.

02.

03.

35

Page 36: CSP: как защитить своих пользователей — Алексей Андросов

‘unsafe-eval’ для script-src

Разрешает кодогенерацию: eval , new Function() ,

setTimeout('var a = 1', 10)

Придется разрешить, если вы используете фреймворки с кодогенерацией. Например,

Lo-Dash.

36

Page 37: CSP: как защитить своих пользователей — Алексей Андросов

Пример

Content-Security-Policy:

default-src 'none';

frame-src awaps.yandex.ru;

img-src 'self' yastatic.net *.yandex.net;

script-src 'unsafe-eval' 'unsafe-inline' yastatic.net;

style-src 'unsafe-inline' yastatic.net;

report-uri /csp-report?from=mail

01.

02.

03.

04.

05.

06.

07.

37

Page 38: CSP: как защитить своих пользователей — Алексей Андросов

Отчет о нарушениях

{

"csp-report": {

"document-uri": "https://mail.yandex.ru/neo2/",

"referrer": "http://www.yandex.ru/",

"violated-directive": "script-src ...",

"original-policy": "...вся политика...",

"blocked-uri": "...заблокированный ресурс..."

}

}

01.

02.

03.

04.

05.

06.

07.

08.

09. 38

Page 39: CSP: как защитить своих пользователей — Алексей Андросов

Отчет о нарушениях

{

"csp-report": {

"document-uri": "https://mail.yandex.ru/neo2/",

"referrer": "http://www.yandex.ru/",

"violated-directive": "script-src ...",

"original-policy": "...вся политика...",

"blocked-uri": "...заблокированный ресурс..."

}

}

01.

02.

03.

04.

05.

06.

07.

08.

09. 39

Page 40: CSP: как защитить своих пользователей — Алексей Андросов

Отчет о нарушениях

{

"csp-report": {

"document-uri": "https://mail.yandex.ru/neo2/",

"referrer": "http://www.yandex.ru/",

"violated-directive": "script-src ...",

"original-policy": "...вся политика...",

"blocked-uri": "...заблокированный ресурс..."

}

}

01.

02.

03.

04.

05.

06.

07.

08.

09. 40

Page 41: CSP: как защитить своих пользователей — Алексей Андросов

Отчет о нарушениях

{

"csp-report": {

"document-uri": "https://mail.yandex.ru/neo2/",

"referrer": "http://www.yandex.ru/",

"violated-directive": "script-src ...",

"original-policy": "...вся политика...",

"blocked-uri": "...заблокированный ресурс..."

}

}

01.

02.

03.

04.

05.

06.

07.

08.

09. 41

Page 42: CSP: как защитить своих пользователей — Алексей Андросов

CSP2

Page 43: CSP: как защитить своих пользователей — Алексей Андросов

CSP2

Развитие стандарта с обратной совместимостью.

Последние Chrome (36+) и Firefox (31+) частично его поддерживают.

Использует тот же заголовок, поэтому CSP2 уже с нами ツ

43

Page 44: CSP: как защитить своих пользователей — Алексей Андросов

Что нового в CSP2?

Можно указывать не только домены, но и пути

Больше директив. Например, form-action ,frame-ancestors , plugin-types

Разрешение инлайн-скриптов через nonce- или hash-

Политику можно указывать в <meta>

unsafe-eval для style-src

JS-событие о нарушении

Более детальный отчет о нарушении44

Page 45: CSP: как защитить своих пользователей — Алексей Андросов

script-src и nonсe

nonce – решение неудобства unsafe-inline .

nonce — случайная последовательность символов

`nonce` выключает `unsafe-inline`

выполняются только те скрипты, которые подписаны правильныматрибутом nonce.

45

Page 46: CSP: как защитить своих пользователей — Алексей Андросов

script-src и nonсe

Content-Security-Policy:

default-src 'self';

script-src 'unsafe-inline' 'nonce-ccc5b86a' yastatic.net

<!-- Заблокирован , отсутствует атрибут nonce -->

<script>

alert("Мені не подобається Київ")

</script>

01.

02.

03.

04.

05.

06.

07.

08.

46

Page 47: CSP: как защитить своих пользователей — Алексей Андросов

script-src и nonсe

Content-Security-Policy:

default-src 'self';

script-src 'nonce-ccc5b86a' yastatic.net

<!-- Заблокирован , атрибут nonce не совпадает -->

<script nonce="42" >

alert("Мені не подобається Київ")

</script>

01.

02.

03.

04.

05.

06.

07.

08.

47

Page 48: CSP: как защитить своих пользователей — Алексей Андросов

script-src и nonсe

Content-Security-Policy:

default-src 'self';

script-src 'nonce-ccc5b86a' yastatic.net

<!-- Выполнен , атрибут nonce валиден -->

<script nonce="ccc5b86a" >

alert("Мені подобається Київ")

</script>

01.

02.

03.

04.

05.

06.

07.

08.

48

Page 49: CSP: как защитить своих пользователей — Алексей Андросов

script-src и nonсe

Content-Security-Policy:

default-src 'self';

script-src 'nonce-ccc5b86a' yastatic.net

<!-- Выполнен , src валиден -->

<script src=" //yastatic.net/page.js "></script>

01.

02.

03.

04.

05.

06.

49

Page 50: CSP: как защитить своих пользователей — Алексей Андросов

script-src и nonсe

Content-Security-Policy:

default-src 'self';

script-src 'nonce-ccc5b86a' yastatic.net

<!-- Выполнен , nonce валиден -->

<script nonce="ccc5b86a" src=" //yandex.net/page.js "></script>

01.

02.

03.

04.

05.

06.

50

Page 51: CSP: как защитить своих пользователей — Алексей Андросов

script-src и hash

Content-Security-Policy:

default-src 'self';

script-src 'self' yastatic.net 'sha256-YWIzOWNiNzJjNDR='

<!-- Выполнен , если

'sha256-base64 encoded hash' от содержимого совпадает

-->

<script> alert("Мені подобається Київ") </script>

01.

02.

03.

04.

05.

06.

07.

08.

51

Page 52: CSP: как защитить своих пользователей — Алексей Андросов

style-src и unsafe-eval

Контроллирует CSS-генерацию:

node.style.top = '10px'

node.style.cssText = 'top: 10px'

style.insertRule()

52

Page 53: CSP: как защитить своих пользователей — Алексей Андросов

Полезные советы

Page 54: CSP: как защитить своих пользователей — Алексей Андросов

Полезные советы

default-src 'none' . По умолчанию ничего нельзя!

Укажите все директивы, иначе в отчете они придут какdefault-src

CSP не распространяется на дочерние фреймы

Можно одновременно указывать Content-Security-Policy иContent-Security-Policy-Report-Only

Комментируйте политику!

54

Page 55: CSP: как защитить своих пользователей — Алексей Андросов

Полезные советы

Используйте только стандартный заголовок

X-Content-Security-Policy отдавайте только для IE, потомучто у Firefox 22- синтаксис отличается от стандартного

Cтарайтесь не использовать * , а указывайте точный списокдоменов

Скорее всего вам придется указатьstyle-src 'unsafe-eval' , даже если вам не нужен CSP2

55

Page 56: CSP: как защитить своих пользователей — Алексей Андросов

Запускаем

Page 57: CSP: как защитить своих пользователей — Алексей Андросов

Запускаем

Для прототипирования можно использовать расширение CSP Tester для chromium-

based браузеров.

bit.ly/yasb-kiev-csp-tester

57

Page 58: CSP: как защитить своих пользователей — Алексей Андросов

Запускаем

1. Пишем политку

2. Не забываем указать report-uri

3. Добавляем к ответу “index.html” заголовок

Content-Security-Policy-Report-Only

4. Собираем отчеты

5. См. пункт 158

Page 59: CSP: как защитить своих пользователей — Алексей Андросов

Пример для nginx

location / {

add_header Content-Security-Policy-Report-Only "...."

}

01.

02.

03.

59

Page 60: CSP: как защитить своих пользователей — Алексей Андросов

Пример для node.js

response.setHeader(

"Content-Security-Policy-Report-Only",

"..."

);

01.

02.

03.

04.

60

Page 61: CSP: как защитить своих пользователей — Алексей Андросов

Запуск

Тестируем политику в реальном окружении, потом заменяем

Content-Security-Policy-Report-Only на

Content-Security-Policy .

Обязательно организуйте постоянный мониторинг!

61

Page 62: CSP: как защитить своих пользователей — Алексей Андросов

Анализ логов

В реальном времени мы смотрим только на количество нарушений.

Периодически собираем статистику с помощью CSP Reporter

bit.ly/yasb-kiev-csp-reporter

62

Page 63: CSP: как защитить своих пользователей — Алексей Андросов

Неожиданные бонусы

Page 64: CSP: как защитить своих пользователей — Алексей Андросов

Бонусы

Читайте отчеты о нарушения, там много интересного ツНа HTTPS-сайтах CSP помогает найти mixed content

CSP – распределенная система тестирования безопасности. Резкоувеличось количество отчетов? Поздравляю, у вас проблемы!

64

Page 65: CSP: как защитить своих пользователей — Алексей Андросов

Андросов АлексейСтарший разработчик интерфейсов

Спасибо!

[email protected] @doochik