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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-33146 — Публичная ссылка выглядела чистой в дереве страниц, но конечная точка поиска рассказала другую историю. В Docmost скрытые от просмотра по публичной ссылке дочерние страницы с ограниченным доступом могли всё ещё просачиваться через результаты поиска по публичной ссылке. | Kitploit
Инструменты/GitHubGitHub/0xmrma/cve-2026-33146
Анализ уязвимостейСбор информацииВеб-безопасностьТестирование на ПроникновениеСтатьи и ИсследованияОбучение и Образование
GitHub0xmrma/cve-2026-33146

CVE-2026-33146

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

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

Популярное

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

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

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

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

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

CVE-2026-33146

Публичная ссылка выглядела чистой в дереве страниц, но поисковая конечная точка рассказывала другую историю. В Docmost скрытые дочерние страницы, недоступные для просмотра через публичную ссылку, могли всё равно просачиваться через результаты поиска по публичной ссылке.

Введение

Я обнаружил эту проблему, изучая Docmost — платформу с открытым исходным кодом для совместных вики и документации, — задавшись очень простым вопросом:

Если страница намеренно скрыта от публичного зрителя, каждый ли публичный функционал соблюдает то же ограничение?

В данном случае ответ был отрицательным.

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

Проблема была принята и получила идентификатор CVE-2026-33146.

Docmost: Docmost на GitHub
CVE: CVE-2026-33146

Официальный сайт Docmost представляет его как корпоративную вики, развёртываемую на месте, с более 3 миллионов загрузок, и утверждает, что ему доверяют команды таких организаций, как Vilnius City, Bechtle, Правительство Австралии, Красный Крест и ETS Quebec.

photo0

Цепочка атаки

публичная родительская ссылка с включенными подстраницами → ограниченный потомок исключён из публичного дерева → злоумышленник запрашивает поиск по публичной ссылке → утекают заголовок и фрагмент ограниченного потомка


Что делает Docmost

Docmost — это платформа для совместных вики и документации.

Она предоставляет:

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

Это означает, что её модель публичного доступа является реальной границей безопасности.

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

Настоящий вопрос заключался в следующем:

Когда Docmost решает, что дочерняя страница является ограниченной и не должна отображаться посетителю по публичной ссылке, соблюдается ли это ограничение везде в потоке публичного доступа?

В данном случае — нет.


Почему эта ошибка заслуживала внимания

Многие проверки безопасности прекращаются слишком рано, когда видят страницу, скрытую в интерфейсе.

Этого недостаточно.

Более сильный вопрос звучит так:

Каждый ли серверный путь применяет одно и то же решение о видимости?

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

Здесь конечная точка дерева публичных ссылок вела себя безопасно:

  • ограниченные потомки были скрыты

Но путь поиска по публичной ссылке вёл себя иначе:

  • ограниченные потомки всё ещё влияли на результаты
  • их заголовки просачивались
  • их подсвеченные фрагменты содержимого просачивались

Это превратило проблему в реальную уязвимость авторизации и раскрытия информации, а не просто в несоответствие отображения.


Граница, на которой я сосредоточился

Я не подходил к Docmost, случайно фаззя конечные точки в надежде, что появится что-то интересное.

Более сильный путь — сначала выбрать доверенную границу.

Для приложений, поддерживающих:

  • публичный доступ
  • вложенные объекты
  • ограничения на уровне страниц
  • поиск содержимого

один из лучших вопросов:

Применяет ли уровень поиска точно такую же границу авторизации, как и уровень просмотра?

Этот вопрос становится особенно ценным, когда:

  • родительский объект является публичным
  • потомки имеют разные правила видимости
  • поиск реализован через отдельный сервисный путь

Именно здесь и проявилась эта проблема.


Первопричина

Ошибка была не в том, что Docmost не смог скрыть ограниченную страницу в обычном публичном дереве.

Ошибка заключалась в том, что публичный поиск не учитывал ту же логику ограничений.

