Использование отладочного API современного веб-обозревателя для обнаружения уязвимостей класса DOM-based XSS

2017 Математические основы компьютерной безопасности №35

МАТЕМАТИЧЕСКИЕ ОСНОВЫ КОМПЬЮТЕРНОЙ БЕЗОПАСНОСТИ

УДК 004.056.53

ИСПОЛЬЗОВАНИЕ ОТЛАДОЧНОГО API СОВРЕМЕННОГО ВЕБ-ОБОЗРЕВАТЕЛЯ ДЛЯ ОБНАРУЖЕНИЯ УЯЗВИМОСТЕЙ

КЛАССА DOM-BASED XSS

Д. А. Сигалов, А. В. Раздобаров, А. А. Петухов Московский государственный университет имени М. В. Ломоносова, г. Москва, Россия

Ключевые слова: DOM-based XSS, уязвимости веб-приложений, динамический анализ, fuzz-тестирование.

DOI 10.17223/20710410/35/6

DETECTING DOM-BASED XSS VULNERABILITIES USING DEBUG API

OF THE MODERN WEB-BROWSER

D. A. Sigalov, A. V. Razdobarov, A. A. Petukhov

Lomonosov Moscow State University, Moscow, Russia E-mail: asterite@seclab.cs.msu.su, korse@seclab.cs.msu.su, petand@seclab.cs.msu.su

In recent years, a significant part of web application functionality moves to client side. Increasing complexity of client-side code leads to a considerable growth in the number of client-side vulnerabilities and even to an emergence of new types of vulnerabilities, among which DOM-based XSS is most well-known. In this paper, we present an approach to detect and validate DOM-based XSS vulnerabilities. Our approach leverages dynamic tracking of data flows on the client side of web application to identify insecure ones (those which lead to vulnerability). An insecure data flow is a flow, in which a critical operation is data-dependent on attacker-controlled data, which is not sanitised properly. Data flows are tracked and classified using taint propagation technique (also known as "taint checking"). Potentially insecure data flows are tested for the presence of exploitable vulnerability by means of fuzzing — enumeration of possible attack vectors, which are passed to a data flow source. Vulnerability is confirmed if an execution of any injected payload is observed. Our approach was implemented on top of Firefox browser, controlled via it's debugger API. The paper discusses and justifies advantages of such implementation. The paper also provides an analysis of related work in the subject field, and comparison with other approaches is made. The proposed approach and its implementation are maintainable and extensible, which is

crucial for analyzing applications in constantly evolving environment such as client side web technologies.

Keywords: DOM-based XSS, web application vulnerabilities, dynamic analysis, fuzzing.

Введение

1 <html> <body >

2 <h1>Поделиться адресом страницы: </h1>

3 <script>document.querySelector('hl').innerHTML += location.href; </script>

4 </body></html>

Листинг 1. Пример веб-страницы, содержащей уязвимость DOMXSS

Если злоумышленник вынудит жертву атаки перейти по ссылке с адресом http://site.com/page.html#<img src=x onerror=alert('XSS');></img>, то после выпол-

нения операции document.querySelector('h1').innerHTML += location.href структура документа станет следующей:

1 <html><body >

2 <h1>Поделиться адресом страницы: http://site.com/page .html#<img src=x onerror=alert('XSS');></img></h1>

3 <script >document.querySelector('hl').innerHTML += location.href; </script>

4 </body></html>

Листинг 2. Пример веб-страницы, содержащей уязвимость DOMXSS, после её эксплуатации

Добиться перехода по ссылке, что приведёт к эксплуатации уязвимости, можно, например, с помощью веб-страницы со следующим кодом (листинг 3); это проверено на нескольких версиях браузера Google Chrome, включая 55.0.2883.87 m.

1 <html><body>

2 Free movies: <a href="http://site.com/page.html#<img src=x

onerror=alert('XSS');></img>">Click here for free downloads!</a>

3 </body></html>

Листинг 3. Пример веб-страницы, используемой для эксплуатации уязвимости

