Безопасность Node.js / Илья Вербицкий (Независимый...
-
Upload
ontico -
Category
Engineering
-
view
327 -
download
3
Transcript of Безопасность Node.js / Илья Вербицкий (Независимый...
Безопасность 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
Вопросы?