Доклад Владимира Кочеткова (Positive Technologies), посвященный системному подходу к устранению уязвимостей такого типа как инъекции, на Security Meetup Mail.ru Group.
себя: • Классификацию уязвимости • Оценку риска • Эксплоит или вектор атаки • Общие рекомендации по устранению Задача пентестера или багхантера – найти и сообщить о хотя бы одном возможном сценарии атаки на обнаруженную уязвимость Задача разработчика – сделать невозможными любые атаки на неё Вводные данные
данных, выполнение которой приводит к разбору текста tG в соответствии с грамматикой G в синтаксическое дерево AST • A – множество AST, получаемых при разборе каждого возможного tG • D – множество входных данных • tG = f(x), x ∈ D Критерий уязвимости к атакам инъекции (1/2)
счёт: • Типизации • Валидации • Синтаксической • Семантической • Выходные данных должны согласовываться с грамматикой принимающей стороны за счёт санитизации Подходы к согласованию грамматик
грамматике: var url_regex = "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?"; if (!Regex.IsMatch(Request.Params["url"], url_regex)) { throw new ValidationException(); } Синтаксическая валидация
точки зрения логики приложения: var request = WebRequest.Create(Request.Params["url"]) { Method = "HEAD" }; if (request.GetResponse().StatusCode != HttpStatusCode.OK) { throw new ValidationException(); } Семантическая валидация
их входа, с учётом: • принципа необходимости и достаточности их грамматик; • приоритетности подходов: 1. типизация; 2. семантическая валидация; 3. синтаксическая валидация. • Выходные данных – как можно ближе к точке их выхода, с учётом: • грамматики принимающей стороны; • возможной вариативности их грамматик в различных точках выполнения; • минимального (в идеале – нулевого) влияния согласования на прочие ветки потока вычисления. Точки согласования грамматик: правила
позволяющая встроить в приложение защиту от атак инъекций, за счёт: • Автоматической санитизации входных данных там, где это возможно • Автоматической валидации входных данных относительно выходной грамматики там, где невозможна санитизация LibProtection (1/4)
http://host/entry_point/?name=%2f..%2fWeb.Config File.Delete($"\\temp_data\\{name}"); • Использовать набор векторов атаки, приводящих к ошибке парсинга: "\..\filename?", “<filename>" и т.п. • Каждый вектор – отдельный тест-кейс на отсутствие исключений при передаче модулю в качестве входных данных Юнит-тестирование инъекций: exceptions-based
грамматики • Перед каждой PVF устанавливается утверждение на количество токенов в её аргументе: var pvfArgument = $"\\temp_data\\{name}"; Debug.Assert(Tokenize(pvfArgument) == 4); File.Delete(pvfArgument); • Каждый вектор – тест-кейс на отсутствие нарушения утверждений. Юнит-тестирование инъекций: tokenization-based