В современном мире веб-приложения играют ключевую роль во многих сферах — от электронной коммерции до социальных сетей и образовательных платформ. Однако с ростом их сложности растут и риски безопасности. Часто именно клиентский JavaScript становится источником неожиданной информации об уязвимых серверных эндпоинтах, которые не видны напрямую через пользовательский интерфейс. В условиях, когда доступ к серверному исходному коду ограничен или отсутствует, аналитика клиентской части становится критически важным инструментом для выявления потенциальных угроз. Одним из таких эффективных инструментов является статический анализ JavaScript, который применяется в исследовательском проекте Relwarc, разрабатываемом в Security Lab Московского государственного университета имени Ломоносова.
Статический анализ – это метод исследования исходного кода без его запуска. Это значит, что алгоритм просматривает весь код целиком, не завися от того, как программа ведет себя во время выполнения. Такой подход идеально подходит для поиска скрытых вызовов HTTP запросов, которые могут привести к несанкционированным действиям, если сервер плохо защищен. Relwarc использует этот подход для инспектирования клиентских скриптов и выявления всех возможных HTTP вызовов, включая те, которые не доступны через интерфейс пользователя. В чем заключаются сложности? JavaScript – язык с динамической природой, позволяющий создавать и изменять код во время выполнения.
Это усложняет анализ, особенно если попытаться применять классические методы статического анализа, характерные для языков со статической типизацией. Популярные академические инструменты анализа JavaScript, такие как TAJS, SAFE или WALA, часто испытывают трудности с обработкой реальных веб-страниц — они могут зависать или вызывать ошибки даже на простых библиотеках вроде jQuery. А инструменты типа Semgrep или CodeQL оказываются недостаточно гибкими для детального анализа вызываемых HTTP запросов. В своих исследованиях специалисты Security Lab решили пойти иным, более адаптированным путем: они построили собственный статический анализатор, который максимально учитывает реалии веб-разработки и особенности JavaScript. Для начала они используют возможности headless браузера, например Headless Chrome с библиотекой puppeteer, чтобы собрать все загруженные и выполненные на странице JavaScript-коды.
За счет интеграции с Debugger API и Chrome DevTools Protocol они получают полный стек исполняемых скриптов, включая динамически созданный и eval-скрытый код. Такой способ гарантирует получение максимально аутентичных данных для анализа, без искажений, характерных для обычных парсеров. После сбора исходников они преобразуют их в абстрактное синтаксическое дерево (AST) с помощью мощного парсера @babel/parser. Работа с AST позволяет структурировано просматривать код и искать интересующие элементы, такие как вызовы функций fetch или $.ajax, отвечающих за отправку AJAX запросов.
Путем рекурсивного обхода дерева анализатор выявляет каждую точку, где может выполняться HTTP-вызов. Одной из серьезных проблем является понимание параметров этих вызовов. Часто адреса эндпоинтов и другие данные передаются не напрямую строками, а через переменные или выражения, которые формируют URL динамически. В ответ разработчики Relwarc реализовали алгоритмы вычисления значений выражений и связывания переменных с их значениями с учетом областей видимости (scope). Это особенно важно в условиях сложного браузерного кода, где одни и те же имена переменных могут иметь разный смысл в разных функциях или замыканиях.
Интересно, что Relwarc учитывает и ограничения классического анализа, например, циклы в коде рассматриваются как одна итерация — это компромисс между полнотой и производительностью. Собственный подход к ведению памяти (memory map) переменных через объекты Binding из Babel позволяет найти правильные соответствия, даже если переменные переопределяются на разных уровнях вложенности. Отдельно стоит отметить расширяемость инструмента: в логику анализа можно добавлять поддержу различных методов отправки запросов, включая стандартный fetch, функции jQuery и потенциально другие, специфичные для целевых веб-приложений. Это делает Relwarc универсальным решением для веб-безопасности. Зачем все это нужно? При проведении пентестов (penetration testing) зачастую выявляется, что админские или чувствительные API эндпоинты доступны в клиентском JS, но скрыты от пользовательского интерфейса.
Это создает риск обхода авторизации или других мер безопасности. Статический анализ помогает в автоматическом режиме выявлять такие «темные» пути, по которым можно отправить запросы на сервер, что повышает эффективность сканера безопасности SolidPoint, разработанного той же командой. Преимущество Relwarc в сравнении с динамическим анализом и краулерами заключается в том, что он не зависит от взаимодействия с интерфейсом. Динамические краулеры могут пропустить вызовы, которые зависят от сложных последовательностей действий пользователя или вовсе не имеют публичных интерфейсов. Статический анализ обеспечивает полный охват клиентского кода, увеличивая шансы обнаружить все возможные HTTP вызовы.
Текущие результаты и перспективы развития Relwarc впечатляют. Исследования показывают, что такой подход увеличивает покрытие найденных эндпоинтов, выявляет скрытые слабые места и способствует улучшению общей безопасности веб-приложений. Одновременно, открытый исходный код анализатора и постоянное развитие инструмента позволяют сообществу расширять его функционал и адаптировать под новые вызовы. Для разработки комплекса использовались современные JavaScript технологии и передовые знания в области анализов кода. Relwarc — пример того, как научные достижения совместно с практическими задачами по безопасности формируют прогрессивные инструменты для защиты пользователей и организаций.
В будущем планируется усовершенствовать алгоритмы интерпретации вызовов с передачей значений между функциями, улучшить поддержку различных форм инициализации XMLHttpRequest, а также добавить возможности анализа реактивного и асинхронного кода, что особенно актуально для современных SPA (single-page applications). Подводя итог, можно сказать, что статический анализ клиентского JavaScript с помощью таких инструментов как Relwarc становится новым стандартом в сфере безопасности веб-приложений. Его применение позволяет находить скрытые HTTP эндпоинты, уменьшает риск атак, связанных с недочетами в авторизационных механизмах и помогает создавать более надежные сервисы в интернете. Разработка и интеграция таких технологий — важный шаг к более защищенному и прозрачному цифровому будущему.