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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2025-60012-POC — POC для уязвимости неавторизованного доступа к файлам Apache Livy | Kitploit
Инструменты/GitHubGitHub/sid6224/cve-2025-60012-poc
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийБезопасность облачных средОбучение и ОбразованиеЛаборатории и Практика
GitHubsid6224/cve-2025-60012-poc

CVE-2025-60012-POC

POC для уязвимости неавторизованного доступа к файлам Apache Livy

Репозиторий
56 месяцев назадЕщё не проверено

Популярное

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

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

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

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

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

Только для образовательных целей и исследований в области безопасности. Не используйте против систем, которыми вы не владеете или на тестирование которых не имеете явного письменного разрешения. → Полное предупреждение

CVE-2025-60012 — Несанкционированный доступ к файлам Apache Livy

CVE Livy Severity CWE Type License Platform Language

Обзор

ПолеДетали
CVE IDCVE-2025-60012
СерьёзностьСредний (CVSS 6.3)
Затронутые версииApache Livy 0.7.0-incubating, 0.8.0-incubating — при подключении к Apache Spark 3.1 или новее
Исправлено вApache Livy 0.9.0-incubating
CWECWE-20: Некорректная проверка входных данных
Обнародована2026-03-13
СообщилFurue Hideyuki

Описание уязвимости

Аутентифицированный пользователь с доступом к REST или JDBC интерфейсу Livy может отправить Spark-сессию или пакетное задание с подделанными значениями конфигурации. Две уязвимости в совокупности позволяют злоумышленнику ссылаться на файлы локальной файловой системы за пределами разрешённых путей:

  1. Отсутствие проверки для spark.archives — Spark 3.1 ввёл spark.archives как унифицированный способ распространения архивных файлов по всем менеджерам кластера. Жёстко заданный список ключей конфигурации Livy 0.8.0, которые проходят проверку пути (HARDCODED_SPARK_FILE_LISTS), не включает spark.archives. Поэтому путь, переданный через этот ключ, никогда не проверяется по белому списку локальной файловой системы (livy.file.local-dir-whitelist), что позволяет злоумышленнику ссылаться на любой локальный файл.

  2. Обход проверки белого списка через обход каталогов — Даже для ключей конфигурации, которые ПРОВЕРЯЮТСЯ, сравнение с белым списком в Livy 0.8.0 использует простой вызов startsWith Java String на необработанном пути. Злоумышленник может обойти это с помощью обхода каталогов: /whitelisted/dir/../../etc/passwd проходит строковую проверку, но разрешается за пределами разрешённого каталога.

Затронутые исходные файлы

Файл 1 — LivyConf.scala

Уязвимая (v0.8.0): https://github.com/apache/incubator-livy/blob/v0.8.0-incubating/server/src/main/scala/org/apache/livy/LivyConf.scala

Исправленная (v0.9.0): https://github.com/apache/incubator-livy/blob/v0.9.0-incubating/server/src/main/scala/org/apache/livy/LivyConf.scala

Файл 2 — Session.scala

Уязвимая (v0.8.0): https://github.com/apache/incubator-livy/blob/v0.8.0-incubating/server/src/main/scala/org/apache/livy/sessions/Session.scala

Исправленная (v0.9.0): https://github.com/apache/incubator-livy/blob/v0.9.0-incubating/server/src/main/scala/org/apache/livy/sessions/Session.scala

Исходный код — команды клонирования

Обе версии были клонированы напрямую из официального репозитория Apache Livy на GitHub в эту рабочую область с помощью следующих точных команд:

Репозиторий: https://github.com/apache/incubator-livy```bash

Vulnerable version — cloned into ./livy-0.8.0/

git clone --depth=1 --branch v0.8.0-incubating
https://github.com/apache/incubator-livy
livy-0.8.0

Fixed version — cloned into ./livy-0.9.0/

git clone --depth=1 --branch v0.9.0-incubating
https://github.com/apache/incubator-livy
livy-0.9.0

| Version | Tag | Resolved commit | Local path |
|---------|-----|-----------------|------------|
| 0.8.0-incubating | `v0.8.0-incubating` | `78b512658e4baf1183f2b352203ada1928d8111a` | `./livy-0.8.0/` |
| 0.9.0-incubating | `v0.9.0-incubating` | `7215f209b25b96488189567807eaded00953a492` | `./livy-0.9.0/` |

## Точные различия кода

