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

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

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

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

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

Категории

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

CVE-2026-33146

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

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

Популярное

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

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

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

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

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

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: Публичное дерево правильно скрывает ограниченного потомка

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

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

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

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

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

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

root@kitploit:~
{
  "pageTree": [
    {
      "id": "public-child",
      "title": "Public roadmap"
    }
  ]
}

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

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

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

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

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

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

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

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

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

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

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

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

Самая сильная сторона этой проблемы — не второй запрос сам по себе.

Это контраст между двумя конечными точками.

Первая

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

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

Вторая

Доказывает, что путь поиска нарушает ту же самую границу.

Это затрудняет отклонение проблемы как ожидаемого поведения поиска или пробела в документации.

Само приложение устанавливает правило через ответ дерева, а затем нарушает его через ответ поиска.

Это веское доказательство.


Что на самом деле даёт утечка злоумышленнику

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

Её масштаб уже.

Но в пределах затрагиваемого поддерева публичной ссылки она всё же даёт злоумышленнику полезные несанкционированные знания:

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

Даже короткие фрагменты могут иметь значение.

Заголовок типа:

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

уже создаёт ценность для злоумышленника.

Поэтому, хотя в итоге проблема была классифицирована как Умеренная, это всё же действительная проблема конфиденциальности с чётким и защищаемым нарушением границы.


Серьёзность и классификация

Этой проблеме был присвоен:

  • CVE-2026-33146

Уровень серьёзности в уведомлении:

  • Умеренный
  • CVSS: CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:L/I:N/A:N

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

Важно то, что проблема всё ещё действительна.

Утверждение здесь не:

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

Утверждение следующее:

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

Это настоящее раскрытие информации, связанное с авторизацией.


Почему об этом всё равно стоило сообщить

Некоторые люди слишком быстро отвергают утечки метаданных.

Это ошибка.

Настоящий вопрос — пересекают ли утёкшие данные намеченную границу.

Здесь — пересекли.

Если приложение говорит:

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

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

  • его заголовок
  • часть его содержимого

то модель конфиденциальности нарушена, даже если влияние ограничено.

Это делает ошибку достойной сообщения.

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


Анализ исправления

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

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

root@kitploit:~
getPageAndDescendants(...)

Вместо этого она должна соответствовать более безопасному обходу публичной ссылки и использовать:

root@kitploit:~
getPageAndDescendantsExcludingRestricted(...)

Альтернативное исправление — сохранить более широкое перечисление, а затем явно отфильтровать ограниченных потомков перед тем, как поиск вернёт результаты.

Но более чистый дизайн прост:

граница поиска должна совпадать с границей просмотра

Именно это свойство безопасности было нарушено.


Раскрытие информации

Об этой проблеме было сообщено приватно через поток безопасности GitHub.

Отчёт показывал:

  • ожидаемое безопасное поведение через /api/shares/tree
  • несогласованное уязвимое поведение через /api/search/share-search
  • первопричину на уровне исходного кода
  • конкретный путь воспроизведения

Проблема была принята и получила:

CVE-2026-33146

Итоговый уровень серьёзности уведомления — Умеренный, что лучше соответствует более узкому объёму утечки, чем более широкая критичность.

Это не ослабляет обоснованность находки.

Это просто более точно определяет её влияние.


Чему на самом деле учит эта ошибка

Ключевой урок прост:

скрыть что-то в одной публичной конечной точке недостаточно, если другая публичная конечная точка всё равно это раскрывает.

Многие разработчики думают об авторизации только в очевидном пути отображения:

  • дерево страниц
  • просмотр страницы
  • основной интерфейс

Но реальная граница шире.

Также нужно спросить:

  • соблюдает ли поиск те же правила?
  • соблюдают ли побочные каналы те же правила?
  • соблюдают ли ответы метаданных те же правила?

В Docmost ответ был отрицательным.

Вот в чём суть.


Ключевые моменты

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

Заключительные слова

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

Она заключалась в задании очень практического вопроса о доверенной границе.

Docmost скрыл ограниченную страницу в одном месте.
Затем раскрыл её в другом.

Вот почему это стало CVE-2026-33146.

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