Для обнаружения уязвимостей типа DOMXSS необходимо проверить, используются ли данные из недоверенного источника в небезопасных методах DOM API (модификация содержимого веб-страницы или выполнение кода на лету) без предварительной обработки. Данный факт может быть установлен различными способами: — с помощью fuzz-тестирования веб-страницы, её свойств и способов пользовательского взаимодействия с ней с последующим отслеживанием факта выполнения внед-

— из-за динамической типизации языка;

Реализация fuzz-тестирования сопряжена с большим пространством перебора: учитывая, что данные из недоверенного источника могут небезопасно записываться в свойства DOM в результате самой сложной последовательности действий пользователя в веб-интерфейсе страницы, fuzz-тестирование без эффективной стратегии выбора некорректных входных данных приведёт к низкой полноте анализа. Сопутствующей технической сложностью является необходимость восстанавливать предыдущее состояние веб-страницы при последовательном переборе различных цепочек пользовательских действий.

1. Существующие методы и средства

1.1. Статический анализ

В существующих работах установление факта небезопасной передачи данных без выполнения анализируемого кода рассматривается либо как задача вычисления потоков данных от одних операторов (канал ввода) до других (канал вывода), либо как задача поиска небезопасной последовательности операторов над различными представлениями программы (дерево синтаксического разбора, граф потоков управления), либо как задача определения множества возможных значений переменной в заданной точке программы (в канале вывода).

1.2. Динамический анализ

Второй подход заключается в создании динамического анализатора, который работает на уровне внутренних структур данных интерпретатора языка. В этом случае наблюдателю доступна любая информация о ходе выполнения кода, что позволяет корректно реализовать динамический taint-анализ и с его помощью устанавливать факт передачи данных из недоверенного канала ввода в доверенный канал вывода. Данный подход технически сложен в реализации, так как требуется среда, удовлетворяющая следующим требованиям:

— среда должна полноценно реализовывать DOM API в объёме текущих спецификаций, которые постоянно обновляются;

— cреда должна предоставлять наблюдателю возможность получать информацию о процессе выполнения кода на уровне внутренних структур данных.

Стоит отдельно отметить, что сам метод динамического taint-анализа не лишён ограничений:

— наличие в коде ограничений на входные данные (множество допустимых значений, длина) может сделать код безопасным даже без явного использования фильтрующих функций при передаче данных из недоверенных каналов ввода в доверенные каналы вывода;

— корректность собственных валидирующих функций невозможно установить с помощью динамического taint-анализа (например, если валидация реализована с помощью регулярных выражений).

Приведённые рассуждения позволяют сделать следующие выводы:

— реализация динамического taint-анализа имеет смысл только в среде, поддержка которой осуществляется сообществом;

— отдельной задачей как при реализации динамического taint-анализа, так и при реализации fuzz-тестирования является максимизация покрытия анализируемого кода, что сопряжено с задачей симуляции на веб-странице возможных последовательностей пользовательских действий;

— динамический taint-анализ и fuzz-тестирование эффективно дополняют друг друга при решении задачи поиска уязвимостей типа DOMXSS.

1.3. Существующие средства

В результате исследования предметной области были проанализированы существующие инструментальные средства, решающие задачу поиска уязвимостей типа DOMXSS.

В средствах, описанных в [15-17], также реализован динамический taint-анализ, информация для которого собирается с помощью изменённого кода интерпретатора веб-обозревателя Google Chrome.

Инструмент ra2-dom-xss-scanner [21] осуществляет простое fuzz-тестирование вебстраницы и отслеживание изменений свойств DOM.

Инструмент [22], а также авторы [23, 24] используют статический поиск зависимостей по данным между источниками ввода небезопасных данных и их использованием в небезопасных методах и свойствах DOM API.

2. Предлагаемый метод

Далее перечислены детали реализации динамического taint-анализа и fuzz-тести-рования.

2.1. Реализация динамического анализа Динамический taint-анализ является одним из способов определить зависимости по данным в программе в процессе её выполнения. В настоящей работе в процессе динамического taint-анализа участвуют данные только строкового типа (прототип string). В качестве источников, вывод которых устанавливает строкам флаг tainted, берутся все потенциально контролируемые злоумышленником методы и свойства DOM API, полный список которых может быть найден в энциклопедии DOM XSS [1]. Операциями, распространяющими флаг tainted, считаются любые функции и операторы преобразования строк (конкатенация, взятие подстроки, URL-декодирование и т.п.).

