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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2025-68116 — A Documentation of CVE-2025-68116 | Kitploit
Инструменты/GitHubGitHub/x0root/cve-2025-68116
Vulnerability AnalysisExploitationWeb SecurityPenetration TestingPapers & ResearchLearning & Education
GitHubx0root/cve-2025-68116

CVE-2025-68116

A Documentation of CVE-2025-68116

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

Популярное

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

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

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

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

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

CVE-2025-68116

Автор: @x0root
Уязвимость: Межсайтовый скриптинг (XSS) с сохранением через загружаемые файлы, рендерящиеся в браузере (SVG / HTML)
Затронутое ПО: FileRise (< 2.7.1)
Патч-версия: 2.7.1
Официальный CVE (запрошен через GHSA): CVE-2025-68116 (отслеживание/уведомление: GHSA-35pp-ggh6-c59c)
Предыдущее связанное уведомление (исходная нейтрализация, которая была обойдена): GHSA-qrcv-vjvf-fr29

Оценка CVSS:

  • CNA (GitHub): CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:L — 8.9 (Высокий)
  • Репортер (анализ автора): CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L — 9.6 (Критический)

Обоснование оценки CVSS (репортер)

Оценка репортера оценивает необходимые привилегии (PR) в момент эксплуатации, а не в момент внедрения уязвимости.

Эксплуатация происходит, когда жертва переходит по сгенерированной публичной ссылке общего доступа, что не требует аутентификации или привилегий (PR:N).

Оценка CNA оценивает PR на основе возможности загрузки вредоносного файла. Однако CVSS v3.1 определяет необходимые привилегии (PR) как привилегии, которыми должен обладать атакующий на момент эксплуатации уязвимости, а не привилегии, необходимые для размещения или подготовки уязвимого состояния.

Таким образом, PR:N более точно отражает реальные условия эксплуатации, что приводит к классификации серьезности как Критический (9.6).

Примечание: GHSA-qrcv-vjvf-fr29 ввел нейтрализацию, которая предотвращала рендеринг SVG в веб-интерфейсе FileRise (панель предпросмотра). В данном отчете документируется обход этой нейтрализации — в частности, серверные конечные точки загрузки/скачивания, — который отслеживается как GHSA-35pp-ggh6-c59c / CVE-2025-68116.


Аннотация

Этот документ представляет собой полную техническую запись CVE-2025-68116: хранимый XSS в FileRise, который сохранился после более ранней нейтрализации и в конечном итоге был исправлен в версии v2.7.1. Он включает обнаружение, доказательства эксплуатации, многократные неудачные исправления, точный анализ корневой причины с точки зрения потока управления (с доказательствами), окончательную проверку патча и анализ характеристик эксплуатации, актуальных для оценки CVSS. Все содержимое ниже основано на воспроизведенных тестах, проверке контроллера и публичной теме уведомления.


1. Предыстория: Предыдущее уведомление и неполное исправление

Предыдущее уведомление, GHSA-qrcv-vjvf-fr29, касалось хранимого XSS через загрузку SVG путем блокировки встроенного рендеринга в веб-интерфейсе FileRise. Эта нейтрализация не затрагивала то, как SVG-файлы обрабатывались следующими серверными конечными точками:

  • /api/file/download.php
  • /api/file/share.php

CVE-2025-68116 (отслеживается как GHSA-35pp-ggh6-c59c) документирует обход нейтрализации GHSA-qrcv-vjvf-fr29: атакующий может сохранить сфабрикованный SVG и доставить его жертвам через публичные ссылки общего доступа или определенные варианты скачивания, что приводит к выполнению скрипта в контексте origin FileRise.


2. Обнаружение: Загрузка доказательства концепции и обход

Чтобы проверить, по-прежнему ли серверная часть предоставляет SVG в рендерящемся виде, я загрузил простой SVG PoC:

Доступ к файлу через:

  • /api/file/download.php?…
    и, что более важно, через:
  • /api/file/share.php?token=…

привел к выполнению alert(). Исходная нейтрализация GHSA-qrcv-vjvf-fr29 (блокировка предпросмотра в интерфейсе) была обойдена прямым доступом к этим конечным точкам.


3. Доказательство реального воздействия

