Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
spark-python-ds-static — Apache Spark 4.2.0 — высокий уровень — удалённо — остаточные привилегии — глобальная для процесса карта Python Data Source | Kitploit
Инструменты/GitHubGitHub/abraxas/spark-python-ds-static
Повышение привилегийАнализ уязвимостейЭксплуатацияПост-эксплуатацияСтатьи и ИсследованияRed TeamingРазработка Полезной НагрузкиЛаборатории и Практика
GitHubabraxas/spark-python-ds-static

spark-python-ds-static

Apache Spark 4.2.0 — высокий уровень — удалённо — остаточные привилегии — глобальная для процесса карта Python Data Source

Репозиторий
178 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Abraxas Labs - spark-python-ds-static

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  spark-python-ds-static

Разбор: https://abraxaslabs.tech/research/spark-python-ds-static

spark-python-ds-static

Класс: Остаточные привилегии Доступ: Удалённый

Apache Spark 4.2.0 (32f72996) — Apache Software Foundation

DataSourceManager.dataSourceBuilders — это JVM-глобальная карта с приоритетом первого добавления (first-wins). SPARK-45917 автоматически регистрирует Python Data Sources pyspark_* из sys.path воркера, выполняющего поиск. Изоляция сессий Connect хранит артефакты в SparkFiles/<sessionUUID>/, а registerPython для каждой сессии остаётся в runtimeDataSourceBuilders. Первый поиск всё равно помещает каталог SparkFiles инициирующей сессии в sys.path, сериализует (pickle) каждый DefaultSource и кэширует эти классы в companion-объекте. Последующий Connect SQL (или Hive Thrift SQL) read.format(name) / USING name запускает этот класс от имени Spark UID без отправки Python proto.

Закладчик — это Python-арендатор Connect, которому Python уже разрешён. Жертва — арендатор, работающий только через SQL, на том же драйвере Connect. Java-алиасы (parquet, csv, json, orc, jdbc) остаются на пути Java ServiceLoader. Последующие закладки после заполнения карты не обновляются. AC:H — это первый поиск плюс имя, не являющееся Java-алиасом.

IDCVE пока нет
КлассОстаточные привилегии (кросс-сессионный Python Data Source от имени Spark UID; не отправка задачи без аутентификации)
ДоступУдалённый (общий драйвер Spark Connect)
CWECWE-269, CWE-502
CVSSВысокий: 8.8 CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:H
ПродуктApache Spark
Затронуто4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8) статический реестр Python Data Source
АутентификацияPython-арендатор Connect (закладчик) плюс более поздний пользователь Connect / Hive Thrift SQL только с SQL (жертва)
ЛицензияGNU Affero GPL v3.0
Лабораториятолько 127.0.0.1:18970. Файл-свидетель. Гаджет companion-карты.

Что может сделать атакующий

Удерживать сессию Spark Connect Python на общем драйвере. Разместить pyfiles/pyspark_<name>.py, чей DefaultSource.name() является именем отсутствующего коннектора (delta, iceberg, hudi, ...). Инициировать первый поиск Python Data Source в этой сессии. Любая последующая сессия в той же JVM, которая выполняет read.format(name) или SQL USING name, инстанцирует сериализованный класс от имени Spark UID на воркере планировщика драйвера и на исполнителях.

Это и есть полный набор привилегий. Закладчик уже выполняет Python. Остаточная проблема в том, что арендатор, работающий только через SQL и никогда не отправлявший REGISTER_DATA_SOURCE / Python UDF proto, всё равно исполняет этот класс.

Целостность (доказано в лаборатории)

МетодТочка сбросаПривилегия
Закладчик: AddArtifacts с именем pyfiles/pyspark_<name>.py, затем первый format(name) / поискcompanion DataSourceManager.dataSourceBuilders (объект DataSourceManager.scala) плюс iter_modules из pyspark_* в lookup_data_sources.pyКэшировать сериализованный DefaultSource инициирующей сессии на уровне всей JVM. Лаборатория: layer='static' trigger='attacker' first-wins=yes.
Жертва: SQL USING <name> / spark.read.format(name) в сессии, которая ничего не размещалаPythonDataSourceV2 createDataSourceInPythonЗапустить этот класс от имени Spark UID. Лаборатория: planted_by='attacker' witness_written=True static-cross-session=yes. Файл-оракул содержит SPARK-PYTHON-DS-STATIC-WITNESS.

Закрыто в этом проходе (доказано в лаборатории)

МетодSinkРезультат
Позднее размещение второго имени после заполнения картыта же статическая картаЗакрыто. Побеждает первый. Лаборатория: later-lookup found=False, companion по-прежнему только delta.
Посессионный registerPython("alpha")runtimeDataSourceBuildersИзолировано. Клон копирует только runtime. Лаборатория: runtime-isolated=yes. Чтение alpha жертвой даёт found=False.
Java-алиас parquetJava DataSourceRegister ServiceLoaderЗакрыто. Лаборатория: java-alias-closed=yes layer='java'. То же для csv/json/orc/jdbc.

Предполагаемое (те же sink'и, не оракул)

МетодSinkПривилегия
USING жертвы после размещенияPython-воркеры драйвера + исполнителяКод в масштабе кластера от имени Spark UID. Лаборатория пишет файл-свидетель вместо полезной нагрузки.
Тот же путьпадение / зависание воркераДоступность от имени Spark UID. Не High. High — это выполнение кода.
Hive Thrift SQL USING на общем SparkSessionта же статическая картаТот же остаток, если Thrift и Connect делят JVM драйвера. Не проверялось.

Чего этот остаток не даёт

  • Неаутентифицированная отправка заданий на открытом кластере. FAQ в SECURITY.md. По замыслу.
  • Перехват Java parquet / csv / json / orc / jdbc. Побеждает ServiceLoader.
  • Выход за пределы пути артефактов (concatenatePaths отклоняет .. и абсолютные имена).
  • pythonExec, задаваемый клиентом. Планировщик Connect использует серверные PYSPARK_PYTHON / python3.
  • Утечка registerPython между сессиями. Карта runtime привязана к экземпляру DataSourceManager.
  • Однопользовательский локальный pyspark с одной сессией. Другого арендатора нет.
  • Поиск с промахом первым, заполняющий пустую карту. Поздние размещения не обновляют (AC:H).

Как я это нашёл

Я зафиксировал apache/spark v4.2.0 (32f7299601108917fb01920a54e084595b7b3bf8). Двадцать восемь поисков по исходникам. Отправка заданий, выполняющая пользовательский код, — по замыслу. History Jackson, оболочка UI, локальная имперсонация PySpark и путь приёма standalone RPC закрыты на этом этапе. Артефакты Connect изолируют pyfiles под UUID сессии. Runtime registerPython — посессионный. Companion-объект — нет.

SPARK-45917 автоматически регистрирует пакеты pyspark_* из PYTHONPATH. Это предназначено для коннекторов, установленных оператором. Остаток в том, что воркер поиска также делает sys.path.insert для каталога SparkFiles вызвавшей сессии (worker_util.setup_spark_files), а затем пиклит любой найденный pyspark_* DefaultSource в глобальную для процесса карту, которая никогда не обновляется.

Неверный поворот: считать изоляцию registerPython всем барьером между арендаторами. Runtime изолирован. Статика — нет.

Лаборатория

cd lab
./run.sh
Скачать инструмент