Безопасность node.js / Илья Вербицкий (Независимый...

Post on 16-Apr-2017

320 Views

Category:

Engineering

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Безопасность Node.jsИлья Вербицкий

Вместо предисловия• Кто украл мою кредитную карту?• Безопасен ли мой блог?• Кто «сломал» Интернет?

Основные проблемы безопасности• Пользователи• Разработчики

Сколько стоит «баг»?

Сбор требований

Дизайн Разработка Тестирование Релиз Нас взломали!!!

OWASP Top 10• Текущая версия - 2013• NSA, CERT, PCI Council, SEI, SANS, NIST, EU Regulations• 2003, 2004, 2007, 2010• Следующая версия - 2016

10

Непроверенные перенаправления

app.get("/login", function (req, res, next) { return res.redirect(req.query.url);});

http://site.com/login?url=/admin

http://site.com/login?url=http://google.com

Что делать?• Не используйте перенаправления и переходы• Переходы не зависят от входных параметров• Проверяйте входные параметры• valid-url

9

Известные уязвимости в компонентах• https://nodesecurity.io/• https://snyk.io/• http://cve.mitre.org/ • https://nvd.nist.gov/ • https://www.exploit-db.com/• https://www.cvedetails.com/

Как выбирать npm-пакеты?• Популярность• Автор• Активность на GitHub• Статические анализаторы? Юнит-тесты?• Базы данных уязвимостей• Списки рассылки, Slack

Как это автоматизировать?• nsp• snyk• Retire.js• JSPrime• ESLint with ScanJS rules• rokki• Veracode

Web Application Firewall• ModSecurity• IronBee• NAXSI• Shadow Daemon• Cloudflare WAF• AWS WAF

8

Подделка межсайтовых запросов (CSRF)

GoodSite.com

Attacker.com

Что делать?• csurf

var csrf = require('csurf');

app.use(csrf({ cookie: true }));

app.get('/form', function(req, res) {res.render('send', { csrfToken: req.csrfToken() })

})

7

Отсутствие контроля прав доступа• Security through obscurity• Проверка прав доступа в UI• Нет проверки прав во вспомогательных служебных запросах

Что делать?• Бить по рукам• Контроль доступа на всех уровнях приложения• Authorization middleware• Тестирование и сode review

6

Утечка уязвимых данных• Перехват трафика• Проблемы с шифрованием данных

Что делать c перехватом трафика?• Всегда используйте TLS• HTTP/2 и TLS 1.2• Используйте TLS 1.1 и TLS 1.2• Защищенный контент доступен только через TLS-соединения• HTTP-контент на TLS-страницах• Атрибут Secure у cookie

Криптография в Node.js и браузерах• crypto• sjcl (Stanford)• crypto-js• node-forge• Web Cryptography API• PolyCrypt

5

Небезопасная конфигурация• Настройки/пароли по умолчанию• Слишком много прав• Утечка информации о настройках сервера• DoS• Clickjacking• JSON Hijacking

Что делать?• Ansible, Chef, Puppet• helmet• hpp• cors• node-ipgeoblock• express-limiter• safe-regex

4

Прямые ссылки на объектыvar messageId = req.params.messageId;messagesDAO.getById(userId, function(error, message) { return res.render(“message", message);});

http://site.com/view-message?messageId=1

Что делать?• Бить по рукам• Использовать сессии• Контроль доступа на всех уровнях приложения• Тестирование и code review

3

XSS• Непостоянные• Постоянные• XSS в DOM-модели

Что делать?• Валидация• xss-filters• secure-filters• xss• validator-js

• HTTP-куки• helmet-csp (Content Security Policy)

2

Аутентификация и управление сеансами• Анализ сообщений об ошибках аутентификации• Подбор паролей• Проблемы с сессиями пользователей

Аутентификация• Не изобретайте велосипед• Аутентификация только через TLS• Политика паролей• «Безопасные» сообщения об ошибках• Двухфакторная аутентификация• CAPTCHA• Блокировка аккаунтов• Восстановление паролей

Готовые решения• passport• passport-2fa-totp• notp• basic-auth• recaptcha2

Сессии пользователей• Идентификатор сессии в URL• HTTP-куки• Только TLS• Таймаут• Выход из системы• Закрытие браузера

Безопасное хранение паролей• Не забудьте про salt• SHA-256, SHA-512• PBKDF2, bcrypt, scrypt• HMAC

1

Внедрение кода• SQL-инъекции• NoSQL-инъекции• Выполнение произвольного кода• Выполнение произвольных команд• Чтение/запись произвольных файлов• ORM-инъекции• XML-инъекции• XPath-инъекции

JavaScript-инъекцииvar preTax = eval(req.query.preTax);

http://site.com/calculate?preTax=process.exit(1)

Что делать?• Валидация• Параметризированные запросы• eval(), setTimeout(), setInterval(), Function()• Регулярные выражения• Тестирование и code review

JavaScript шагает по планете• Front-end: Angular, React, ваш любимый фреймворк• Back-end: Node.js• Desktop: Electron, NW.js• Mobile: PhoneGap, React Native• IoT, Robotics: Cylon.js, Johnny-Five, Tessel 2

Вопросы?

top related