защищённости приложений Positive Technologies • Appsec- и CS-исследователь (формальные методы анализа и защиты приложений) • Организатор Positive Development User Group Контакты: about.me/vladimir.kochetkov [email protected]
Java, PHP • Анализ конфигурации и уязвимых компонентов • Сигнатурный статический анализ • Поиск веб-шеллов и вредоносных сценариев • Сбор статистики по проекту • Альтернативная реализация форматных и интерполированных строк, встраивающих в приложение автоматическую защиту от атак инъекций • .NET 4.0+ (скоро: Kotlin, C++, Python, PHP, JavaScript) • SQL, HTML, JavaScript, URL и файловые пути (скоро: XML, CSS, XPATH, CMD, BASH)
делать, а просто рассказывал про то, как костылями можно дырки закрывать» «…был задан правильный вопрос про то, что многие так уже не пишут, а используют объектный подход. Каких атак тогда опасаться?» Мифы об инъекциях (1/3)
которые были бы актуальны несколько лет назад» «…в целом доклад теряет свой смысл, если код написан без использования устаревших подходов» «…[LibProtection] скорее для компаний, которые не заботятся о коде, живут в легаси- системах и не знают, что после .NET 2.0 выходили более новые версии, а .NET Core для них просто ругательство» Мифы об инъекциях (2/3)
== 0) 04 { 05 sb.Append("base.ConfigureProxy(this.GetType(), "); 06 sb.Append(WsdlParser.IsValidUrl((string)_connectURLs[i])); 07 sb.Append(");"); 08 } 09 else 10 { 11 // Only the first location is used, the rest are commented out in the proxy 12 sb.Append("//base.ConfigureProxy(this.GetType(), "); 13 sb.Append(WsdlParser.IsValidUrl((string)_connectURLs[i])); 14 sb.Append(");"); 15 } 16 textWriter.WriteLine(sb); PrintClientProxy
• Техники слепого поиска и эксплуатации инъекций • «Out-of-band» техники • Инструменты автоматизации в том числе таких техник • «Это не смогут обнаружить», «это не будут атаковать» и т.п. — относятся к области анализа рисков и выходят далеко за пределы зоны ответственности разработчиков
обнаружена, она будет обнаружена; • если уязвимость может быть проэксплуатирована, она будет проэксплуатирована; • при эксплуатации уязвимости будет нанесён максимально возможный ущерб. Принцип Керкгоффса-Шеннона
= Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Точка входа b Граница окружения Модель уязвимого приложения (3/7)
= Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Точка входа b Граница окружения Модель уязвимого приложения (4/7)
= Request.Params["a"]; 02 03 var b = Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Точка входа b Граница окружения Модель уязвимого приложения (5/7)
= Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Точка входа b Точка выхода fpvo (ftransform (a, b)) Граница окружения Модель уязвимого приложения (6/7) Точка инъекции a
= Request.Params["b"]; 04 05 if (a == null) 06 { 07 return; 08 } 09 10 if (b == null) 11 { 12 return; 13 } 14 15 Response.Write($"<img src='//host/1/{a}' onclick='f({b})'/>"); Точка входа a Точка входа b Точка выхода fpvo (ftransform (a, b)) Граница окружения Модель уязвимого приложения (7/7) Точка инъекции a Точка инъекции b
лексического разбора любого возможного выходного потока данных, на каждую точку инъекции приходится не более одного токена Достаточный критерий защищённости от атак инъекций
лексического разбора любого возможного потока выходных данных, множества токенов, приходящиеся на точки инъекции, являются авторизованными Необходимый критерий защищённости от атак инъекций
• Типизации • Валидации • Синтаксической • Семантической Подходы к согласованию грамматик входных данных Обеспечение необходимого или достаточного критериев
• Типизации • Валидации • Синтаксической • Семантической Подходы к согласованию грамматик входных данных Обеспечение необходимого или достаточного критериев В том числе: объектный подход и параметризация
точки зрения логики приложения: 01 var schema = JSchema.Parse("some JSON schema"); 02 var object = JObject.Parse(Request.Params["b"]); 03 04 if (!object.IsValid(schema)) 05 { 06 throw new ValidationException(); 07 } Семантическая валидация
URLcontext санитизацию необходимо проводить последовательно, в обратном порядке: JavaScriptEncodecontext (UrlEncodecontext (t)). Санитизация вложенных грамматик
Выделить все точки инъекции производных от них данных; • Провести типизацию и валидацию в точках входа с учётом требований бизнес-логики; • Провести санитизацию в точках инъекций, с учётом ожидаемых в них грамматик принимающей стороной; • Подтверждать авторизованность множества токенов в точках инъекций (опционально). Что сделать разработчику, чтобы победить инъекции
url = context.AllAttributes["href"].Value.ToString(); if (!Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute)) { throw new UriFormatException("Malformed URI"); } var uri = new Uri(url, UriKind.RelativeOrAbsolute); if (!uri.IsAbsoluteUri || RequestHost == uri.Host) { return; } var onclickHandler = $"return confirm('You are about visit an external link: {uri} Are you sure?')"; output.Attributes.SetAttribute("onclick", onclickHandler); } Решение (ASP.NET MVC): реализовать TagHelper для <a>
частный случай типизации в защите от инъекций; • не всегда существуют или применимы и не являются панацеей; • могут содержать неоднозначности, уязвимости и ошибки в своём коде; • часто требуют от разработчика доскональных знаний грамматик и деталей своей реализации. • Думать всё равно придётся (даже в случае с LibProtection) Вся правда о «современных средствах разработки»
разработчикам: • полностью автоматизировать защиту от атак инъекций по достаточному критерию; • реализовывать защиту по необходимому критерию. libprotection.org playground.libprotection.org (ждём байпассов ) Что такое LibProtection (1/3)
санитизация данных в точках инъекций там, где это возможно; • автоматическая валидация данных в точках инъекций по достаточному критерию (детектирование атаки) там, где невозможна санитизация; • возможность переопределения функций валидации и санитизации для обеспечения необходимого критерия. Что такое LibProtection (2/3)
и интерполированные строки • Штатная защита кода там, где форматные строки или интерполяция неизбежны Что, если скрестить LibProtection и технологии SAST или DAST? ;)