Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Frontend security

Frontend security

OdessaJs'2015

F6bcabee635ce2046a313db6ed306a22?s=128

Nikolay Belichuk

August 22, 2015
Tweet

Transcript

  1. Frontend Security Николай Беличук

  2. Дисклеймер Никогда не доверяйте данным, которые присылают вам пользователи. Кроме

    данных о кредитных картах в формате 4621<script> stealCookie();</script> 1261
  3. Cross Site Scripting ( XSS )

  4. Виды XSS атак По вектору атаки • Непостоянные • Хранимые

    • Базирующийся на DOM-модели По каналам внедрения скрипта • Ошибки в браузере • Отсутствие экранирования спецсимволов HTML • Отсутствие фильтрации • Подмена кодировки в заголовке страницы По способу воздействия • Требующие действий пользователя (активные) • Автономные (пассивные) https://ru.wikipedia.org/wiki/Межсайтовый_скриптинг
  5. Непостоянный (non-persistent) XSS Непостоянный XSS – тип атаки нацеленный на

    исполнение вредоносного кода в браузере пользователя посредством влияния на параметры HTTP-запроса (в большинстве случаев в URL). Основная причина кроется в недостаточной фильтрации данных.
  6. Я недостаточно фильтрую данные URL - uniform resource locator

  7. Непостоянный XSS https://twitter.com/#!username https://twitter.com/username /* first revision */ (function(g) {

    var a = location.href.split("#!")[1]; if (a) { g.location = g.HBR = a; } })(window);
  8. Что не так с этим кодом?

  9. Что не так с этим кодом? Непостоянная (non-persistent) XSS уязвимость

    с возможностью исполнения произвольного кода на стороне жертвы. https://twitter.com/#!javacript:alert(‘xss’);
  10. Непостоянный XSS А как насчет такого адреса? https://twitter.com/#!javacript::alert(‘xss’); /* second

    revision */ (function(g) { var a = location.href.split("#!")[1]; if (a) { g.location = a.replace(":", ""); } })(window);
  11. Непостоянный XSS https://twitter.com/#!javacript&x58;alert(‘xss’); // IE8 /* third revision */ (function(g)

    { var a = location.href.split("#!")[1]; if (a) { g.location = g.HBR = a.replace(/:/gi, ""); } })(window);
  12. Непостоянный XSS /* final revision */ (function(g) { var a

    = location.href.split("#!")[1]; if (a) { g.location.hash = ""; g.location.pathname = g.HBR = a; } })(window);
  13. Хранимые XSS Хранимый xss – тип атаки при которых скрипт

    добавляется злоумышленником в тело страницы (посредством форм ввода - текстовых полей, инпутов, contenteditable- элементов на сайте Классический пример – форумы, на которых разрешено оставлять комментарии в HTML формате без ограничений, а также сайты, которые хранят пользовательские тексты и отображают их в «сыром» виде.
  14. Откуда ждать беды?

  15. None
  16. None
  17. Logic-less темплейты Шаблон: <div class=“user-detail”> <p>Имя: {{ name }}</p> <p>Фамилия:

    {{surname}} </p> <p>Возраст: {{ age }} </p> </div> Контекст: { name: ‘Nikolay’, surname ‘Belichuk’, age: ‘0</p><script>alert(’xss’);</script><p>’ }
  18. Результат

  19. Security Matrix Framework {}SEC-A {}SEC-B {}SEC-C {}SEC-D {}SEC-E {}SEC-F VueJS

    Fail Fail Fail Fail Fail Fail AngularJS 1.0.8 Fail Fail Fail Fail PASS Fail AngularJS 1.2.0 Fail PASS Fail Fail PASS PASS AngularJS 1.4.0 Fail PASS Fail PASS PASS PASS CanJS Fail Fail PASS Fail Fail Fail Underscore.js Fail Fail PASS Fail Fail Fail KnockoutJS Fail Fail Fail Fail Fail Fail Ember.js Fail PASS PASS Fail PASS TBD Ractive.js 0.4.0 Fail Fail Fail Fail Fail Fail Ractive.js 0.7.2 Fail Fail PASS Fail Fail Fail JsRender Fail Fail Fail Fail Fail Fail Kendo UI Fail Fail Fail Fail Fail Fail {}SEC-A - Шаблон обрабатывается без использования eval или Function? ​ {}SEC-B - Контекст исполнения изолирован или находится в песочнице? ​ {}SEC-C - B качестве шаблонов могут выступать только скриптовые елементы?​ {}SEC-D - Структура позволяет или поощряет разделения кода и содержания ​ {}SEC-E - Фреймворк имеет программу по реагированию на угрозы безопасности​ {}SEC-F - Фреймворк позволяет или поощряет использование CSP https://code.google.com/p/mustache-security/
  20. Активные и пассивные XSS <input type=text value=a onfocus=alert('xss') autofocus> <a

    href='#a' onmouseover=alert('xss') style='font-size:500px'>Click me</a> <img src="http://test.com/img.png" onmouseover="javascript:alet('xss');"> <svg onload="javascript:alert('xss')" xmlns="http://www.w3.org/2000/svg"></svg>
  21. Нужно больше примеров? HTML5, HTML4↓ CSS E4X DOM JSON SVG

    X(HT)ML UTF-7 и др. экзот. код-ки DoS Поведения и связывание данных Перехват нажатий и подмена интерфейса http://html5sec.org/
  22. Content-Security-Policy default-src ‘none’; style-src http://odessajs.org frame-src http://odessajs.org/ https://www.google.com; script-src http://odessajs.org/

    https://ssl.google-analytics.com; img-src ‘self’ https://ssl.google-analytics.com; font-src http://odessajs.org
  23. Content-Security-Policy-Report-Only default-src ‘none’; report-uri http://odessajs.org/security/violations { "csp-report": { "document-uri": "http://odessajs.org/index.html",

    "referrer": "http://evil.example.com/", "blocked-uri": "http://evil.example.com/img.png", "violated-directive": "default-src 'self'", "original-policy": "script-src 'self'", "source-file": "http://odessajs.org/script.js", "line-number": 10, "column-nuber": 11 } }
  24. Content Security Policy generator https://cspbuilder.info/static/#/policy/

  25. Can I use Content Security Policy ? http://caniuse.com/#feat=contentsecuritypolicy

  26. Man in the middle - атака Атакующий способен читать и

    видоизменять по своей воле сообщения, которыми обмениваются корреспонденты, причём ни один из последних не может догадаться о его присутствии в канале
  27. Переходим на HTTPS HTTPS (HyperText Transfer Protocol Secure) — расширение

    протокола HTTP, поддерживающее шифрование. Данные, передаваемые по протоколу HTTPS, "упаковываются" в криптографический протокол SSL или TLS
  28. $curl –I http://example.com HTTP/1.1 301 Moved Permanently Date: Mon, 02

    Aug 2015 20:33:50 GMT Content-Type: text/html Content-Length: 177 Connection: keep-alive Location: https://example.com/ Server: Example Server
  29. $curl –I https://example.com HTTP/1.1 200 OK Date: Mon, 02 Aug

    2015 20:33:50 GMT … Strict-Transport-Security: max-age=31536000;includeSubDomains X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN Front-End-Https: on …
  30. http://examle.com https://examle.com

  31. Cookie Самая желаемая информация, которую в первую очередь хочет "угнать"

    злоумышленник
  32. О чем стоит помнить работая с Cookie • Явно указываем

    домен • Важные данные устанавливаем с флагом HttpOnly • Флаг 'Secure' в случае, если основной протокол HTTPS
  33. Adobe Flash http://www.cvedetails.com/product/6761/Adobe-Flash-Player.html?vendor_id=53 Adobe Flash — мультимедийная платформа компании Adobe,

    предназначенная для регулярного обновления самой себя (с) народная мудрость
  34. Как обезопасить себя? Используйте Content Security Policy Перейдите на HTTPS

    Не разрешайте доступ к кукам с авторизацией Выполняйте действия через POST, защищая случайным ключом (CSFR) Дважды проверяйте данные которые приходят от пользователя (на фронтеде и бекенде) По возможности откажитесь от FLASH Просканируйте свой проект на наличие XSS уязвимостей и устраните их ( https://github.com/epsylon/xsser-public )
  35. Q&A Берегите свой фронтенд Николай Беличук belichuk@gmail.com