
Apache Spark 4.2.0 — высокий — удалённый — остаточные привилегии — proxy-user defaultExtraClassPath
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · spark-proxyuser-classpath
Класс: Остаточная привилегия (остаток от CVE-2023-22946 / SPARK-41958) Достижимость: Удалённая
Apache Spark 4.2.0 (32f72996) - Apache Software Foundation
CVE-2023-22946 / SPARK-41958 по-прежнему устанавливает spark.submit.proxyUser.allowCustomClasspathInClusterMode в false по умолчанию и по-прежнему выполняет childClasspath.clear() при отправке в кластер с --proxy-user. Это публичный путь YARN --jars. Затем в Spark 4.0 был добавлен spark.driver.defaultExtraClassPath. Лаунчер всегда добавляет этот ключ в начало -cp JVM spark-submit, в том числе в режиме кластера. SPARK-41958 его никогда не видит.
Арендатор в стиле Livy по-прежнему может загрузить размещённый jar внутри JVM spark-submit шлюза. Hadoop UserGroupInformation.doAs этого не меняет — Unix UID остаётся прежним.
| ID | CVE пока нет |
| Класс | Остаточная привилегия (остаток от CVE-2023-22946 / SPARK-41958) |
| Достижимость | Удалённая (отправка задания в стиле Livy с --proxy-user через шлюз) |
| CWE | CWE-269, CWE-427 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Продукт | Apache Spark |
| Затронуто | Apache Spark 4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) |
| Аутентификация | аутентифицированный арендатор шлюза в стиле Livy / Kyuubi / Oozie, который передаёт --conf и размещённые --jars в spark-submit --proxy-user ... --deploy-mode cluster |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1:18950. Файл-свидетель. Гаджет из проходов по указанному лаунчеру / submit. |
Иметь аккаунт арендатора на многопользовательском шлюзе Spark (Livy, Kyuubi, Oozie и им подобные), который запускает spark-submit --proxy-user <tenant> --deploy-mode cluster под UID суперпользователя. Разместить jar, который JVM шлюза может открыть. Отправить --conf spark.driver.defaultExtraClassPath=<staged jar>. Шлюз SPARK-41958 может оставаться в значении false. Сформированный spark-submit -cp всё равно начинается с этого jar. Классы из него загружаются под Unix UID шлюза.
--conf spark.submit.proxyUser.allowCustomClasspathInClusterMode=true — это второй проход: .internal() существует только в документации, --conf всё равно записывает ключ, и тогда YARN-кластер сохраняет --jars в childClasspath. Публичный CVE-2023-22946 остаётся путём YARN по умолчанию через --jars, который уже покрывается clear(). Этот остаток — незащищённый defaultExtraClassPath.
Hadoop-имперсонация после чистой отправки по-прежнему действует как прокси-пользователь для YARN AM / драйвера k8s. Этот остаток затрагивает только JVM шлюза.
| Метод | Точка сброса | Разведка | Целостность | Доступность | Происхождение |
|---|---|---|---|---|---|
Отправка в стиле Livy --proxy-user + yarn/k8s/standalone cluster + --conf spark.driver.defaultExtraClassPath=<staged local jar>, флаг SPARK-41958 оставлен false | SparkSubmitCommandBuilder.buildSparkSubmitCommand SparkSubmitCommandBuilder.java:317-327 первый элемент -cp | Перечисление/чтение файлов, доступных UID шлюза (каталог keytab, spark-defaults, локальный staging). Hadoop-идентичность последующих RPC остаётся прокси-пользователем. | Загрузка классов арендатора внутри JVM spark-submit. Unix UID остаётся UID шлюза (Hadoop proxy superuser). Лаборатория: defaultExtraClassPath-on-cp=yes childClasspath-cleared=yes lab.WitnessMain записал SPARK-PROXYUSER-CLASSPATH-WITNESS. Выведено из публичного класса CVE: наложение ресурсов Hadoop Configuration / поиск реализации FileSystem под этим UID. | Падение JVM submit, если наложение выбрасывает исключение. Не класс. | Доказанная в лаборатории загрузка + запись свидетеля через сформированный -cp. Наложение Hadoop выведено. Проброс --conf в Livy/Kyuubi выведен (эти деревья не соответствуют данному пину). |
Та же отправка с --conf spark.submit.proxyUser.allowCustomClasspathInClusterMode=true плюс --jars / первичный ресурс | SparkSubmit.prepareSubmitEnvironment SparkSubmit.scala:333-336,738-743,917-924, затем runMain :980-987 | Та же разведка, что и в проходе A, но на дочернем URLClassLoader, а не на системном загрузчике. | Сохранение --jars в childClasspath, чтобы выполнялся addJarToClasspath. Лаборатория: conf-flag-keeps-jars=yes. | То же. | Доказанное в лаборатории сохранение childClasspath. Это не повторная регистрация публичного пути YARN --jars, который покрывается clear(), когда флаг остаётся false. |
Доказано в лаборатории vs выведено: сформированный -cp содержит defaultExtraClassPath в режиме кластера; childClasspath.clear() всё ещё выполняется при флаге по умолчанию; spark.driver.extraClassPath опускается в режиме кластера; --jars при флаге false очищается; класс-свидетель на этом -cp записывает оракул. Выполнение класса конфигурации Hadoop — это механизм публичного CVE-2023-22946, здесь он не воспроизводился. Проброс --conf в Livy/Kyuubi — это архитектура, документированная этими проектами.