Как разработать защищенноевеб-приложение и не сойтипри этом с ума?Владимир Кочетковспециалист по анализу защищенности веб-...
Краткоесодержание
― Эффективная разработка защищенного кода требуетизменений в образе мышления вовлеченных участников.― Существующие обучающ...
GET /api/shop/discount?shopId=3&productId=1584&coupon=1y3z9 HTTP/1.1Host: superdupershop.comCookie: ASP.NET_SessionId=10g5...
var shopId = Request["shopId"];var productId = Request["productId"];var coupon = Request["coupon"];var couponPattern = str...
var shopId = Request["shopId"];var productId = Request["productId"];var coupon = Request["coupon"];var couponPattern = str...
var shopId = 0;if (!int.TryParse(Request["shopId"], out shopId)){throw new InvalidArgumentException();}var productId = 0;i...
Глоссарий
ИС защищена, если не нарушен ряд свойств всех ееинформационных потоков:• модель CIA:—конфиденциальность—доступность—целост...
― То, что может сделать с информацией атакующий,называется угрозой (threat)― То, благодаря чему он может это сделать, назы...
Причины и следствияНедостаток УгрозаУязвимость АтакаРискНезащищенностьНебезопасностьБороться необходимо с причинами, а не ...
Почему борьба с атаками сложнее, чем с недостатками илиASP.NET Request Validation versus IRVhttp://habrahabr.ru/company/pt...
Типичный образмышления
― Фокус на функциональных требованиях― Знает о:• 10 рисках (OWASP Top 10)• 1 угрозе (срыв дедлайна)• Недостатки? Нет, не с...
* на основе результатов опроса http://www.rsdn.ru/?poll/3488Осведомленность разработчиков*0.00%10.00%20.00%30.00%40.00%50....
Риски — для менеджеров…… не для разработчиков!
“Безопасник”― Фокус на требованиях к защищенности― Отличает атаки от уязвимостей ― Сконцентрирован на уязвимостях«If you ...
Недостатки функционала…тоже являются причинамиуязвимостей!
Рефакторинг образа мышления― «Разработчик»:• выбросить из головы все хит-парады безопасности• сконцентрироваться на недост...
Что такое уязвимость?
Немного скучной теории
Математическая абстракция, представляющаяуниверсальную вычислительную машину.― Машина Тьюринга состоит из:• бесконечной яч...
МТ: семерка M=(Q,Γ,b,Σ,δ,q0,F)где:Q - конечное непустое множество состояний;Γ - конечное непустое множество символов алфав...
Теорема останова: не существует алгоритма, способногоопределить, остановится ли программа на заданном набореданных;Теорема...
Удаление всех вхождений символа «a»Что произойдет, если входная строка будетсодержать пустой символ или ‘#’?Демо?
Машина с состояниями, в которой:― функции перехода и/или множество состояний искаженывходными данными;― на каждой итерации...
Конфигурация: состояние, содержимое ленты, позиция наленте.Условная политика: множество конфигураций, неприводящих к реали...
Двойка (V, C), где:― V - неавторизованная конфигурация, нарушающаяполитику защищенности;― C- последовательность условий, о...
Полная модель ЗМТ«and we need to go deeper» (с)
"Modeling Computer Insecurity" (Sophie Engle, Sean Whalen andMatt Bishop):провести полную динамическую оценку защищенности...
Семантика любого дискретного процесса может бытьописана в виде множества состояний и условий переходамежду ними.Зачем все ...
Критерии к входным данным, приводящиепроцесс к тому или иномусостоянию, формируют множестваконфигураций ИС.Зачем все это?!
Политика защищенности формируется в результате анализамодели угроз и выделения неавторизованныхконфигураций, приводящих к ...
Для типовых строительных блоков веб-приложенийконтрмеры по обеспечению их защищенности ужесформулированы как результат эво...
Моделирование угроз
Что?Процесс обнаружения угроз в разрабатываемом приложенииКто?Архитекторы и разработчикиКогда?Чем раньше, тем лучшеЗачем?Ч...
ПроцессПостроение илиуточнение DFDИдентификацияугрозВыработкаконтрмерВалидациямодели
Построение или уточнение DFDЭлемент Обозначение ПримерыВнешняя сущность ПользователиВнешние системыПроцесс Исполняемые фай...
Построение или уточнение DFD
Дальнейшая декомпозиция модели требуется, если:― описаны не все потоки, проходящие через границыдоверия;― существуют неявн...
Построение или уточнение DFD
― Контекстная• Цельные компоненты / продукты / системы― 1-го уровня• Отдельные функциональные возможности или сценарии― 2-...
― Конечным источником потока данных может являтьсявнешняя сущность, хранилище или процесс, который егосоздает.― Если в DFD...
Модель STRIDE описывает угрозы нарушения 6 свойствинформационных потоков.Не требует знаний уровня эксперта для ее построен...
Для каждого элемента DFD специфичен свой набор угроз.* Repudiation специфична только для хранилищ, ведущих журнал транзакц...
Выработка контрмер —конечная цель моделированияугроз.Контрмера для каждой угрозы должна сводиться к:― редизайну или пересм...
Осуществляется на протяжении всего цикла разработки.― Модель соответствует текущей реализации?― Перечислены все угрозы?• м...
Построение модели угроз для типового веб-приложенияПример
Защищенностьстандартнойконфигурации
Secure by Design, by Default and in Deployment― реализация принципа наименьших прав и привилегий;― минимальный набор включ...
Защищенностьтранспортного слоя
- HTTP через SSL/TLS. Предназначен для обеспечения:― конфиденциальности и целостности данных,передаваемых по HTTP;― аутент...
Статические ресурсы, используемые в документе, которыйпередается по HTTPS:― таблицы стилей,― сценарии,― объекты,также долж...
Популярные подходы:- HTTP по умолчанию, HTTPS по выбору пользователя,- HTTP везде, критические точки входа через HTTPS,неэ...
Частично противодействовать им можно, используя:― site-wide HTTPS без опционального HTTP,― HTTP-заголовок: Strict-Transpor...
- использование 2048-битного ключа;- защита закрытой части ключа;- эффективное покрытие доменов;- использование проверенно...
Обработка ошибок
Сообщения об ошибках:Раскрытие информации
Коды ответа:Раскрытие информации<customErrors mode="On" /><customErrors mode="RemoteOnly" redirectMode="ResponseRewrite"de...
Оракул — weird-машина, отвечающая на вопросыатакующего в рамках своего функционала.Наиболее известный пример: оракул допол...
― Использование собственных обработчиков ошибок ипредставлений с универсальными сообщениями о них.― Реализация транзакцион...
Защищенность клиентскойстороны
― X-Content-Type-Options {nosniff} отключаетраспознавание MIME-типа в IE(http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8...
― X-Frame-Options {DENY | SAMEORIGIN | ALLOW-FROM uri}определяет возможность открытия документа во фрейме(http://tools.iet...
Как разработчики используют CSP0%93%7%Используете ли вы CSP для защиты своих веб-приложений?ДаНет, узнал о CSP из этогогол...
Основные поддерживаемые директивы:― (connect|font|frame|img|media|object|script|style)-src uriограничивает URI, к которым ...
Управление доступом
Идентификация:Установление идентификационных данныхАутентификация:Подтвержденное установление идентификационныхданныхАвтор...
Сложность паролей
Парольная энтропия:L=log2(nm),где n — размер множества допустимых символов,m — фактическая длина пароляЭффективность парол...
Сложность пароля должна быть ограничена снизу поэнтропии, определенной в требованиях защищенности.Примеры правил повышения...
У пользователя должен быть шанс придумать устойчивыйпароль с первой попытки.Контроль словарных паролей следует реализовыва...
Блокировка аккаунтов после n неудачных попыток входа=> DoS-условиеПредпочтительнее внедрение временных задержек илисредств...
Форма восстановления пароля не должна быть оракуломдля получения списка пользователей.Одно поле для ввода почтового адреса...
― кодовые слова;― ссылки для сброса пароля;― идентификаторы сессии;― любые другие данные, позволяющие получитьаутентифицир...
P = hash(password, salt)Криптографические функции хэширования не являютсяфункциями хэширования паролей. Для создания хэшей...
Самодельная криптография
Энтропия сессионного токена должна быть не ниже 128бит (генерация токена при помощи SRNG илишифрования).Передача токена до...
Пример: фиксация сессии
Пример: фиксация сессии
Весь доступный функционал бизнес-логики должен бытьраспределен между ролями явным образом. Гость – тожероль.Презентационны...
Пример: обход авторизации
Пример: обход авторизацииОтвет:{"d":{"__type" : "Customer:#Web","Address" : "3 Childers St","CustomerID" : "3","Email" : "...
Пример: обход авторизации
Предварительнаяобработка данных
― Типизация — создание объектного представлениявходных данных из строкового типа (парсинг идесериализация).― Валидация — п...
Типизация и валидация на входе, санитизация — на выходе!Смотри, не перепутай…
Входные данные — формальный язык.Некоторые языки распознаются сложнее, чем остальные.Для некоторых языков распознавание не...
Тестирование эквивалентности конечных автоматов илидетерминированных стековых автоматов разрешимо.Для недетерминированных ...
Шаги по реализации защищенной обработке данных:Упрощение или декомпозиция языка входных данных домножества регулярных или ...
Критерий уязвимости к атакам произвольных инъекцийСпособ формирования выходных данных DOUTPUT на основе входных данныхDINP...
Пример: LINQ Injectionpublic AjaxStoreResult GetCustomers(int limit, int start, string dir, string sort){var query = (from...
Пример: LINQ Injectionpublic AjaxStoreResult GetCustomers(int limit, int start, string dir, string sort){var query = (from...
Пример: LINQ Injectionpublic AjaxStoreResult GetCustomers(int limit, int start, string dir, string sort){if (!Regex.IsMatc...
Пример: LINQ Injectionpublic AjaxStoreResult GetCustomers(int limit, int start, string dir, string sort){if (!Regex.IsMatc...
Пример: XSSФрагмент .aspx-страницы:<p>You are now leaving this site - were no longer responsible!</p><p><asp:Literal runat...
Пример: XSSФрагмент .aspx-страницы:<p>You are now leaving this site - were no longer responsible!</p><p><asp:Literal runat...
Пример: XSSФрагмент .aspx-страницы:<p>You are now leaving this site - were no longer responsible!</p><p><asp:Literal runat...
Пример: XSSФрагмент .aspx-страницы:<p>You are now leaving this site - were no longer responsible!</p><p><asp:Literal runat...
Демо: как взорвать АЭС через XSS
Управление потокомопераций
Поток операций хорошо описывается через состояния иправила перехода между ними.Для всех потоков операций должна быть опред...
Аутентичность источника запроса, инициирующего переходпо потоку операций, подлежит принудительному контролю.Распространенн...
Пример: CSRF
Пример: CSRF
Пример: CSRF...<input type="button" value="Update status" onclick="return UpdateStatus()" />...<script language="javascrip...
Пример: CSRF[OperationContract]public void UpdateStatus(string statusUpdate){if (!HttpContext.Current.User.Identity.IsAuth...
Пример: CSRF[OperationContract]public void UpdateStatus(string statusUpdate){if (!HttpContext.Current.User.Identity.IsAuth...
Пример: CSRF<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transiti...
Пример: CSRF
Пример: CSRFprotected string GetToken(){if (Session["Token"] == null){Session["Token"] = Guid.NewGuid();}return Session["T...
Пример: CSRFprotected string GetToken(){if (Session["Token"] == null){Session["Token"] = Guid.NewGuid();}return Session["T...
Реализация прочейбизнес-логики
Потоки операций бизнес-логики должны обладать нетолько свойствами необходимости и достаточности для еереализации, но также...
Пример: доступ к скрытым даннымvar fieldName = Request["field"] ?? "Id";var minValue = int.Parse(Request["min"]);var maxVa...
Пример: доступ к скрытым даннымvar fieldName = Request["field"] ?? "Id";var minValue = int.Parse(Request["min"]);var maxVa...
Пример: массовое присваиваниеpublic class User{public int Id{ get; set; }public string UserName{ get; set; }public string ...
Пример: массовое присваиваниеpublic class User{public int Id{ get; set; }public string UserName{ get; set; }public string ...
Пример: массовое присваиваниеpublic class User{public int Id{ get; set; }public string UserName{ get; set; }public string ...
Пример: массовое присваиваниеpublic class User{public int Id{ get; set; }public string UserName{ get; set; }public string ...
Security DevelopmentLifecycle
Microsoft SDL
Рекомендуемые темы:― Пред-SDL:• Введение в SDL;• Основы разработки защищенного ПО с помощьюSDL.― Фаза выработки требований...
Рекомендуемые темы― Фазы проектирования, реализации и тестирования:• основы защищенного проектирования, разработки итестир...
Практики SDL:― требования к защищенности;― контрольные условия качества и критерии недостатков;― оценка рисков защищенност...
Практики SDL:― требования проектирования;― уменьшение количества возможных направлений атак;― моделирование угроз.Проектир...
Практики SDL:― использование утвержденных инструментов;― отказ от опасных функций;― статический анализ.Реализация
Практики SDL:― динамический анализ;― фаззинг;― анализ модели угроз и возможных направлений атак.Проверка
Практики SDL:― План реагирования на инциденты:• участники;• стратегия патч-менеджмента;• планы обеспечения защищенности ст...
Практики SDL:― Исполнение плана реагирования на инциденты:• анализ полученной информации об уязвимости;• оценка риска;• вы...
SDL подразумевает линейность процессаразработки, однако практики SDL хорошо адаптируются кagile посредством их распределен...
― требования к защищенности;― оценка рисков защищенности и приватности;― требования к проектированию;― уменьшение количест...
― обучение;― моделирование угроз;― использование утвержденных инструментов;― отказ от опасных функций;― статический анализ...
― контрольные условия качества и критерии недостатков;― динамический анализ;― фаззинг;― анализ модели угроз и возможных на...
Спасибо за внимание!Вопросы?Владимир Кочетковvkochetkov@ptsecurity.ru@kochetkov_vспециалист по анализу защищенности веб-пр...
В презентации использованы материалы следующих работ:― “OWASP Top 10 for .NET Developers” by Troy Hunt― “The Science of In...
Upcoming SlideShare
Loading in …5
×

Владимир Кочетков. Как разработать защищенное веб-приложение и не сойти при этом с ума?

756 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
756
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Владимир Кочетков. Как разработать защищенное веб-приложение и не сойти при этом с ума?

  1. 1. Как разработать защищенноевеб-приложение и не сойтипри этом с ума?Владимир Кочетковспециалист по анализу защищенности веб-приложенийPositive TechnologiesPositive Hack Days III
  2. 2. Краткоесодержание
  3. 3. ― Эффективная разработка защищенного кода требуетизменений в образе мышления вовлеченных участников.― Существующие обучающие ресурсы навязываютизучение причин по их следствиям и противодействиеследствиям вместо устранения причин.― Следуя общепринятым подходам, разработчик долженстать квалифицированным пентестером, чтобы начатьписать защищенный код.Это НЕ РАБОТАЕТ!Почему?
  4. 4. GET /api/shop/discount?shopId=3&productId=1584&coupon=1y3z9 HTTP/1.1Host: superdupershop.comCookie: ASP.NET_SessionId=10g5o4zjkmbd2i552d5j3255;.ASPXAUTH=f2d345118221742ee0316d4080a53af014eb8a3161db421d36aa6a86ffea6781b5584f4157ec85ae5956cfc54cc93c34a3f9449c8ef4c70b5b54d46e0def3677cce9a8105340b8ccc6c8e64dfa37ae953f987517Внимание, черный ящик!
  5. 5. var shopId = Request["shopId"];var productId = Request["productId"];var coupon = Request["coupon"];var couponPattern = string.Format("{0}-{1}-{2}", shopId, productId, coupon);var sqlCommandTxt = string.Format(" SELECT value FROM Discounts WHERE coupon LIKE {0}", coupon);var cmd = new SqlCommand(sqlCommandTxt, dataConnection);// Execute query, process result etc...Внимание, белый ящик!
  6. 6. var shopId = Request["shopId"];var productId = Request["productId"];var coupon = Request["coupon"];var couponPattern = string.Format("{0}-{1}-{2}", shopId, productId, coupon);var cmd = new SqlCommand("SELECT * FROM Discounts WHERE coupon LIKE @couponPattern",dataConnection);cmd.Parameters.Add(new SqlParameter("@couponPattern", couponPattern));// Execute query, process result etc...Уязвимости устранены?
  7. 7. var shopId = 0;if (!int.TryParse(Request["shopId"], out shopId)){throw new InvalidArgumentException();}var productId = 0;if (!int.TryParse(Request["productId"], out productId)){throw new InvalidArgumentException();}var coupon = Request["coupon"];if (!Regex.IsMatch(coupon, "^[A-Za-z0-9]{5}$")){throw new InvalidArgumentException();}var couponPattern = string.Format("{0}-{1}-{2}", shopId, productId, coupon);var cmd = new SqlCommand("SELECT * FROM Discounts WHERE coupon=@couponPattern", dataConnection);cmd.Parameters.Add(new SqlParameter("@couponPattern", couponPattern));// Execute query, process result etc...Теперь– да!
  8. 8. Глоссарий
  9. 9. ИС защищена, если не нарушен ряд свойств всех ееинформационных потоков:• модель CIA:—конфиденциальность—доступность—целостность• модель STRIDE – CIA плюс:—аутентифицированность—авторизованность—неотказуемостьЗащищенная ИС
  10. 10. ― То, что может сделать с информацией атакующий,называется угрозой (threat)― То, благодаря чему он может это сделать, называетсяуязвимостью (vulnerability), обусловленной недостатком(weakness)― То, как он может это сделать, называется атакой (attack)― То, с какой вероятностью у него это удастся и какиепоследствия может повлечь, называется риском (risk)― То, что не позволяет атакующему провести атаку,обеспечивает защищенность (security)― То, что минимизирует риск, обеспечивает безопасность(safety)Памятка по терминам ИБ
  11. 11. Причины и следствияНедостаток УгрозаУязвимость АтакаРискНезащищенностьНебезопасностьБороться необходимо с причинами, а не со следствиями!
  12. 12. Почему борьба с атаками сложнее, чем с недостатками илиASP.NET Request Validation versus IRVhttp://habrahabr.ru/company/pt/blog/178357/Демо
  13. 13. Типичный образмышления
  14. 14. ― Фокус на функциональных требованиях― Знает о:• 10 рисках (OWASP Top 10)• 1 угрозе (срыв дедлайна)• Недостатки? Нет, не слышал― Сконцентрирован на рисках«I know when I’m writing code I’m notthinking about evil, I’m just trying to thinkabout functionality» (с) Scott Hanselman“Разработчик”
  15. 15. * на основе результатов опроса http://www.rsdn.ru/?poll/3488Осведомленность разработчиков*0.00%10.00%20.00%30.00%40.00%50.00%60.00%70.00%80.00%90.00%AbuseofFunctionalityBruteForceBuffer/FormatStringOverflowContentSpoofingCredential/SessionPredictionCross-SiteRequestForgeryCross-SiteScriptingDenialofServiceFingerprintingHPP/HPCHRSIntegerOverflowsLDAPInjectionMailCommandInjectionNullByteInjectionOSCommandingPathTraversalPredictableResourceLocationRemote/LocalFileInclusionRoutingDetourSessionFixationSOAPArrayAbuseSQLInjectionSSIInjectionURLRedirectorAbuseXMLAttributeBlowupXMLEntityExpansionXMLExternalEntitiesXMLInjectionXPath/XQueryInjectionAttacks based on WASC classification Attacks included at OWASP Top 10 risks
  16. 16. Риски — для менеджеров…… не для разработчиков!
  17. 17. “Безопасник”― Фокус на требованиях к защищенности― Отличает атаки от уязвимостей ― Сконцентрирован на уязвимостях«If you dont understand thebusiness, you cant see business logicflaws.» (с) OWASP
  18. 18. Недостатки функционала…тоже являются причинамиуязвимостей!
  19. 19. Рефакторинг образа мышления― «Разработчик»:• выбросить из головы все хит-парады безопасности• сконцентрироваться на недостатках― «Безопасник»:• взаимодействовать с разработчиками• учитывать специфику функционала• сконцентрироваться на уязвимостях
  20. 20. Что такое уязвимость?
  21. 21. Немного скучной теории
  22. 22. Математическая абстракция, представляющаяуниверсальную вычислительную машину.― Машина Тьюринга состоит из:• бесконечной ячеистой ленты;• управляющего устройства с конечным числом состояний;• таблицы переходов между состояниями.― На каждой итерации можно:• изменить текущую ячейку;• перейти в другое состояние;• переместиться на соседнюю ячейку.Машина Тьюринга
  23. 23. МТ: семерка M=(Q,Γ,b,Σ,δ,q0,F)где:Q - конечное непустое множество состояний;Γ - конечное непустое множество символов алфавита;b∈Γ - пустой символ;Σ⊆Γ∖b - множество входных символов;q0∈Q - начальное состояние;F⊆Q - множество финальных состояний;δ:Q∖F Γ → Q Γ {L,R} - частичная функция перехода, где:• L- сдвиг по ленте влево• R - сдвиг по ленте вправоФормальное определение
  24. 24. Теорема останова: не существует алгоритма, способногоопределить, остановится ли программа на заданном набореданных;Теорема Клини о неподвижной точке: не существуеталгоритма, преобразующего программы, который бы покаждой программе давал другую, не эквивалентную ей;Теорема Успенского-Райса: не существуеталгоритма, разрешающего нетривиальные свойствапрограмм;Пределы МТ
  25. 25. Удаление всех вхождений символа «a»Что произойдет, если входная строка будетсодержать пустой символ или ‘#’?Демо?
  26. 26. Машина с состояниями, в которой:― функции перехода и/или множество состояний искаженывходными данными;― на каждой итерации происходит непредсказуемыйпереход в некорректное состояние.Эксплуатация weird-машиныможет дать полный или частичныйконтроль над исходной машиной.Weird-машина
  27. 27. Конфигурация: состояние, содержимое ленты, позиция наленте.Условная политика: множество конфигураций, неприводящих к реализации информационныхугроз, разрешенных при определенных условиях, которомуудовлетворяет текущее состояние или содержимое ленты.Политика защищенности: объединение условных политик.Защищенная МТ: машина, все конфигурации временивыполнения которой удовлетворяют политикезащищенности.Защищенная МТ
  28. 28. Двойка (V, C), где:― V - неавторизованная конфигурация, нарушающаяполитику защищенности;― C- последовательность условий, описывающих историювычисления, приводящую к V.Уязвимость
  29. 29. Полная модель ЗМТ«and we need to go deeper» (с)
  30. 30. "Modeling Computer Insecurity" (Sophie Engle, Sean Whalen andMatt Bishop):провести полную динамическую оценку защищенностипрограммы можно, только выполнив ее на всех возможныхнаборах входных данных.Разработка защищенного кода менее трудоемкийпроцесс, чем анализ защищенности уже существующегокода.Вычислимость проблемы защищенностиСтатическая оценка защищенностипрограммы, даже в соответствии сопределенной для нееполитикой, является неразрешимойпроблемой.Определение соответствия текущейконфигурации политикезащищенности, очевидно, разрешимо
  31. 31. Семантика любого дискретного процесса может бытьописана в виде множества состояний и условий переходамежду ними.Зачем все это?!
  32. 32. Критерии к входным данным, приводящиепроцесс к тому или иномусостоянию, формируют множестваконфигураций ИС.Зачем все это?!
  33. 33. Политика защищенности формируется в результате анализамодели угроз и выделения неавторизованныхконфигураций, приводящих к реализации любой извыявленных угроз.Устранение неавторизованных конфигураций формируюткомплекс контрмер по обеспечению защищенностиИС, любые другие действия, оперирующие «степеньюнеавторизованности» формируют комплекс контрмер пообеспечению безопасности ИС.Разработка кода в соответствии с политикой защищенности:security driven developmentЗачем все это?!
  34. 34. Для типовых строительных блоков веб-приложенийконтрмеры по обеспечению их защищенности ужесформулированы как результат эволюции.На их основе выработан набор практик, следуя которымможно избежать появления недостатков в архитектуре иреализации веб-приложения.Хорошие новостиПостроение политикизащищенности обычно необходимотолько для реализации слоя бизнес-логики, чтобы избежать появлениялогических недостатков.
  35. 35. Моделирование угроз
  36. 36. Что?Процесс обнаружения угроз в разрабатываемом приложенииКто?Архитекторы и разработчикиКогда?Чем раньше, тем лучшеЗачем?Чтобы выявить недостатки в архитектуре или моделипредметной области, которые могут стать уязвимостямиОсновы
  37. 37. ПроцессПостроение илиуточнение DFDИдентификацияугрозВыработкаконтрмерВалидациямодели
  38. 38. Построение или уточнение DFDЭлемент Обозначение ПримерыВнешняя сущность ПользователиВнешние системыПроцесс Исполняемые файлыКомпонентыСлужбыВеб-сервисыПоток данных Вызов функцииСетевой трафикХранилище данных База данныхФайлСтруктуры данныхГраницы доверия ПроцесснаяМашинная
  39. 39. Построение или уточнение DFD
  40. 40. Дальнейшая декомпозиция модели требуется, если:― описаны не все потоки, проходящие через границыдоверия;― существуют неявные объекты, пересекающие границыдоверия;― словесное описание модели требует употребления слов«иногда», «а также», «за исключением» и т.п.:• «Иногда, это хранилище данных используется вкачестве…» требует добавления в диаграмму второгохранилища• «Этот поток данных всегда используется для передачибизнес-сущностей, за исключением этапааутентификации» требует добавления дополнительногопотокаПостроение или уточнение DFD
  41. 41. Построение или уточнение DFD
  42. 42. ― Контекстная• Цельные компоненты / продукты / системы― 1-го уровня• Отдельные функциональные возможности или сценарии― 2-го уровня• Функциональные возможности, разбитые на компоненты― 3-го уровня• Полная декомпозиция, детально описывающаяархитектуру или модель предметной областиДетальность DFD
  43. 43. ― Конечным источником потока данных может являтьсявнешняя сущность, хранилище или процесс, который егосоздает.― Если в DFD присутствуют потокиданных, предназначенные только для записи, то в 90%случаев это говорит о ее неполноте.― Потоки данных не могут передаваться от хранилища кхранилищу напрямую, передача возможна только черезпроцессы.― DFD должна описывать архитектуру или модельпредметной области, а не их реализацию («нет» блок-схемам, диаграммам классов и графам вызовов).Правила построения DFD
  44. 44. Модель STRIDE описывает угрозы нарушения 6 свойствинформационных потоков.Не требует знаний уровня эксперта для ее построения.Идентификация угрозУгроза СвойствоSpoofing АутентифицированностьTampering ЦелостностьRepudiation НеотказуемостьInformation Disclosure КонфиденциальностьDenial of Service ДоступностьElevation of privilege Авторизованность
  45. 45. Для каждого элемента DFD специфичен свой набор угроз.* Repudiation специфична только для хранилищ, ведущих журнал транзакцийСпецифичность угрозЭлемент S T R I D E√ √√ √ √ √ √ √√ √ √√ ?* √ √
  46. 46. Выработка контрмер —конечная цель моделированияугроз.Контрмера для каждой угрозы должна сводиться к:― редизайну или пересмотру требований (концентрацияна угрозах);― выделению конфигураций, приводящих к реализацииугрозы и принятию мер по устранению причин ихвозникновения (концентрация науязвимости/недостатке);― формированию требований к внешней среде дляустранения возможности эксплуатации уязвимости(концентрация на атаке) или снижения вероятностиуспешной атаки и минимизации ущерба (концентрацияна рисках).Выработка контрмер
  47. 47. Осуществляется на протяжении всего цикла разработки.― Модель соответствует текущей реализации?― Перечислены все угрозы?• минимум: элементы, пересекающие границы доверия.― Контрмеры выработаны для каждой угрозы?― Контрмеры реализованы корректно?Валидация модели
  48. 48. Построение модели угроз для типового веб-приложенияПример
  49. 49. Защищенностьстандартнойконфигурации
  50. 50. Secure by Design, by Default and in Deployment― реализация принципа наименьших прав и привилегий;― минимальный набор включенного функционала;― принудительное изменение стандартных учетныхданных;― проектирование каждого компонента, исходя изпредполагаемой компрометации всех остальных.Принцип SD3
  51. 51. Защищенностьтранспортного слоя
  52. 52. - HTTP через SSL/TLS. Предназначен для обеспечения:― конфиденциальности и целостности данных,передаваемых по HTTP;― аутентичности стороны сервера (реже – и клиента).Или иными словами для защиты от атак класса MitM.HTTPS
  53. 53. Статические ресурсы, используемые в документе, которыйпередается по HTTPS:― таблицы стилей,― сценарии,― объекты,также должны передаваться по защищенному каналу!Использование смешанного контента
  54. 54. Популярные подходы:- HTTP по умолчанию, HTTPS по выбору пользователя,- HTTP везде, критические точки входа через HTTPS,неэффективны и подвержены атакам SSL Stripping.Неэффективная передача данных
  55. 55. Частично противодействовать им можно, используя:― site-wide HTTPS без опционального HTTP,― HTTP-заголовок: Strict-Transport-Security: max-age=expireTime [; includeSubdomains]при условии, что первый раз пользователь попадет на сайтпо протоколу HTTPS.Неэффективная передача данных
  56. 56. - использование 2048-битного ключа;- защита закрытой части ключа;- эффективное покрытие доменов;- использование проверенного CA;- настройка валидной цепочки сертификатов;- использование защищенных протоколов;- использование защищенных наборов шифрования;- контроль автоматического выбора набора шифрования;- отключение инициации renegotiation клиентом;- устранение известных проблем (BEAST, CRIME).https://www.ssllabs.com/projects/best-practices/Практики этапа развертывания
  57. 57. Обработка ошибок
  58. 58. Сообщения об ошибках:Раскрытие информации
  59. 59. Коды ответа:Раскрытие информации<customErrors mode="On" /><customErrors mode="RemoteOnly" redirectMode="ResponseRewrite"defaultRedirect="~/Error.aspx" />
  60. 60. Оракул — weird-машина, отвечающая на вопросыатакующего в рамках своего функционала.Наиболее известный пример: оракул дополнения.Создание оракулов
  61. 61. ― Использование собственных обработчиков ошибок ипредставлений с универсальными сообщениями о них.― Реализация транзакционности на уровне:• методов (try-catch-finally);• состояний рабочего потока.― Исключение побочных каналов:• кодов HTTP-ошибок;• временных задержек.Практики обработки ошибок
  62. 62. Защищенность клиентскойстороны
  63. 63. ― X-Content-Type-Options {nosniff} отключаетраспознавание MIME-типа в IE(http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx)― X-XSS-Protection {0 | 1 | 1; mode=block} управляет XSS-фильтром в IE(http://blogs.msdn.com/b/ieinternals/archive/2011/01/31/controlling-the-internet-explorer-xss-filter-with-the-x-xss-protection-http-header.aspx)4 HTTP-заголовка
  64. 64. ― X-Frame-Options {DENY | SAMEORIGIN | ALLOW-FROM uri}определяет возможность открытия документа во фрейме(http://tools.ietf.org/html/draft-ietf-websec-x-frame-options-00)― X-Content-Security-Policy | Content-Security-Policy | X-WebKit-CSP {…} определяет политику защищенностиконтента (Content Security Policy, CSPhttps://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html)4 HTTP-заголовка
  65. 65. Как разработчики используют CSP0%93%7%Используете ли вы CSP для защиты своих веб-приложений?ДаНет, узнал о CSP из этогоголосованияНет, о CSP знал и раньше* на основе результатов опроса http://www.rsdn.ru/?poll/33884 по состоянию на 20 мая 2013 года.
  66. 66. Основные поддерживаемые директивы:― (connect|font|frame|img|media|object|script|style)-src uriограничивает URI, к которым можно обратиться из теговдокумента― default-src uri определяет умолчания для всех src-директив― report-uri uri определяет URI для сообщений онарушениях политики― sandbox flags определяет песочницу для элементовiframe, ограничивающую множество состояний ихсодержимого (где flags: allow-same-origin | allow-top-navigation | allow-forms | allow-scripts)Content Security Policy
  67. 67. Управление доступом
  68. 68. Идентификация:Установление идентификационных данныхАутентификация:Подтвержденное установление идентификационныхданныхАвторизация:Назначение прав идентификационным даннымЭтапы управления доступом
  69. 69. Сложность паролей
  70. 70. Парольная энтропия:L=log2(nm),где n — размер множества допустимых символов,m — фактическая длина пароляЭффективность пароля — отношение энтропии к егофактической длине (в битах).Увеличение энтропии на 1 бит удваивает максимальноеколичество итераций перебора.Повышение энтропии через увеличение длины пароляэффективнее, чем через увеличение мощности алфавита.Сложность паролей
  71. 71. Сложность пароля должна быть ограничена снизу поэнтропии, определенной в требованиях защищенности.Примеры правил повышения энтропии:• в качестве исходного алфавита должно использоватьсямаксимально доступное множество групп символов;• в пароле должен присутствовать хотя бы один символ изкаждой группы;• символы, принадлежащие одной и той же группе, недолжны встречаться в пароле на соседних позициях;• количество символов, принадлежащих каждой изгрупп, должно быть одинаково;• один и тот же символ не должен встречаться в паролеболее одного раза.Сложность паролей
  72. 72. У пользователя должен быть шанс придумать устойчивыйпароль с первой попытки.Контроль словарных паролей следует реализовывать безфанатизма типа «угадай, какого пароля нет в списке TOP30M интернет-паролей».Ротации паролей следует избегать, за исключением:• привилегированных учетных записей;• стандартных учетных записей.Сложность паролей
  73. 73. Блокировка аккаунтов после n неудачных попыток входа=> DoS-условиеПредпочтительнее внедрение временных задержек илисредств анти-автоматизации.Перебор может осуществляться как по паролям дляконкретного пользователя, так и по пользователям дляконкретного пароля.Форма аутентификации — один из самых популярныхвидов оракулов.Блокировка учетных записей
  74. 74. Форма восстановления пароля не должна быть оракуломдля получения списка пользователей.Одно поле для ввода почтового адреса и одно сообщениеоб успешной отправке письма со ссылкой для сбросапароля.При переходе по ссылке открывается форма для вводанового пароля, не предоставляющая пользовательскуюсессию.Любые другие реализации приводят к возникновениюуязвимостей!Восстановление паролей
  75. 75. ― кодовые слова;― ссылки для сброса пароля;― идентификаторы сессии;― любые другие данные, позволяющие получитьаутентифицированную пользовательскую сессию,являются аутентификационными эквивалентами паролей,к конфиденциальности которых должны предъявлятьсятакие же требования!Эквиваленты паролей
  76. 76. P = hash(password, salt)Криптографические функции хэширования не являютсяфункциями хэширования паролей. Для создания хэшейпаролей следует использовать PBKDF2, bcrypt, scrypt и т.п.Длина соли должна быть достаточной для обеспеченияэнтропии >= 128 бит для любого пароля, допускаемогополитикой защищенности.Основное предназначение соли — затруднение атак пословарям и радужным таблицам.Хранение учетных данных
  77. 77. Самодельная криптография
  78. 78. Энтропия сессионного токена должна быть не ниже 128бит (генерация токена при помощи SRNG илишифрования).Передача токена должна осуществляться в cookie-параметре с флагами httponly и secure.После каждой попытки аутентификации или по истечениютаймаута неактивности должен создаваться новый токен, астарый аннулироваться.Аннулирование токена должно быть реализовано как наклиенте, так и на сервере.Управление сессиями
  79. 79. Пример: фиксация сессии
  80. 80. Пример: фиксация сессии
  81. 81. Весь доступный функционал бизнес-логики должен бытьраспределен между ролями явным образом. Гость – тожероль.Презентационный слой:• раскрытие информации о недоступном функционалеСлой бизнес-логики:• наличие функционала до выполнения авторизацииСлой данных:• контроль доступа без учета запрашиваемых данныхНеэффективная авторизация
  82. 82. Пример: обход авторизации
  83. 83. Пример: обход авторизацииОтвет:{"d":{"__type" : "Customer:#Web","Address" : "3 Childers St","CustomerID" : "3","Email" : "brucec@aol.com","FirstName" : "Bruce","Postcode" : "3000","State" : "VIC","Suburb" : "Melbourne"}}Запрос:
  84. 84. Пример: обход авторизации
  85. 85. Предварительнаяобработка данных
  86. 86. ― Типизация — создание объектного представлениявходных данных из строкового типа (парсинг идесериализация).― Валидация — проверка данных на соответствиеустановленным критериям:• грамматическая;• семантическая.― Санитизация — приведение данных в соответствие сграмматикой, допускаемой политикой защищенности.Подходы к предварительной обработке
  87. 87. Типизация и валидация на входе, санитизация — на выходе!Смотри, не перепутай…
  88. 88. Входные данные — формальный язык.Некоторые языки распознаются сложнее, чем остальные.Для некоторых языков распознавание неразрешимо.Чем сложнее язык, тем тяжелеесформировать критерии к входнымданным, описывающим множестваконфигураций системы.Обобщенный подход
  89. 89. Тестирование эквивалентности конечных автоматов илидетерминированных стековых автоматов разрешимо.Для недетерминированных стековых автоматов и болеемощных моделей вычислений такое тестирование являетсянеразрешимым.В первом случае возможно полное покрытие тестамиэлементов парсера языка обрабатываемых данных или ихстатический анализ.Во втором случае — НЕТ!Обобщенный подход
  90. 90. Шаги по реализации защищенной обработке данных:Упрощение или декомпозиция языка входных данных домножества регулярных или детерминированныхконтекстно-свободных грамматик.Внедрение в код проверок (типизации/валидации)входных данных в соответствии с их грамматикой какможно раньше в цикле обработки запроса.Внедрение в код санитайзеров выходныхданных, построенных в соответствии с грамматикойпринимающей стороны, как можно ближе к их выходу.Обобщенный подход
  91. 91. Критерий уязвимости к атакам произвольных инъекцийСпособ формирования выходных данных DOUTPUT на основе входных данныхDINPUT уязвим к атакам инъекции, если от содержимого DINPUT зависитколичество узлов в дереве разбора DOUTPUTПример применения
  92. 92. Пример: LINQ Injectionpublic AjaxStoreResult GetCustomers(int limit, int start, string dir, string sort){var query = (from c in this.DBContext.Customersselect new{c.CustomerID,c.CompanyName,c.ContactName,c.Phone,c.Fax,c.Region}).OrderBy(string.Concat(sort, " ", dir));int total = query.ToList().Count;query = query.Skip(start).Take(limit);return new AjaxStoreResult(query, total);}
  93. 93. Пример: LINQ Injectionpublic AjaxStoreResult GetCustomers(int limit, int start, string dir, string sort){var query = (from c in this.DBContext.Customersselect new{c.CustomerID,c.CompanyName,c.ContactName,c.Phone,c.Fax,c.Region}).OrderBy(string.Concat(sort, " ", dir));int total = query.ToList().Count;query = query.Skip(start).Take(limit);return new AjaxStoreResult(query, total);}
  94. 94. Пример: LINQ Injectionpublic AjaxStoreResult GetCustomers(int limit, int start, string dir, string sort){if (!Regex.IsMatch(dir, "(?-m:)(?i:)^asc|desc$")) dir = "ASC";if (!Regex.IsMatch(sort,"(?-m:)(?i:)^customerid|companyname|contactname|phone|fax|region$"))sort = "CustomerID";var query = (from c in this.DBContext.Customersselect new{c.CustomerID,c.CompanyName,c.ContactName,c.Phone,c.Fax,c.Region}).OrderBy(string.Concat(sort, " ", dir));var total = query.ToList().Count;query = query.Skip(start).Take(limit);return new AjaxStoreResult(query, total);}
  95. 95. Пример: LINQ Injectionpublic AjaxStoreResult GetCustomers(int limit, int start, string dir, string sort){if (!Regex.IsMatch(dir, "(?-m:)(?i:)^asc|desc$")) dir = "ASC";if (!Regex.IsMatch(sort,"(?-m:)(?i:)^customerid|companyname|contactname|phone|fax|region$"))sort = "CustomerID";var query = (from c in this.DBContext.Customersselect new{c.CustomerID,c.CompanyName,c.ContactName,c.Phone,c.Fax,c.Region}).OrderBy(string.Concat(sort, " ", dir));var total = query.ToList().Count;query = query.Skip(start).Take(limit);return new AjaxStoreResult(query, total);}
  96. 96. Пример: XSSФрагмент .aspx-страницы:<p>You are now leaving this site - were no longer responsible!</p><p><asp:Literal runat="server" ID="litLeavingTag" /></p>Фрагмент ее code-behind:var newUrl = Request.QueryString["Url"];var tagString = "<a href=" + newUrl + ">continue</a>";litLeavingTag.Text = tagString;
  97. 97. Пример: XSSФрагмент .aspx-страницы:<p>You are now leaving this site - were no longer responsible!</p><p><asp:Literal runat="server" ID="litLeavingTag" /></p>Фрагмент ее code-behind:var newUrl = Request.QueryString["Url"];var tagString = "<a href=" + newUrl + ">continue</a>";litLeavingTag.Text = tagString;Результат выполнения запросаhttp://host.domain/?url=><script>alert(XSS)</script:<p><a href=><script>alert(XSS)</script>continue</a></p>
  98. 98. Пример: XSSФрагмент .aspx-страницы:<p>You are now leaving this site - were no longer responsible!</p><p><asp:Literal runat="server" ID="litLeavingTag" /></p>Фрагмент ее code-behind:var newUrl = Request.QueryString["Url"];var tagString = "<a href=" + Server.HtmlEncode(newUrl) + ">continue</a>";litLeavingTag.Text = tagString;
  99. 99. Пример: XSSФрагмент .aspx-страницы:<p>You are now leaving this site - were no longer responsible!</p><p><asp:Literal runat="server" ID="litLeavingTag" /></p>Фрагмент ее code-behind:var newUrl = Request.QueryString["Url"];var tagString = "<a href=" + Server.HtmlEncode(newUrl) + ">continue</a>";litLeavingTag.Text = tagString;Результат выполнения запроса:http://host.domain/?url=><script>alert(XSS)</script:<p><a href=&gt;&lt;script&gt;alert(XSS)&lt;/script>continue</a></p>
  100. 100. Демо: как взорвать АЭС через XSS
  101. 101. Управление потокомопераций
  102. 102. Поток операций хорошо описывается через состояния иправила перехода между ними.Для всех потоков операций должна быть определенаполитика защищенности и реализован ее принудительныйконтроль.Следует избегать появления в потоке операцийрекурсивных путей и циклов, а также учитыватьвозможность нарушения целостности разделяемыхданных.Текущую конфигурацию потока нужно хранить передграницей доверия, а не за ней.Контроль целостности потока операций
  103. 103. Аутентичность источника запроса, инициирующего переходпо потоку операций, подлежит принудительному контролю.Распространенный подход заключается в использованиидвух токенов на каждый запрос (один хранится передграницей доверия, другой передается за нее) для контроляаутентичности путем их сравнения.Реализация контроля необходима только длязапросов, изменяющих состояние системы.Контроль аутентичности инициатораоперации
  104. 104. Пример: CSRF
  105. 105. Пример: CSRF
  106. 106. Пример: CSRF...<input type="button" value="Update status" onclick="return UpdateStatus()" />...<script language="javascript" type="text/javascript">// <![CDATA[ function UpdateStatus(){var service = new Web.StatusUpdateService();var statusUpdate = document.getElementById(txtStatusUpdate).value;service.UpdateStatus(statusUpdate, onSuccess, null, null);}function onSuccess(result){var statusUpdate = document.getElementById(txtStatusUpdate).value = "";__doPostBack(MainContent_updStatusUpdates, );}// ]]></script>
  107. 107. Пример: CSRF[OperationContract]public void UpdateStatus(string statusUpdate){if (!HttpContext.Current.User.Identity.IsAuthenticated)throw new ApplicationException("Not logged on");var dc = new VulnerableAppDataContext();dc.Status.InsertOnSubmit(new Status {StatusID = Guid.NewGuid(),StatusDate = DateTime.Now,Username = HttpContext.Current.User.Identity.Name,StatusUpdate = statusUpdate});dc.SubmitChanges();}
  108. 108. Пример: CSRF[OperationContract]public void UpdateStatus(string statusUpdate){if (!HttpContext.Current.User.Identity.IsAuthenticated)throw new ApplicationException("Not logged on");var dc = new VulnerableAppDataContext();dc.Status.InsertOnSubmit(new Status {StatusID = Guid.NewGuid(),StatusDate = DateTime.Now,Username = HttpContext.Current.User.Identity.Name,StatusUpdate = statusUpdate});dc.SubmitChanges();}
  109. 109. Пример: CSRF<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title></title><script src="http://localhost:85/ScriptResource.axd?d=4sSlXLx8QpYnLirlbD...<script src="http://localhost:85/ScriptResource.axd?d=oW55T29mrRoDmQ0h2E...<script src="http://localhost:85/StatusUpdateService.svc/jsdebug" type="...<script language="javascript" type="text/javascript">// <![CDATA[var service = new Web.StatusUpdateService();var statusUpdate = "hacky hacky";service.UpdateStatus(statusUpdate, null, null, null);// ]]></script></head><body>Youve been CSRFd!</body></html>
  110. 110. Пример: CSRF
  111. 111. Пример: CSRFprotected string GetToken(){if (Session["Token"] == null){Session["Token"] = Guid.NewGuid();}return Session["Token"].ToString();}...function UpdateStatus(){var service = new Web.StatusUpdateService();var statusUpdate = document.getElementById(txtStatusUpdate).value;var token = "<%= GetToken() %>";service.UpdateStatus(statusUpdate, token, onSuccess, null, null);}...[OperationContract]public void UpdateStatus(string statusUpdate, string token){var sessionToken = HttpContext.Current.Session["Token"];if (sessionToken == null || sessionToken.ToString() != token){throw new ApplicationException("Invalid token");}...
  112. 112. Пример: CSRFprotected string GetToken(){if (Session["Token"] == null){Session["Token"] = Guid.NewGuid();}return Session["Token"].ToString();}...function UpdateStatus(){var service = new Web.StatusUpdateService();var statusUpdate = document.getElementById(txtStatusUpdate).value;var token = "<%= GetToken() %>";service.UpdateStatus(statusUpdate, token, onSuccess, null, null);}...[OperationContract]public void UpdateStatus(string statusUpdate, string token){var sessionToken = HttpContext.Current.Session["Token"];if (sessionToken == null || sessionToken.ToString() != token){throw new ApplicationException("Invalid token");}...
  113. 113. Реализация прочейбизнес-логики
  114. 114. Потоки операций бизнес-логики должны обладать нетолько свойствами необходимости и достаточности для еереализации, но также и минимальности.Любые состояния и правила перехода, реализующие«чуть» больше функционала, чем это нужно для решаемойзадачи, должны быть упрощены либо ограничены.<?=@`$c`?>PHP-калькулятор арифметических выражений (полнота поТьюрингу — задел на будущее, код минимален уже сейчас).Избыточность функционала
  115. 115. Пример: доступ к скрытым даннымvar fieldName = Request["field"] ?? "Id";var minValue = int.Parse(Request["min"]);var maxValue = int.Parse(Request["max"]);var queryTemplate = string.Format("SELECT Id, Nickname, Rating, MessageCount, TopicCount FROM Users WHERE {0} >= @minValue AND {0} <=@maxValue ORDER BY {0}",fieldName.Replace("", string.Empty).Replace(" ", string.Empty).Replace("", string.Empty).Replace(",", string.Empty).Replace("(", string.Empty).Replace(")", string.Empty),);var selectCommand = string.Format(queryTemplate, debugStr);var cmd = new SqlCommand(selectCommand, dataConnection);cmd.Parameters.Add(new SqlParameter("@minValue", minValue));cmd.Parameters.Add(new SqlParameter("@maxValue", maxValue));.../users/filter.aspx?field={fieldName}&min={minBalue}&max={maxValue}
  116. 116. Пример: доступ к скрытым даннымvar fieldName = Request["field"] ?? "Id";var minValue = int.Parse(Request["min"]);var maxValue = int.Parse(Request["max"]);var queryTemplate = string.Format("SELECT Id, Nickname, Rating, MessageCount, TopicCount FROM Users WHERE {0} >= @minValue AND {0} <=@maxValue ORDER BY {0}",fieldName.Replace("", string.Empty).Replace(" ", string.Empty).Replace("", string.Empty).Replace(",", string.Empty).Replace("(", string.Empty).Replace(")", string.Empty),);var selectCommand = string.Format(queryTemplate, debugStr);var cmd = new SqlCommand(selectCommand, dataConnection);cmd.Parameters.Add(new SqlParameter("@minValue", minValue));cmd.Parameters.Add(new SqlParameter("@maxValue", maxValue));...http://host.domain/users/filter.aspx?field=password&min=a&max=a
  117. 117. Пример: массовое присваиваниеpublic class User{public int Id{ get; set; }public string UserName{ get; set; }public string Password{ get; set; }public bool IsAdmin{ get; set; }}public class UserController : Controller{IUserRepository _userRepository;public UserController(IUserRepository userRepository) {_userRepository = userRepository;}public ActionResult Edit(int id) {var user = _userRepository.GetUserById(id);return View(user);}[HttpPost]public ActionResult Edit(int id, FormCollection collection) {try {var user = _userRepository.GetUserById(id);UpdateModel(user);_userRepository.SaveUser(user);return RedirectToAction("Index");} catch {return View();}}}Model: Controller:
  118. 118. Пример: массовое присваиваниеpublic class User{public int Id{ get; set; }public string UserName{ get; set; }public string Password{ get; set; }public bool IsAdmin{ get; set; }}public class UserController : Controller{IUserRepository _userRepository;public UserController(IUserRepository userRepository) {_userRepository = userRepository;}public ActionResult Edit(int id) {var user = _userRepository.GetUserById(id);return View(user);}[HttpPost]public ActionResult Edit(int id, FormCollection collection) {try {var user = _userRepository.GetUserById(id);UpdateModel(user);_userRepository.SaveUser(user);return RedirectToAction("Index");} catch {return View();}}}Model: Controller:
  119. 119. Пример: массовое присваиваниеpublic class User{public int Id{ get; set; }public string UserName{ get; set; }public string Password{ get; set; }public bool IsAdmin{ get; set; }}public class UserController : Controller{IUserRepository _userRepository;public UserController(IUserRepository userRepository) {_userRepository = userRepository;}public ActionResult Edit(int id) {var user = _userRepository.GetUserById(id);return View(user);}[HttpPost]public ActionResult Edit(int id, FormCollection collection) {try {var user = _userRepository.GetUserById(id);TryUpdateModel(user, includeProperties: new[] {"UserName", "Password"});_userRepository.SaveUser(user);return RedirectToAction("Index");} catch {return View();}}}Model: Controller:
  120. 120. Пример: массовое присваиваниеpublic class User{public int Id{ get; set; }public string UserName{ get; set; }public string Password{ get; set; }public bool IsAdmin{ get; set; }}public class UserController : Controller{IUserRepository _userRepository;public UserController(IUserRepository userRepository) {_userRepository = userRepository;}public ActionResult Edit(int id) {var user = _userRepository.GetUserById(id);return View(user);}[HttpPost]public ActionResult Edit(int id, FormCollection collection) {try {var user = _userRepository.GetUserById(id);TryUpdateModel(user, includeProperties: new[] {"UserName", "Password"});_userRepository.SaveUser(user);return RedirectToAction("Index");} catch {return View();}}}Model: Controller:
  121. 121. Security DevelopmentLifecycle
  122. 122. Microsoft SDL
  123. 123. Рекомендуемые темы:― Пред-SDL:• Введение в SDL;• Основы разработки защищенного ПО с помощьюSDL.― Фаза выработки требований:• Защита приватности в разрабатываемом ПО;Обучение
  124. 124. Рекомендуемые темы― Фазы проектирования, реализации и тестирования:• основы защищенного проектирования, разработки итестирования;• введение в моделирование угроз;• справочник по защищенности;• SDL Developer Starter Kit.Обучение
  125. 125. Практики SDL:― требования к защищенности;― контрольные условия качества и критерии недостатков;― оценка рисков защищенности и приватности.Требования
  126. 126. Практики SDL:― требования проектирования;― уменьшение количества возможных направлений атак;― моделирование угроз.Проектирование
  127. 127. Практики SDL:― использование утвержденных инструментов;― отказ от опасных функций;― статический анализ.Реализация
  128. 128. Практики SDL:― динамический анализ;― фаззинг;― анализ модели угроз и возможных направлений атак.Проверка
  129. 129. Практики SDL:― План реагирования на инциденты:• участники;• стратегия патч-менеджмента;• планы обеспечения защищенности стороннего кода.― Окончательная проверка защищенности.― Выпуск и архив.Выпуск
  130. 130. Практики SDL:― Исполнение плана реагирования на инциденты:• анализ полученной информации об уязвимости;• оценка риска;• выпуск патча;• оповещение клиентов;• раскрытие информации.Реагирование
  131. 131. SDL подразумевает линейность процессаразработки, однако практики SDL хорошо адаптируются кagile посредством их распределения на три категории:― Разовые,выполняются единожды― Спринтовые,выполняются в рамках каждого спринта― Корзинные,в каждом спринте должна бытьвыполнена хотя бы одна практика изкорзиныSDL и Agile
  132. 132. ― требования к защищенности;― оценка рисков защищенности и приватности;― требования к проектированию;― уменьшение количества возможных направлений атак;― план реагирования на инциденты.Разовые практики
  133. 133. ― обучение;― моделирование угроз;― использование утвержденных инструментов;― отказ от опасных функций;― статический анализ;― окончательная проверка защищенности;― выпуск и архив.Спринтовые практики
  134. 134. ― контрольные условия качества и критерии недостатков;― динамический анализ;― фаззинг;― анализ модели угроз и возможных направлений атак.Корзинные практики
  135. 135. Спасибо за внимание!Вопросы?Владимир Кочетковvkochetkov@ptsecurity.ru@kochetkov_vспециалист по анализу защищенности веб-приложенийPositive Technologies
  136. 136. В презентации использованы материалы следующих работ:― “OWASP Top 10 for .NET Developers” by Troy Hunt― “The Science of Insecurity” by Len Sassaman, Meredith L.Patterson, Sergey Bratus― “The Essence of Command Injection Attacks in WebApplications” by Zhendong Su, Gary Wassermann― “Modeling Computer Insecurity” by Sophie Engle, SeanWhalen, Matt BishopCopyrights

×