Безопасность
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
Вопросы?

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

Editor's Notes

  • #3 https://www.riskiq.com/blog/labs/magecart-keylogger-injection/ (Magento, OpenCart и Powerfront) https://www.pluginvulnerabilities.com/blog/ + https://www.pluginvulnerabilities.com/2016/10/14/arbitrary-file-upload-vulnerability-in-wp-marketplace/ http://dyn.com/blog/dyn-statement-on-10212016-ddos-attack/
  • #23 Weaknesses have been identified with earlier SSL protocols, including SSLv2 and SSLv3, hence SSL versions 1, 2, and 3 should not longer be used. As of February 2014, contemporary browsers (Chrome v20+, Firefox v27+, IE v8+, Opera v10+, and Safari v5+)support TLS 1.1 and TLS 1.2 TLS 1.0 is still widely used as the 'best' protocol by a lot of browsers that are not patched to the very latest version. It suffers from CBC Chaining attacks and Padding Oracle attacks. TLSv1.0 should only be used after risk analysis and acceptance. PCI DSS 3.1 prohibits use of TLS 1.0 after June 30, 2016. Although the standard itself does not require usage of encryption,[24] most client implementations (Firefox,[25] Chrome, Safari, Opera, IE, Edge) have stated that they will only support HTTP/2 over TLS, which makes encryption de facto mandatory. Rule - Do Not Provide Non-TLS Pages for Secure Content Rule - Do Not Mix TLS and Non-TLS Content Rule - Use "Secure" Cookie Flag
  • #26 June 2016. Hackers Leak 36 million+ MongoDB Accounts - https://www.hackread.com/hacker-leaks-36-million-mongodb-accounts/ July 2015. 600TB MongoDB Database 'accidentally' exposed on the Internet - http://thehackernews.com/2015/07/MongoDB-Database-hacking-tool.html
  • #27 Управление конфигурациями, аудит Clickjacking, JSON hijacking, x-powered-by, X-XSS-Protection, etc. HTTP parameter pollution attack Cross Origin Resource Sharing
  • #33 Content Security Policy (CSP) - Content-Security-Policy: default-src 'self' *.mydomain.com
  • #36 Do not send passwords to users. Use temporary links to reset passwords.
  • #39 OpenSSL/Node.js crypto package ALWAYS hash on the server Use secure hash functions, e.g. SHA256 Use long salt generated by Cryptographically Secure Pseudo-Random Number Generator (CSPRNG) Slow hash functions (PBKDF2, scrypt, bcrypt). Bcrypt is the best. Use keyed hashes (HMAC)