Более конкретно, taint-анализ реализован следующим образом: 1) Объекты, отвечающие за источники (например, объект location, предоставляющий интерфейс для работы с адресом страницы), заменяются средствами отладчика на специальные объекты-обёртки (proxy-объекты). Обёртки ведут себя так же, как и реальные объекты, однако при считывании из них данных (для location это произойдёт, например, при приведении к строке методом toString или при обращении к полю location.href) соответствующая операция запишет в таблицу строк, помеченных

флагом tainted, запрашиваемое значение прежде, чем возвратить его. Кроме самого значения, в таблицу помещается информация о его источнике (канале ввода).

2) Строковые операции, встроенные в язык, также подменяются на прокси-методы. Подменённые операции, кроме своего основного действия, проверяют, есть ли в таблице строки — аргументы операции. Если это так, то результат операции также помещается в таблицу ссылок на taint-строки. В метку источника у новой записи в таблицу заносятся источники всех помеченных аргументов операции.

3) Доверенные каналы вывода представляют функции и свойства выполнения кода на лету и изменения DOM: eval, document.write, setTimeout, element.innerHTML, script.src. Все такие функции и свойства заменяются на прокси-методы и свойства, которые перед своим основным действием проверяют, не содержится ли передаваемое им значение в таблице. Если это так, то сообщается об обнаружении потенциально небезопасного потока данных.

2.2. Реализация fuzz-тестирования

2) В зависимости от типа API-функции, представляющей доверенный выходной канал, генерируются экземпляры входных данных, которые становятся кандидатами для проверки.

4) При достижении в процессе выполнения кода оператора, который соответствует получению пользовательских данных, в качестве результата его вызова возвращается очередной экземпляр тестовых входных данных.

5) Выполнение продолжается до тех пор, пока не выполнится последний оператор, представленный в тестируемом потоке данных, после чего осуществляется переход на шаг 3, перед чем осуществляется восстановление контекста выполнения (см. шаг 1).

Выполнение функции alert при достижении канала вывода очередных тестовых данных может происходить как синхронно, так и асинхронно. В первом случае процесс fuzz-тестирования для текущего потока завершается и информация о подтверждённой уязвимости записывается в журнал.

Описанный метод может быть реализован при достаточно большой степени контроля над выполнением кода. Такой контроль предоставляется программным интерфейсом отладчика Firefox, который и используется для реализации анализа процесса выполнения кода в данной работе.

Заключение

Предложен метод поиска уязвимостей типа DOMXSS с помощью динамического taint-анализа и последующего направленного fuzz-тестирования. Метод реализован на основе веб-обозревателя Firefox без модификации его исходного кода. Динамический taint-анализ позволяет обнаруживать потенциально небезопасные места в коде, в том числе динамически сформированном или загруженном на страницу в результате асинхронных запросов. Использование направленного fuzz-тестирования позволяет избавиться от ложных срабатываний, возникающих из-за ограничений динамического taint-анализа, а также получать на выходе проверочные данные, подтверждающие наличие уязвимостей. Использование в качестве среды для динамического анализа немо-дифицированного веб-обозревателя Firefox позволяет выполнять анализ кода в реальном окружении и избавляет от необходимости осуществлять постоянную поддержку средства при выходе обновлений веб-обозревателя.

ЛИТЕРАТУРА

1. Stefano D. P., Heiderich M., and Braun F. https://code.google.eom/p/domxsswiki/ — DOM XSS Test Cases Wiki Cheatsheet Project. 2010.

2. http://www.ecma-international.org/publications/standards/Ecma-262.htm — Стандарты языка программирования ECMAScript.

3. Schwartz E. J., Avgerinos T., and Brumley D. All you ever wanted to know about dynamic taint analysis and forward symbolic execution (but might have been afraid to ask) // IEEE Symp. Security and Privacy. Auckland: IEEE, 2010. P. 317-331.