Различия были получены клонированием обоих тегов локально (см. выше) и выполнением:```bash
diff -u livy-0.8.0/server/src/main/scala/org/apache/livy/LivyConf.scala \
         livy-0.9.0/server/src/main/scala/org/apache/livy/LivyConf.scala

diff -u livy-0.8.0/server/src/main/scala/org/apache/livy/sessions/Session.scala \
         livy-0.9.0/server/src/main/scala/org/apache/livy/sessions/Session.scala

Исправление 1 — LivyConf.scala: spark.archives добавлено в жестко заданный список файлов```diff

private val HARDCODED_SPARK_FILE_LISTS = Seq( SPARK_JARS, SPARK_FILES, SPARK_ARCHIVES, SPARK_PY_FILES,

  • "spark.archives", // <-- ADDED in v0.9.0 (Spark 3.1+ config key) "spark.yarn.archive", "spark.yarn.dist.files", "spark.yarn.dist.jars", "spark.yarn.jar", "spark.yarn.jars" )
**Impact of missing entry in v0.8.0:**
Когда пользователь отправляет сессию с `conf: {"spark.archives": "file:///etc/passwd"}`, Livy
0.8.0 никогда не вызывает `resolveURIs()` для этого значения и не проверяет его по
`livy.file.local-dir-whitelist`. Путь передается Spark без проверки.

---

### Fix 2 — `Session.scala`: Нормализация пути перед проверкой белого списка```diff
   def resolveURI(uri: URI, livyConf: LivyConf): URI = {
     ...
     if (resolved.getScheme() == "file") {
-      require(livyConf.localFsWhitelist.find(resolved.getPath().startsWith).isDefined,
+      require(livyConf.localFsWhitelist.find(
+        Paths.get(resolved.getPath()).normalize.startsWith).isDefined,
         s"Local path ${uri.getPath()} cannot be added to user sessions.")
     }
   }

Влияние в v0.8.0: Проверка сырой строки startsWith может быть обойдена с помощью полезной нагрузки обхода пути.

Пример: если `livy.file.local-dir-whitelist = /opt/safe-data```` /opt/safe-data/../../../etc/passwd

- v0.8.0: `"/opt/safe-data/../../../etc/passwd".startsWith("/opt/safe-data")` → **true** (обойдено)
- v0.9.0: `Paths.get("/opt/safe-data/../../../etc/passwd").normalize` → `/etc/passwd`
          `/etc/passwd`.startsWith(`/opt/safe-data`) → **false** (заблокировано)

## Сводка векторов атак```
Attacker (authenticated REST/JDBC user)
    │
    ▼
POST /sessions  (or /batches)
{
  "conf": {
    "spark.archives": "file:///etc/shadow"        ← Attack 1: unvalidated Spark 3.1 key
    "spark.jars": "file:///safe/../etc/shadow"    ← Attack 2: path traversal bypass
  }
}
    │
    ▼
Livy 0.8.0 — validation skipped / bypassed
    │
    ▼
Spark reads the file and distributes it to executors
    │
    ▼
Attacker retrieves file contents via job output / logs

Тестовая среда

Все шаги в этом PoC были выполнены и проверены в следующей системе:

КомпонентПодробности
Host OSUbuntu 24.04.4 LTS (Noble Numbat)
Kernel6.17.0-14-generic x86_64
Architecturex86_64
Общая память15.49 GiB
Docker Engine28.2.2
Host JDKOpenJDK 17.0.18 (используется только хостом — контейнеры используют eclipse-temurin:11-jdk-focal)
Базовый образ контейнераeclipse-temurin:11-jdk-focal (JDK 11, Ubuntu Focal)
Версия Spark (оба образа)3.1.3 with Hadoop 3.2
Версия Livy — уязвимый образ0.8.0-incubating (Scala 2.12 build)
Версия Livy — исправленный образ0.9.0-incubating (Scala 2.12 build)

Структура репозитория```

. ├── LICENSE ├── README.md ├── docker/ │ ├── fixed/ │ │ ├── Dockerfile │ │ └── livy.conf │ └── vulnerable/ │ ├── Dockerfile │ └── livy.conf ├── livy-0.8.0/ ← Apache Livy 0.8.0-incubating source ├── livy-0.9.0/ ← Apache Livy 0.9.0-incubating source └── test/ └── validate.sh

---

## Доказательство концепции
Скачать инструмент