Из анализа исходного кода: поток публичного дерева использовал обход потомков с учётом ограничений.

Соответствующая область:

  • apps/server/src/core/share/share.service.ts

Этот путь намеренно исключал ограниченных потомков, используя:

  • getPageAndDescendantsExcludingRestricted(...)

Но поток поиска по публичной ссылке шёл по другому пути.

Соответствующие области:

  • apps/server/src/core/search/search.controller.ts
  • apps/server/src/core/search/search.service.ts

Там код собирал потомков, используя:

  • getPageAndDescendants(...)

Это означало, что ограниченные потомки оставались в области поиска.

В контексте публичного доступа это имеет большое значение, потому что ветка поиска выполняется без обычного контекста разрешений аутентифицированного пользователя. Как только ограниченные потомки были включены в набор страниц, доступных для поиска, их метаданные могли просачиваться через ответ.

Почему это эксплуатируемо

Потому что злоумышленнику не нужна аутентифицированная учётная запись.

Ему нужно только:

  • действительный ключ публичной ссылки
  • включённые подстраницы в общей ссылке
  • знание или догадки о поисковых запросах, которые могут встречаться в скрытых потомках

Как только это условие выполнено, публичный посетитель может запросить конечную точку поиска по общей ссылке и восстановить:

  • скрытые заголовки страниц
  • подсвеченные фрагменты содержимого
  • доказательство существования ограниченной дочерней страницы под общей родительской

Этого достаточно для создания утечки конфиденциальности, даже если полное тело страницы не возвращается.


Почему это проблема безопасности, а не просто разное поведение конечных точек

Важное различие в том, что приложение уже чётко сигнализирует о предполагаемой модели безопасности.

Конечная точка публичного дерева скрывает ограниченных потомков.

Поэтому настоящий вопрос не:

«Случайно ли поиск возвращает более широкий набор результатов?»

Настоящий вопрос:

«Нарушает ли поиск решение об авторизации, уже принятое в другом месте для той же границы публичного доступа?»

В Docmost — да.

Это превращает проблему из:

  • несоответствия функциональности

в:

  • несоответствие контроля доступа

Вот почему это настоящая уязвимость.


PoC (доказательство концепции)

Я подтвердил проблему, сравнив две соответствующие публичные конечные точки бок о бок.

Случай 1: Публичное дерево правильно скрывает ограниченного потомка

Сначала я проверил обычную конечную точку публичного дерева, используя ключ публичной ссылки.

Пример запроса:

POST /api/shares/tree HTTP/1.1
Host: 127.0.0.1:6752
Content-Type: application/json

{
  "shareId": "public-share-key"
}

Ответ вернул только публичную дочернюю страницу в дереве страниц.

Показательный результат:

{
  "pageTree": [
    {
      "id": "public-child",
      "title": "Public roadmap"
    }
  ]
}

Это установило ожидаемое поведение продукта:

  • ограниченный потомок был намеренно скрыт от публичного посетителя

Случай 2: Поиск по публичной ссылке всё ещё раскрывает ограниченного потомка

Затем я запросил конечную точку поиска по публичной ссылке, используя термин, который встречался внутри ограниченного потомка.

Пример запроса:

POST /api/search/share-search HTTP/1.1
Host: 127.0.0.1:6752
Content-Type: application/json

{
  "shareId": "public-share-key",
  "query": "salary"
}

Ответ всё равно включил ограниченного потомка:

{
  "items": [
    {
      "id": "public-child",
      "title": "Public roadmap",
      "highlight": "release plan and milestones"
    },
    {
      "id": "restricted-child",
      "title": "Payroll Q4",
      "highlight": "salary bands and bonus targets"
    }
  ]
}

Это доказало основное утверждение:

  • ограниченный потомок был скрыт в публичном дереве
  • но всё равно просочился через поиск по публичной ссылке

Почему важны оба воспроизведения

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