4. Wagner D. Static analysis and software assurance. SAS'01. Proc. 8th Intern. Symp. Static Analysis. Paris: Springer Verlag, 2001. 431 p.

5. https://developer.mozilla.org/en-US/docs/Tools/Debugger-API — Документация отладочного интерфейса Mozilla Debugger API.

6. McLean J. Security Models // Encyclopedia of Software Engineering. N.Y.: John Wiley & Sons Inc., 1994. P. 1136-1145.

8. Guha A., Krishnamurthi S., and Jim T. Using static analysis for Ajax intrusion detection // Proc. 18th Intern. Conf. on World Wide Web. Madrid: ACM, 2009. P. 561-570.

11. http://htmlunit.sourceforge.net/ — Документация эмулятора управляемого веб-обозревателя HtmlUnit. 2016.

12. https://www.codemagi.com/downloads/dom-xss-scanner-checks — Описание Codemagi Burp DOM-XSS Scanner — расширения для инструмента BurpSuite, предназначенного для поиска DOMXSS.

13. http://www. ethicalhack3r.co.uk/staticburp-burp-suite-potential-dom-xss-analysis/ —

Описание StaticBurp — расширения для инструмента BurpSuite, предназначенного для поиска DOMXSS.

14. https://dominator.mindedsecurity.com/ — Описание средства поиска DOMXSS DOMinator

16. Lekies S., Stock B., and Johns M. 25 million flows later: large-scale detection of DOM-based XSS // Proc. ACM SIGSAC Conf. Computer & Communications Security. Berlin: ACM, 2013. P. 1193-1204.

18. Xiao W. et al. Preventing client side XSS with rewrite based dynamic information flow // Sixth Intern. Symp. Parallel Architectures, Algorithms and Programming (PAAP). Pekin: IEEE, 2014. P. 238-243.

21. https://code.google.com/p/ra2-dom-xss-scanner/ — Документация средства поиска DOMXSS Ra.2.

22. www.jsprime.org — Описание средства поиска DOMXSS JSPrime.

REFERENCES

1. Stefano D. P., Heiderich M., and Braun F. https://code.google.eom/p/domxsswiki/ — DOM XSS Test Cases Wiki Cheatsheet Project, 2010.

2. http://www.ecma-international.org/publications/standards/Ecma-262.htm

3. Schwartz E. J., Avgerinos T., and Brumley D. All you ever wanted to know about dynamic taint analysis and forward symbolic execution (but might have been afraid to ask). IEEE Symp. Security and Privacy, Auckland, IEEE, 2010, pp. 317-331.

4. Wagner D. Static analysis and software assurance. SAS'01. Proc. 8th Intern. Symp. Static Analysis, Paris, Springer Verlag, 2001. 431 p.

5. https://developer.mozilla.org/en-US/docs/Tools/Debugger-API

6. McLean J. Security Models. Encyclopedia of Software Engineering, N. Y., John Wiley & Sons Inc., 1994, pp. 1136-1145.

8. GuhaA., Krishnamurthi S., and Jim T. Using static analysis for Ajax intrusion detection. Proc. 18th Intern. Conf. on World Wide Web, Madrid, ACM, 2009, pp. 561-570.

11. http://htmlunit.sourceforge.net/

12. https://www.codemagi.com/downloads/dom-xss-scanner-checks

13. http://www. ethicalhack3r.co.uk/staticburp-burp-suite-potential-dom-xss-analysis/

14. https://dominator.mindedsecurity.com/—

16. Lekies S., Stock B., and Johns M. 25 million flows later: large-scale detection of DOM-based XSS. Proc. ACM SIGSAC Conf. Computer & Communications Security, Berlin, ACM, 2013, pp.1193-1204.

18. Xiao W. et al. Preventing client side XSS with rewrite based dynamic information flow. Sixth Intern. Symp. Parallel Architectures, Algorithms and Programming (PAAP), Pekin, IEEE, 2014, pp. 238-243.

21. https://code.google.com/p/ra2-dom-xss-scanner/

22. www.jsprime.org