alert() — это PoC; я проверил значимое воздействие, заставив полезную нагрузку взаимодействовать с внутренними API.

Использованная тестовая нагрузка:

root@kitploit:~
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
  <script type="text/javascript">
    fetch('/api/upload/upload.php')
      .then(response => response.text())
      .then(data => alert('API Response: ' + data));
  </script>
</svg>

Когда вошедший в систему администратор открывал ссылку общего доступа, содержащую этот SVG, скрипт выполнялся и делал аутентифицированные запросы к API. Наблюдаемые эффекты включали:

  • Ответы API возвращались скрипту (конфиденциальная информация могла быть раскрыта)
  • Ответ API указывал состояние CSRF-токена (например, {"csrf_expired":true,"csrf_token":"..."})
  • Взаимодействие аннулировало существующий CSRF-токен администратора, предотвращая дальнейшие действия, изменяющие состояние, до восстановления (практический отказ в обслуживании функций администратора)

Классификация воздействия, продемонстрированная во время тестирования:

  • Конфиденциальность: Высокая (C:H)
  • Целостность: Высокая (I:H)
  • Доступность: Низкая (A:L)

4. Хронология раскрытия информации и многократные попытки исправления

Я сообщил о проблеме в частном порядке. Сопровождающий выпустил несколько инкрементальных исправлений:

  • v2.6.0 — Нейтрализация применена к конечной точке загрузки; конечная точка общего доступа все еще уязвима.
  • v2.6.2 — Дальнейшие попытки; конечная точка общего доступа оставалась уязвимой в моих тестах.
  • v2.7.0 — Заявлено усиление защиты для конечной точки общего доступа; все еще эксплуатируемо в моем окружении.
  • v2.7.1 — Окончательное исправление, которое, как я проверил, устраняет проблему (см. раздел Проверка).

На протяжении v2.6.0 → v2.7.0 конечная точка ссылки общего доступа продолжала обслуживать SVG таким образом, что допускался встроенный рендеринг и выполнение скриптов. Анализ корневой причины ниже объясняет, почему более ранние исправления не смогли полностью закрыть вектор.


5. Анализ корневой причины — поток управления и сбой заголовков (доказательства)

Основной причиной был не один отсутствующий заголовок, а порядок потока управления и вывода внутри shareFile() (контроллер), который препятствовал применению заголовков безопасности во многих путях выполнения. Присутствовали два класса проблем:

  • Множественные ранние точки exit;, которые прерывали функцию до того, как были установлены заголовки безопасности.
  • Предупреждения/уведомления PHP, которые выводили вывод до вызовов заголовков, вызывая ошибки «headers already sent».

5.1 Перечисление ранних выходов

Я использовал сканирование awk для вывода вхождений header() и exit; внутри shareFile() до вызова readfile():

Команда: awk '/function shareFile(/ {flag=1} /readfile(/ {flag=0} flag && /(header|exit;)/ {printf "%4d | %s\n", NR, $0}' src/controllers/FileController.php

Наблюдаемый вывод (сокращен из моего запуска):

1649 | header('Content-Type: application/json; charset=utf-8'); 1651 | exit; 1657 | header('Content-Type: application/json; charset=utf-8'); 1659 | exit; 1664 | header('Content-Type: application/json; charset=utf-8'); 1666 | exit; 1670 | header("Content-Type: text/html; charset=utf-8"); 1693 | exit; 1699 | header('Content-Type: application/json; charset=utf-8'); 1701 | exit; 1719 | header('Content-Type: application/json; charset=utf-8'); 1721 | exit; 1725 | header('Content-Type: application/json; charset=utf-8'); 1727 | exit;

Заголовки безопасности (логика усиления защиты) начинаются примерно со строки 1743:

1743 | header('X-Content-Type-Options: nosniff'); ... 1770 | header("Content-Disposition: attachment; ...");

Поскольку функция выдает заголовки + exit; раньше во многих путях, эти запросы никогда не достигали кода усиления защиты, который устанавливает Content-Disposition, nosniff или ограничительный тип.

5.2 Путь с запросом пароля

В потоке общего доступа, защищенного паролем, функция рано выводила HTML-приглашение для ввода пароля:

if (!empty($record['password']) && empty($providedPass)) { header("Content-Type: text/html; charset=utf-8"); ... exit; }

Этот путь отправляет Content-Type: text/html и завершается до логики усиления защиты SVG, что вызывает встроенный рендеринг в браузерах для защищенных паролем ресурсов, где пароль не был предоставлен.

5.3 Ресурсы общего доступа без пароля (продемонстрировано)

Уязвимость не ограничивалась потоками, защищенными паролем. Запрос к ресурсу общего доступа без пароля также возвращал text/html в моих тестах:

Команда: curl -svI "http://127.0.0.1:8080/api/file/share.php?token=437d7913884ace4b94fab8ce745a686a" 2>&1 | grep -iE "content-type"

Наблюдалось: < Content-Type: text/html; charset=UTF-8

Это подтверждает, что даже в общем случае (без пароля) ответ был text/html, и SVG рендерился встроенно.

5.4 "Headers already sent" из-за уведомлений PHP

Я захватил сырой ответ конечной точки общего доступа, который включал предупреждения PHP, выведенные до усиления заголовков. Снимок (сокращен):

Команда: curl -s "http://127.0.0.1:8080/api/file/share.php?token=437d7913884ace4b94fab8ce745a686a" | head -n 30

Наблюдаемый сырой вывод (сокращен):

Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1644


Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1645

Warning: Cannot modify header information - headers already sent by (output started at /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php:1644) in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1743

...затем следовал поток сырой SVG-нагрузки, который рендерился встроенно...

Эти предупреждения показывают, что вывод был произведен (уведомления об устаревании) до усиления заголовков, что делало невозможным применение последующих вызовов header() в этих запусках.

5.5 Сводка корневой причины

  • Код усиления защиты для принудительного скачивания и установки nosniff существовал, но не достигался на многих путях кода из-за ранних выходов и вывода.
  • Уведомления/предупреждения PHP дополнительно препятствовали изменению заголовков.
  • Практический результат: ссылки общего доступа (как с паролем, так и без него в некоторых случаях) возвращали HTML или иным образом позволяли браузеру встроенно рендерить SVG, выполняя встроенные скрипты.

6. Окончательное исправление (v2.7.1) и проверка

После отчетов о корневой причине сопровождающий применил изменения, которые решили проблемы с потоком управления и порядком вывода. В v2.7.1:

  • SVG/SVGZ ссылки общего доступа принудительно скачиваются (Content-Disposition: attachment).
  • Файлы обслуживаются с безопасным MIME-типом (application/octet-stream) для SVG.
  • Применяется X-Content-Type-Options: nosniff.
  • Логика заголовков безопасности выполняется до любого вывода, а более ранние точки exit;, которые обходили усиление защиты, были исправлены/обработаны.

Финальная проверка (мой тест на v2.7.1):

Команда: curl -svI "http://127.0.0.1:8080/api/file/share.php?token=fc911e48b0a30e9417a9020ef959784d" 2>&1 | grep -iE "content-type|content-disposition"

Наблюдалось: < Content-Type: application/octet-stream < Content-Disposition: attachment; filename="xss-image.svg"; filename*=UTF-8''xss-image.svg

Результат: Браузер принудительно скачал файл; SVG не рендерился встроенно, и XSS-нагрузка не выполнилась. Я считаю, что v2.7.1 устранила проблему в моем окружении.


7. Контекст эксплуатации CVSS

Оценка эксплуатации (анализ репортера)

  • CVSS оценивает привилегии, необходимые в момент эксплуатации, а не при внедрении.
  • Доставка эксплойта здесь не требует аутентификации: любой получатель публичной ссылки общего доступа (включая администраторов) может инициировать нагрузку без аутентификации.
  • Это создает выстрелил-и-забыл оружие: атакующий помещает вредоносный файл, выходит из системы, и публичная ссылка общего доступа остается эксплуатируемой.
  • Следовательно, правильный вектор CVSS для наиболее серьезного реалистичного сценария:

CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L — Оценка: 9.6 (Критический)

Я задокументировал это обоснование в теме уведомления и запросил использование PR:N.

