Содержание
- 2. Руководитель отдела исследований по анализу защищённости приложений Positive Technologies AppSec- и CS-исследователь (формальные методы анализа и
- 3. Открытое сообщество разработчиков и IT-специалистов, которые стремятся создавать безопасные приложения. https://t.me/ru_appsec Positive Development User Group
- 4. Ещё один унылый доклад про параметризацию SQL-запросов? Intro (1/3)
- 5. Существует ли конечное множество правил разработки защищённых приложений? Intro (2/3)
- 6. Если ты хочешь построить корабль, не надо созывать людей, планировать, делить работу, доставать инструменты. Надо заразить
- 7. Инъекции – самый распространённый тип атак (1/2) https://www.ptsecurity.com/upload/corporate/ru-ru/analytics/WebApp-Vulnerabilities-2017-rus.pdf
- 8. Инъекции – самый распространённый тип атак (2/2) 84,6% https://www.ptsecurity.com/upload/corporate/ru-ru/analytics/WebApp-Vulnerabilities-2017-rus.pdf
- 9. Формально об инъекциях
- 10. 01 var a = Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a ==
- 11. 01 var a = Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a ==
- 12. 01 var a = Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a ==
- 13. Точка выхода c' = ftransform(a', b') 01 var a = Request.Params["a"]; 02 03 var b =
- 14. 01 var a = Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a ==
- 15. 01 var a = Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a ==
- 16. 01 var a = Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a ==
- 17. Приложение защищено от атак инъекций тогда, когда в результате лексического разбора любого возможного c', количество токенов,
- 18. Приложение защищено от атак инъекций тогда, когда в результате лексического разбора любого возможного c', множества токенов,
- 19. ../2/a.jpg 'onerror='…;// '> … Что может атакующий? (1/2)
- 20. … 0);… 0)'onload='… 0)'> … Что может атакующий? (2/2)
- 21. 01 var a = Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a ==
- 22. 01 var a = Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a ==
- 23. Интерпретируемый код Структурированные данные Код разметки ID внешних ресурсов Любые грамматики, с числом токенов > 1
- 24. Как защититься?
- 25. Входные данные должны согласовываться с бизнес-логикой приложения за счёт: Типизации Валидации Синтаксической Семантической Подходы к согласованию
- 26. Типизация – приведение строковых данных к конкретному типу: var typed_url = Url.Parse(Request.Params["url"]) Типизация
- 27. Синтаксическая валидация – проверка строковых данных на соответствие какой-либо грамматике: 01 var url_regex = 02 "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?";
- 28. Семантическая валидация – проверка строковых данных на корректность с точки зрения логики приложения: 01 var request
- 29. Выходные данные должны согласовываться с грамматикой принимающей стороны за счёт санитизации Подходы к согласованию грамматик выходных
- 30. Санитизация – преобразование строковых данных к синтаксису какого-либо токена заданной грамматики 01 var parm_text = Request.Params["parm"];
- 31. В случае вложенных грамматик, например: Gt = JavaScript → HTML, t ∈ De санитизацию необходимо проводить
- 32. Входные данные – как можно ближе к точке их входа, с учётом: принципа необходимости и достаточности
- 33. Из этих правил есть два исключения: Параметризация (типизация данных в точке выхода) Использование встраиваемых средств RASP
- 34. 01 var a = HtmlEncode(UrlEncode(Request.Params["a"])); 02 03 var b = int.Parse(Request.Params["b"]).ToString(); 04 05 if (a ==
- 35. 01 var a = HtmlEncode(UrlEncode(Request.Params["a"])); 02 03 var b = int.Parse(Request.Params["b"]).ToString(); 04 05 if (a ==
- 36. А если бы существовала библиотека, принимающая на себя всю рутину по защите приложения от атак инъекций?
- 37. 01 Response.Write( 02 SafeFormat.Html( 03 $" " 04 )); Например, вот так? (2/2)
- 38. Как протестировать?
- 39. Векторы от пентестеров и багхантеров – не использовать! http://host/entry_point/?name=%2f..%2fWeb.Config File.Delete($"\\temp_data\\{name}"); Использовать набор векторов атаки, приводящих к
- 40. Используется любой набор векторов атаки и токенизатор соответствующей грамматики Перед каждой PVF устанавливается утверждение на количество
- 41. А если бы существовала библиотека, принимающая на себя всю рутину по тестированию защищённости от атак инъекций
- 42. 01 var pvfArgument = $"\\temp_data\\{name}"; 02 DebugFormat.Path(pvfArgument); 03 File.Delete(pvfArgument); Например, вот так? (1/2)
- 43. LibProtection
- 44. LibProtection – библиотека с открытым кодом (под MIT-лицензией), позволяющая разработчикам встраивать в приложение автоматизированную защиту от
- 45. Для защиты от атак в LibProtection реализованы: автоматическая санитизация входных данных там, где это возможно; автоматическая
- 46. Детектирование осуществляется по формальным признакам: факт атаки не предполагается, а доказывается. Что такое LibProtection? (3/4)
- 47. Поддерживаемые языки: .NET, C++ (Q4 2017) PHP, JVM (H1 2018) Python, Ruby (H2 2018) Поддерживаемые грамматики:
- 48. 01 Response.Write( 02 SafeFormat.Html( 03 $" " 04 )); Защита от инъекций с помощью LibProtection
- 49. Как это работает? (1/10) 'onerror='…;// 0
- 50. Как это работает? (2/10) 'onerror='…;// 0
- 51. Как это работает? (3/10) 'onerror='…;// 0
- 52. Как это работает? (4/10) 'onerror='…;// 0 4 (атака) 1 (ок)
- 53. Как это работает? (5/10) 4 (атака)
- 54. Как это работает? (6/10) 4 (атака) Ga1 = URL/HTML
- 55. Как это работает? (7/10) 4 (атака) Ga1 = URL/HTML WU.HtmlEncode(WU.UrlEncode("'onerror='…;//"))
- 56. Как это работает? (8/10) 4 (атака) Ga1 = URL/HTML WU.HtmlEncode(WU.UrlEncode("'onerror='…;//"))
- 57. Как это работает? (9/10) 4 (атака) Ga1 = URL/HTML WU.HtmlEncode(WU.UrlEncode("'onerror='…;//"))
- 58. Как это работает? (10/10) 4 (атака) Ga1 = URL/HTML WU.HtmlEncode(WU.UrlEncode("'onerror='…;//")) OK!
- 59. // Grammar ∈ { Sql, Html, EcmaScript, Css, Url, Path, Xml } string SafeFormat.Grammar(FormattableString formattable) string
- 60. По умолчанию, LibProtection рассматривает все переменные, как опасные значения. Это поведение можно переопределить с помощью форматных
- 62. Скачать презентацию