Как уязвимость CVE-2024-37389 может привести к выполнению произвольного кода в Apache NiFi: контекст параметров и межсайтовый скриптинг в веб-приложении для визуального проектирования конвейера обработки данных.
Параметры свойств и их контекст в Apache NiFi
8 июля 2024 года в мажорном релизе Apache NiFi обнаружена уязвимость средней степени серьезности, связанная с неправильной нейтрализацией ввода в описании контекста параметров. Впрочем, она затрагивает не только выпуски 2.0.0-M1-2.0.0-M3, но и версии 1.10.0-1.26.0. Эти релизы Apache NiFi поддерживают поле описания в конфигурации контекста параметров, которое уязвимо для межсайтового скриптинга (XSS, Cross-Site Scripting).
В Apache NiFi значения любых свойств в потоке обработки данных могут быть параметризованы с помощью параметров. Параметры создаются и настраиваются в пользовательском интерфейсе NiFi. Любое свойство может быть настроено для ссылки на параметр со следующими условиями:
- Чувствительное свойство может ссылаться только на чувствительный параметр;
- Нечувствительное свойство может ссылаться только на нечувствительный параметр;
- Свойства, ссылающиеся на службы контроллера, не могут использовать параметры;
- Параметры не могут быть использованы в задачах отчетности или в службах контроллера управления.
Возможность использования параметра для значения свойства указывается в GUI NiFi. Сами параметры создаются в контекстах, которые позволяют привязывать набор конфигураций к любой группе процессов во время выполнения. Каждый контекст параметра содержит пару имя-значение. Значения этого параметра заполняются из набора переменных окружения в NiFi. Это те же переменные окружения, которые ранее использовались в определении дескриптора коннектора. В можно проверить Имя контекста параметров, который привязывается к группе процессов, отображается в сведениях о конфигурации группы процессов. К параметрам из контекста параметров можно получить доступ с помощью знака решетки # с названием параметра, например, #{parameterName}.
Считается, что в NiFi лучше использовать параметры вместо переменных, поскольку они поддерживают чувствительные значения и предлагают более детальный контроль над политиками доступа. Кроме того, свойства, ссылающиеся на параметры, проверяются на соответствие замещенному значению, в отличие от большинства свойств, ссылающихся на переменные с помощью языка выражений.
Параметры в NiFi создаются в контекстах параметров, которые определяются и глобально доступны для целого экземпляра NiFi. Политики доступа могут применяться к контекстам параметров, чтобы определить, какие пользователи могут их создавать. После создания также могут применяться политики для чтения и записи в определенный контекст параметров. Чтобы пользователь мог видеть контексты параметров, их необходимо добавить в политику просмотра access the controller (доступ к контроллеру) или в политику просмотра access Parameter Contexts (доступ к контекстам параметров). Чтобы пользователь мог изменять контексты параметров, их также необходимо добавить в соответствующие политики изменения. Доступ к этим политикам осуществляется через пункт Policies (Политики) из глобального меню. Просмотр и изменение политик также могут быть установлены для отдельных контекстов параметров, чтобы определить, какие пользователи могут просматривать или добавлять параметры в контекст. Чтобы ссылаться на параметры или преобразовывать свойства в параметр в компоненте, пользователю необходимо иметь политики просмотра и изменения для компонента. Эти политики наследуются, если у пользователя есть политики просмотра и изменения для группы процессов компонента, но эти политики могут быть переопределены на уровне компонента. Чтобы изменить Параметр, пользователь должен иметь политики просмотра и изменения для всех компонентов, которые ссылаются на этот Параметр. Это необходимо, поскольку изменение параметра требует остановки или запуска компонентов. Также перезапуск нужен из-за изменения поведения компонента, поскольку при выполнении этого действия пользователь изменяет это поведение.
XSS-атаки и уязвимость CVE-2024-37389
Возвращаясь к уязвимости CVE-2024-37389, она приводит к тому, что аутентифицированный пользователь, уполномоченный настраивать контекст параметров, может ввести произвольный код JavaScript, который клиентский браузер выполнит в контексте сеанса аутентифицированного пользователя. Уязвимость означает, что приложение не нейтрализует контролируемые пользователем входные данные перед их помещением в выходные данные, используемые в качестве веб-страницы, предоставляемой другим пользователям, или делает это неправильно.
Обычно XSS-уязвимости эксплуатируются следующим образом:
- недоверенные данные попадают в веб-приложение через запрос. Поскольку Apache NiFi представляет собой веб-приложение, написанное на Java с REST API, этот шаг вполне может быть применен к этому ETL-инструменту.
- Веб-приложение динамически генерирует веб-страницу, содержащую эти недостоверные данные. Будучи GUI-инструментом для проектирования и исполнения конвейеров обработки данных, Apache NiFi отображает данные на веб-страницах.
- Во время генерации страницы приложение не препятствует тому, чтобы данные содержали контент, исполняемый веб-браузером, такой как JavaScript, HTML-теги, HTML-атрибуты, события мыши, Flash, ActiveX и т. д. В случае Apache NiFi это именно JavaScript.
- Пользователь посещает сгенерированную веб-страницу, которая содержит вредоносный скрипт, внедренный с использованием недоверенных данных, отправленных ранее.
- Поскольку скрипт исходит от веб-страницы, отправленной веб-сервером, веб-браузер выполняет вредоносный скрипт в контексте домена веб-сервера.
Это поведение фактически нарушает политику единого источника веб-браузера, которая гласит, что скрипты в одном домене не должны иметь возможности доступа к ресурсам или запуска кода в другом домене. Таким образом, может быть раскрыта информация, хранящаяся в пользовательских куки-файлах, передаваемых с клиентского приложения на серверное, например, IP-адрес и прочие чувствительные данные. Уязвимость CVE-2024-37389 нарушала принятую в сети политику единого источника, согласно которой браузеры должны ограничивать ресурсы, доступные скриптам, работающим на данном веб-сайте (источнике), ресурсами, связанными с ним на стороне клиента, а не клиентскими ресурсами любых сторонних сайтов. Это ограничение нужно, чтобы исключить ситуацию, когда один сайт может изменять или читать содержимое другого сайта. Применительно к XSS, домен сайта эквивалентен ресурсам, связанным с ним на стороне клиента соединения. Это означает, что домен рассматривается как все ресурсы, которые браузер хранит для взаимодействия пользователя с этим конкретным сайтом.
Уязвимость CVE-2024-37389 в NiFi 2.0.0-M1-2.0.0-M3 и 1.10.0-1.26.0 связана с отсутствием проверки входных данных. Если злоумышленник отправит специально сформированный запрос, он сможет выполнить произвольный код с правами пользователя, который запустил NiFi. Чтобы устранить эту уязвимость, необходимо обновить Apache NiFi до версии 1.27.0 или 2.0.0-M4, о новинках которого мы писали здесь. Также рекомендуется использовать брандмауэр для блокировки доступа к порту, на котором работает NiFi, чтобы предотвратить возможность атаки.
Узнайте больше про администрирование и использование Apache NiFi для построения эффективных ETL-конвейеров потоковой аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
Источники