Оценка сопровождающего (опубликованная)

  • Сопровождающий оценил необходимые привилегии как Низкие (PR:L) в официальном уведомлении, аргументируя это тем, что загрузка/внедрение вредоносного файла требует учетной записи или токена с возможностью загрузки (предсуществующая возможность).
  • Они сочли это требование частью привилегий до эксплуатации и поэтому использовали PR:L; текст уведомления все же отмечает, что полученные URL-адреса общего доступа могут быть открыты неаутентифицированными получателями.

Административный результат

  • Сопровождающий запросил CVE через GitHub и опубликовал уведомление GHSA с PR:L (Высокий 8.9).
  • CVE был запрошен через GitHub в рамках процесса GHSA и опубликован с PR:L. Этот документ сохраняет технический анализ репортера характеристик эксплуатации для полноты и использования в будущем.

Вектор CVSS от CNA отражает ограниченную модель угроз.

Эмпирическое тестирование демонстрирует более серьезный и воспроизводимый путь эксплуатации, что соответствует более высокому базовому баллу CVSS 3.1 в соответствии со стандартными правилами оценки.

Независимым оценщикам рекомендуется оценивать серьезность, используя наблюдаемые условия эксплуатации, описанные в этом документе, чтобы публичная оценка серьезности отражала реальное воздействие, а не узко ограниченный базовый уровень.


8. Заключение

  • Проблема была настоящим хранимым XSS, когда SVG могли обслуживаться таким образом, что допускался встроенный рендеринг и выполнение скриптов.
  • Предыдущее уведомление (GHSA-qrcv-vjvf-fr29) нейтрализовало рендеринг в режиме предпросмотра, но не затрагивало серверные конечные точки общего доступа/скачивания; GHSA-35pp-ggh6-c59c (CVE-2025-68116) документирует этот обход.
  • Основной технической коренной причиной был порядок потока управления и вывод до заголовков, что препятствовало применению заголовков безопасности во множестве путей выполнения.
  • Окончательное исправление в v2.7.1 исправляет поток управления, принуждает к скачиванию SVG и применяет соответствующие заголовки; я проверил исправление.
  • Различные интерпретации необходимых привилегий CVSS (PR:N vs PR:L) задокументированы для прозрачности.

Приложение A — Доказательства (выбранные фрагменты, захваченные в ходе расследования)

A.1 Сканирование ранних выходов заголовков (вывод awk, сокращен)

1649 | header('Content-Type: application/json; charset=utf-8'); 1651 | exit; 1657 | header('Content-Type: application/json; charset=utf-8'); 1659 | exit; 1664 | header('Content-Type: application/json; charset=utf-8'); 1666 | exit; 1670 | header("Content-Type: text/html; charset=utf-8"); 1693 | exit; 1699 | header('Content-Type: application/json; charset=utf-8'); 1701 | exit; 1719 | header('Content-Type: application/json; charset=utf-8'); 1721 | exit; 1725 | header('Content-Type: application/json; charset=utf-8'); 1727 | exit;

Заголовки безопасности начинаются примерно с 1743: 1743 | header('X-Content-Type-Options: nosniff'); ... 1770 | header("Content-Disposition: attachment; ...");

A.2 Заголовок curl для ресурса общего доступа без пароля (уязвимое поведение)

~/FileRise $ curl -svI "http://127.0.0.1:8080/api/file/share.php?token=437d7913884ace4b94fab8ce745a686a" 2>&1 | grep -iE "content-type" < Content-Type: text/html; charset=UTF-8

A.3 "Headers already sent" и уведомления об устаревании (пример сырого вывода)

Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1644


Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1645

Warning: Cannot modify header information - headers already sent by (output started at /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php:1644) in /data/data/com.termux/files/home/FileRise/src/controllers/FileController.php on line 1743

...затем следовала выгрузка SVG-нагрузки, которая выводилась и рендерилась встроенно.

A.4 Финальная проверка (v2.7.1)

~/FileRise $ curl -svI "http://127.0.0.1:8080/api/file/share.php?token=fc911e48b0a30e9417a9020ef959784d" 2>&1 | grep -iE "content-type|content-disposition" < Content-Type: application/octet-stream < Content-Disposition: attachment; filename="xss-image.svg"; filename*=UTF-8''xss-image.svg


Скачать инструмент