Анализ уязвимостей стандарта Content Security Policy с целью повышения защиты веб-сайтов
Анализ уязвимостей стандарта Content Security Policy с целью повышения защиты веб-сайтов
Аннотация
В статье выполняется анализ уязвимостей стандарта Content Security Policy с целью повышения защиты веб-сайтов. Отмечено, что данный стандарт обладает уязвимостями, позволяющими злоумышленникам успешно реализовывать атаки, основанные на внедрении вредоносного кода в тело веб-страницы. Обоснована актуальность исследования уязвимостей стандарта CSP с целью повышения защиты веб-сайтов. Рассмотрены основные аспекты реализации защиты веб-ресурса с использованием стандарта CSP. Представлен состав наиболее известных методик обхода директив данного стандарта. Описан процесс реализации XSS атаки с использованием директивы «unsafe-inline». Выявлено, что подобная организация атаки позволит осуществить перехват пользовательских данных незаметно для пользователей и администраторов безопасности. Сделан вывод о том, что использование разработчиками директивы unsafe-inline не обеспечивает должного уровня защиты от XSS атак, а в качестве альтернативы предложено внедрение более эффективной политики CSP, настраиваемой в соответствии с рекомендациями специалистов в области информационной безопасности.
1. Введение
Обеспечение защиты данных в рамках функционирования веб-ресурсов уже давно стало острым вопросом. Реализуется данного рода безопасность различными образами, а одним из актуальных механизмов стал отдельный уровень, именуемый Content Security Policy. Этот механизм направлен на обнаружение и устранение атак, основанных на межсайтовом скриптинге и внедрению данных злоумышленника в передаваемые запросы. Для работы использует ряд директив, позволяющих гибко настроить механизмы защиты. Однако, несмотря на высокий уровень популярности данный стандарт защиты веб-сервисов и приложений обладает рядом недостатков, изучение которых позволит определить способы их устранения для широкого круга специалистов. Однако фактически, несмотря на наличие целого набора директив, обеспечивающих разные направления защиты от инъекции кода, злоумышленники находят методы их обхода. Именно поэтому в рамках данной статьи исследуются данные методы, а также выявляется методика перенаправления запросов, которая ранее нигде не была освещена.
2. Основные результаты
Начать статью стоит с рассмотрения определения атаки типа Stored XSS. Так называют уязвимость в веб-системах, связанная с возможностью внедрения злоумышленником на страницу вредоносного программного кода (чаще всего на JavaScript) . В результате успешной реализации данной атаки злоумышленник может осуществить перехват пары логин-пароль, личных данных пользователя или иной личной информации . По факту, атаки XSS основаны на доверии браузера к отображаемому им контенту, полученному с серверной платформы, в результате чего он запускает на исполнение все полученные скрипты.
Современные веб-сервисы уже давно реализуются так, чтобы устранить возможность реализации XSS-уязвимостей злоумышленниками. Также в данном направлении работают и разработчики веб-браузеров, которые используют инструменты валидации входной информации, а также политики Same‑Origin Policy (определяет разрешения на доступ к данным для скриптов) и Content Security Policy (определяет перечень доверенных источников скриптов). Однако уязвимости ещё имеют место, и в рамках данной статьи предлагается рассмотреть таковые в составе политики CSP.
Content Security Policy (CSP) представляет собой дополнительный уровень обеспечения защиты веб-сервисов и приложений, направленный на устранение возможности реализации атак типа внедрение скриптов и выполнение нежелательного кода. Реализуется защита с применением CSP посредством формирования состава разрешенных для загрузки ресурсов источников , . В том случае, если ресурсы или скрипты будут принадлежать какому-то из источников, не включенных в сформированный перечень, он попросту не будет загружен браузером. Таким образом устраняется возможность выполнения стороннего кода и реализации атак по внедрению вредоносного кода, результаты выполнения которых могут быть абсолютно различными – начиная от перехвата данных и заканчивая нарушением работы сайта .
Стандарт CSP обладает несколькими версиями, которые обеспечивают полный уровень совместимости. Исключение составляет вторая версия стандарта, имеющая ряд несоответствий в плане совместимости с остальными версиями. Однако это все равно позволяет браузерам работать с серверами, используя различные версии стандарта. В случае если сервером не будет предложен заголовок CSP, то браузером будет попросту применена стандартная политика для данного источника , .
Для того чтобы сформировать перечень доверенных источников, в рамках стандарта CSP на веб-странице должны быть размещены специализированный заголовок Content-Security-Policy и набор директив, к которым относятся:
• img-src – настройка источников для загрузки изображений;
• media-src – настройка источников для загрузки медиаконтента (видео, анимации, аудио);
• script-src – настройка источников для загрузки сценариев и скриптов для веб-страницы;
• frame-src – настройка источников для загрузки веб-элементов;
• default-src – резервная директива. В том случае, если в одной или нескольких директивах, представленных выше, отсутствуют аргументы, то браузер использует источники, указанные в данной директиве .
За счет использования представленного перечня директив разработчики могут указать для загрузки домен, поддомен, либо отдельную страницу, а также указать правила взаимодействия. Для этого при описании директивы могут быть использованы две директивы: "none" запрещает, а "self" разрешает использование ресурсов, находящихся на указанном источнике.
Помимо общих правил для отдельных директив существуют собственные правила. Так, существует правило "unsafe-inline", которое разрешает использование JS-скриптов, размещаемых непосредственно в коде веб-страницы. И если данное правило не прописать, то любой скрипт, загруженный не из доверенного источника, будет заблокирован. Правило "unsafe-eval" позволяет разрешить или заблокировать (по умолчанию) выполнение динамического кода в процессе его работы .
Для того чтобы получить возможность использования политики CSP, следует выполнить настройку возврата соответствующего заголовка на веб странице. В том случае, если разработчик хочет протестировать политику CSP, существует другая директива – Content-Security-Policy-Report-Only. При её использовании не будет происходить блокировка загрузки скриптов, однако все зафиксированные нарушения и отклонения будут внесены в специальные отчеты, которые отправляются системному администратору.
Однако, несмотря на, казалось бы, простоту реализации, и при этом возможности гибкой настройки разрешенных источников для веб-ресурсов, CSP имеет уязвимости, посредством которых злоумышленники могут реализовать угрозу XSS .
Одна из выявленных уязвимостей завязана на использовании правила "unsafe-inline" в директиве "script-src". Казалось бы, данная директива позволяет ограничить возможности передачи конфиденциальной информации на сторону. В том случае, если данная директива не включена, то разработчикам необходимо вручную внести огромнейший список ресурсов, на которые эти данные могут быть переданы. А некорректная настройка данной директивы может привести к ограниченной работоспособности приложения. Именно по этой причине разработчики зачастую используют данную директиву, считая, что она позволит обеспечить защиту от передачи информации на другие ресурсы, однако на практике это не всегда так.
В результате проведенного исследования было установлено, что если использовать метод редиректа, то будет получена возможность получения всех необходимых параметров. Для этого необходимо сформировать URL-ссылку, в которой в составе GET-запроса будут указаны необходимые параметры, которые требуется получить. Пример такого запроса на рисунке 1:
Рисунок 1 - Процесс формирования URL-ссылки и передача конфиденциальных данных на сервер-перехватчик
Визуально ход перехвата с применением данного метода представлен на рисунке 2 и может быть описан тремя этапами.
Рисунок 2 - Процесс реализации XSS атаки на страницу, использующую CSP-директиву "unsafe-inline"
Рисунок 3 - Окно утилиты, реализующей запросы с редиректом различных наборов данных [3]
Стандарт CSP включает множество директив и их разнообразные конфигурации, что в ряде случаев может создавать уязвимости, посредством которых злоумышленники могут реализовать угрозу XSS . Также существуют другие известные методы обхода данного стандарта:
• внедрение скрипта посредством использования механизмов загрузки файлов;
• внедрение скрипта с использованием публичной CDN;
• внедрение скрипта посредством использования механизма Third-Party EndPoints + JSONP;
• внедрение скрипта с использованием процедур Angular;
Однако данные методы предполагают только внедрение кода на веб-страницу, что не решает проблему передачи конфиденциальных данных со страницы на сервер атакующего. Как и в случае с включенной опцией unsafe-inline, будет действовать ограничение, которое разрешает коммуникацию только с доверенными веб-ресурсами, что препятствует отправке данных со страницы на сервер атакующего. В таком случае можно использовать представленный выше метод в сочетании с другими известными методиками обхода стандарта CSP для обхода данного ограничения.
Таблица 1 - Пример использования полезной нагрузки сгенерированной с помощью утилиты CSPStealer и метода обхода CSP посредством использования механизма Third-Party EndPoints + JSONP
"><script src="/api/jsonp?callback=(function(){e=encodeURIComponent;document.location=`http://attacker-server.com/?u=${e(location.href)}&c=${e(document.cookie)}&d=${e(document.documentElement.innerHTML)}&l=${e(JSON.stringify(localStorage))}`;setTimeout(stop,3500);})();//"></script> |
3. Заключение
В результате использования любой из перечисленных уязвимостей злоумышленники получают возможность перехвата различного рода информации, в том числе и данные для авторизации. А их комбинация расширяет возможные методики реализации XSS-атак, и добавляет работы специалистам по безопасности.
Подытоживая, следует отметить тот факт, что несмотря на наличие механизма CSP, направленного на защиты от инъекций программного кода в веб-страницу, качество его работы в большинстве случае оставляет желать лучшего, а злоумышленники находят все новые и новые способы его обхода. В рамках исследования был продемонстрирован существующий критический риск использования директивы unsafe-inline. По этой причине единственным способом обеспечения высокого уровня безопасности будет отказ от использования директивы unsafe-inline и внедрение более эффективной политики CSP, несмотря на все требуемые для этого трудовые и финансовые затраты.