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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-83991-writeup-and-poc — Доказательство концепции, демонстрирующее обход проверки доступа к облачным файлам Windows (CVE-2026-83991), который преобразует файл, доступный только для чтения, в облачный заполнитель через семантику supersede, с подробным техническим анализом и шагами воспроизведения. | Kitploit
Инструменты/GitHubGitHub/karollooool/cve-2026-83991-writeup-and-poc
Повышение привилегийАнализ уязвимостейЭксплуатацияЭксплуатация Бинарных Файлов
GitHubkarollooool/cve-2026-83991-writeup-and-poc

CVE-2026-83991-writeup-and-poc

Доказательство концепции, демонстрирующее обход проверки доступа к облачным файлам Windows (CVE-2026-83991), который преобразует файл, доступный только для чтения, в облачный заполнитель через семантику supersede, с подробным техническим анализом и шагами воспроизведения.

Репозиторий

Популярное

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

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

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

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

Смотреть все инструменты →
Поделиться
Сайт
112 дней назадЕщё не проверено

Файл сказал «нет». Облачные файлы сказали «заменить».

CVE-2026-83991 — это уязвимость подмены файлов Windows Cloud Files, опубликованный диапазон поражённых версий которой начинается с Windows 10 версии 1809, почти за восемь лет до исправления сентября 2026 года.

Я попросил Windows открыть файл для записи. Она ответила ERROR_ACCESS_DENIED.

Я попросил Windows удалить тот же файл. Снова ERROR_ACCESS_DENIED.

Затем я попросил стек Cloud Files заменить это имя файла. Он вернул S_OK и превратил существующий файл в заместитель Cloud Files.

Файл дважды сказал «нет». Путь замены услышал что-то ближе к «пожалуйста, продолжайте».

Этот раскол авторизации и есть CVE-2026-83991. Microsoft называет его уязвимостью подмены мини-фильтр-драйвера Windows Cloud Files, оценивает как Important и присваивает базовую оценку CVSS 3.1 5.5 Medium. Официальный вектор: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N/E:U/RL:O/RC:C.

Краткая версия

Proof of concept создаёт новый каталог и обычный файл. Он предоставляет вызывающему доступ на запись к каталогу, затем применяет защищённый DACL к файлу, который даёт вызывающему доступ на чтение без обычного доступа на запись или удаление.

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

Вызов обработал одну запись, вернул ненулевой USN создания и присвоил файлу тег IO_REPARSE_TAG_CLOUD со значением 0x9000001A. В воспроизведённом запуске идентификатор файла был одинаковым до и после вызова. Тот же файл NTFS сохранился, пока его состояние изменилось на облачный заместитель.

Небольшая карта Cloud Files

Windows 10 версии 1709 представила API Cloud Files. Он даёт настольным механизмам синхронизации поддерживаемый способ регистрировать дерево каталогов, создавать записи-заместители и гидратировать их содержимое при необходимости.

Здесь важны три компонента:

  • CldApi.dll предоставляет пользовательский API Cloud Filter.
  • cldflt.sys — это мини-фильтр файловой системы в центре пути хранения.
  • Корень синхронизации — это зарегистрированное дерево каталогов, управляемое поставщиком синхронизации.

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

Соответствующий API — CfCreatePlaceholders. Он создаёт один или несколько файлов-заместителей или каталогов-заместителей под зарегистрированным корнем синхронизации. Документация Microsoft гласит, что вызывающий должен иметь доступ WRITE_DATA или WRITE_DAC к базовому каталогу.

Флаг для отдельной записи CF_PLACEHOLDER_CREATE_FLAG_SUPERSEDE со значением 0x4 обеспечивает семантику перезаписи для существующего заместителя. Интересная деталь в этом CVE заключается в том, что уязвимый путь также принимал обычный существующий файл и преобразовывал его в заместитель.

Полномочия родителя — это не полномочия листа

Эксперимент разделяет права на каталог и права на существующий файл.

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

root@kitploit:~
FILE_GENERIC_READ
FILE_GENERIC_WRITE
FILE_GENERIC_EXECUTE
DELETE

Для каталога FILE_GENERIC_WRITE включает FILE_WRITE_DATA, также называемый FILE_ADD_FILE. Этого достаточно для документированного требования к базовому каталогу, используемого CfRegisterSyncRoot и CfCreatePlaceholders.

ACE родителя не предоставляет FILE_DELETE_CHILD. Его бит DELETE применяется к самому родительскому объекту. Это различие важно, поскольку DeleteFileW требует либо DELETE для целевого файла, либо FILE_DELETE_CHILD для его родителя.

Существующий лист предоставляет текущему пользователю только FILE_GENERIC_READ. Его DACL помечен как защищённый с помощью PROTECTED_DACL_SECURITY_INFORMATION, поэтому он не наследует ACE родителя.

Это создаёт центральный вопрос:

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

Обычный доступ к файлам отвечает «нет». Уязвимый путь Cloud Files ответил «да».

Документация Microsoft по безопасности файлов объясняет, почему различие ожидаемо. Доступ к файлу обычно контролируется его собственным дескриптором безопасности. Дескриптор родителя обычно не заменяет проверку доступа дочернего элемента, за исключением конкретных правил, таких как наследование и FILE_DELETE_CHILD.

Токен остаётся на месте

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

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

Точная формулировка привилегий требует осторожности. CreateRestrictedToken с DISABLE_MAX_PRIVILEGE отключает все привилегии, кроме SeChangeNotifyPrivilege. Эта оставшаяся привилегия обходит некоторые проверки обхода каталогов. Она не предоставляет прав на запись данных файла или удаление.

Затем PoC выполняет настройку, контрольные проверки, регистрацию корня синхронизации, подключение и вызов замены, пока тот же токен олицетворения потока остаётся активным. Нет удобной смены учётной записи между «доступ запрещён» и S_OK.

Прохождение по PoC

Полный исходный код находится в main_poc.c, с build.bat для GCC или компилятора Microsoft C.

1. Начните с нового пространства имён

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

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

2. Создайте обычный файл

Программа создаёт protected_existing.bin, записывает известные тестовые данные и присваивает ему обычные атрибуты файла. Она записывает базовые метаданные файла, логический размер, атрибуты и идентификатор файла.

До вызова Cloud Files файл не является точкой повторной обработки.

3. Примените и проверьте DACL

Программа заменяет DACL листа тремя ненаследуемыми разрешающими ACE:

УчастникПрава листа
SYSTEMПолный доступ
AdministratorsПолный доступ
Текущий пользовательFILE_GENERIC_READ

Поскольку SID администраторов в действующем токене отсутствует или только запрещающий, разрешающий ACE администраторов не может предоставить потоку доступ администратора.

Затем PoC выполняет три контрольные проверки. GENERIC_WRITE завершается ошибкой 5, DeleteFileW завершается ошибкой 5, а GENERIC_READ завершается успешно. Он также подтверждает, что DACL защищён.

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

4. Станьте минимальным поставщиком синхронизации

PoC регистрирует свой новый каталог с политикой прогрессивной гидратации и политикой полного заполнения. Он предоставляет новый GUID как идентичность поставщика и корня.

Затем он вызывает CfConnectSyncRoot с таблицей обратных вызовов, содержащей только завершающую запись CF_CALLBACK_NONE. Обратный вызов гидратации не нужен для тестируемого перехода метаданных.

5. Запросите замену

Запись-заместитель сохраняет временные метки и логический размер исходного файла, предоставляет GUID-идентичность файла и устанавливает локальную константу, которая соответствует официальному флагу замены:

root@kitploit:~
#define CF_CREATE_SUPERSEDE 0x00000004UL

placeholder.RelativeFileName = leaf_name;
placeholder.FsMetadata.BasicInfo = basic_info;
placeholder.FsMetadata.FileSize = standard_info.EndOfFile;
placeholder.FileIdentity = &run_id;
placeholder.FileIdentityLength = sizeof(run_id);
placeholder.Flags = CF_CREATE_SUPERSEDE;

create_hr = cf.Create(root, &placeholder, 1, 0, &processed);

Исходный код загружает CldApi.dll динамически и разрешает публичные функции во время выполнения. Его объявленные вручную структуры покрывают только ABI, необходимый для этого теста.

6. Откажитесь праздновать слишком рано

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

Поэтому PoC требует всех этих условий, прежде чем вывести CONFIRMED и завершиться с кодом ноль:

  • CfCreatePlaceholders возвращает ровно S_OK.
  • Результат отдельной записи — ровно S_OK.
  • Обработана одна запись.
  • USN создания ненулевой.
  • Результирующий файл существует и имеет FILE_ATTRIBUTE_REPARSE_POINT.
  • FSCTL_GET_REPARSE_POINT возвращает IO_REPARSE_TAG_CLOUD.

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

Что изменилось на диске

Воспроизведённый переход состояния был:

0x00000020 — это FILE_ATTRIBUTE_ARCHIVE. Результирующая маска 0x00401600 содержит FILE_ATTRIBUTE_SPARSE_FILE, FILE_ATTRIBUTE_REPARSE_POINT, FILE_ATTRIBUTE_OFFLINE и FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS.

Неизменный идентификатор файла особенно полезен. Он показывает, что в этом запуске результатом был не просто другой файл, появившийся по тому же пути. Существующий файловый объект выжил, приобретя состояние Cloud Files.

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

Где находится сбой авторизации

Наблюдаемый сбой можно сформулировать без изобретения внутреннего стека вызовов:

  1. Вызывающий имеет достаточные полномочия над базовым каталогом, чтобы зарегистрировать его и создавать дочерние элементы.
  2. Текущий DACL существующего листа запрещает тестируемые операции записи и удаления.
  3. CfCreatePlaceholders принимает запрос замены для этого листа.
  4. CldFlt превращает лист в заместитель Cloud Files.

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

Microsoft присвоила CWE-306, Missing Authentication for Critical Function. На уровне объектов Windows эксперимент выявляет несогласованное применение авторизации. Я использую официальный CWE Microsoft в метаданных и описываю наблюдаемое поведение контроля доступа в техническом анализе.

Влияние, с прилагательными на коротком поводке

PoC демонстрирует изменение целостности и состояния файла, которое тестируемые прямые операции не могли выполнить. Локальный вызывающий с низкими привилегиями и требуемым доступом к базовому каталогу может сделать существующий доступный только для чтения лист заместителем Cloud Files через поражённый путь.

Консультация Microsoft даёт более широкое влияние на продукт: злоумышленник мог вносить несанкционированные изменения в защищённые системные данные и изменять состояние системы или конфигурацию сверх обычных привилегий. Это оценка уязвимости Microsoft. Изолированный PoC не выбирает защищённую системную цель и не демонстрирует полную цепочку пост-эксплуатации.

Вектор CVSS отражает ту же общую форму:

  • Локальный вектор атаки
  • Низкая сложность атаки
  • Требуются низкие привилегии
  • Без взаимодействия с пользователем
  • Высокое влияние на целостность
  • Без заявленного влияния на конфиденциальность или доступность

Насколько далеко это уходит назад?

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

Официальная запись CVE начинает самую старую поражённую ветвь с 10.0.17763.0 для Windows 10 версии 1809 и Windows Server 2019. История выпусков Windows 10 Microsoft перечисляет первую сборку версии 1809, 17763.1, от 2 октября 2018 года. Microsoft опубликовала исправление 8 сентября 2026 года.

Это помещает самую раннюю подтверждённую точку в публичном диапазоне чуть менее чем за восемь лет до исправления.

Сам API Cloud Files появился с Windows 10 версии 1709 в 2017 году, и документация API перечисляет 1709 как минимальный поддерживаемый клиент. Это не доказывает, что уязвимость существовала в 1709. Запись CVE Microsoft не перечисляет 1709, и это исследование не тестировало её. День рождения API не является автоматически днём рождения ошибки, как бы заманчив ни был заголовок.

Воспроизведение

Используйте поражённую тестовую систему на NTFS. Запустите PoC из обычной, не повышенной командной строки.

root@kitploit:~
build.bat
main_poc.exe

Скрипт сборки использует MinGW-w64 GCC, когда доступен, и возвращается к компилятору Microsoft C. Программа создаёт и регистрирует свой собственный новый тестовый корень. Она отменяет регистрацию и отключается во время очистки, затем оставляет тестовый каталог на месте для проверки.

Необязательная форма с путём:

root@kitploit:~
main_poc.exe C:\path\to\a\new-test-directory

Указанный путь не должен уже существовать. Держите тест изолированным и удалите его каталог после сбора результатов.

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

Закрывая файл

Самые интересные уязвимости Windows часто являются спорами о том, о каком объекте на самом деле была проверка доступа.

Здесь разрешение создавать под каталогом достигло пути, который мог преобразовать более ограничительный дочерний элемент, уже находящийся внутри него. Обычные файловые API уважали текущий DACL этого дочернего элемента. Замена Cloud Files не сохранила ту же границу.

Не потребовалось впечатляющего повреждения памяти. Один объект сказал «нет», другой объект предоставил достаточно полномочий для продолжения, и знакомое имя файла тихо стало чем-то другим.

В этом весь трюк. И именно поэтому трюк имеет значение.

Скачать инструмент
ОперацияРезультат
Открыть существующий файл с GENERIC_WRITEERROR_ACCESS_DENIED
Удалить его с помощью DeleteFileWERROR_ACCESS_DENIED
Открыть его с GENERIC_READУспех
Зарегистрировать и подключить родительский каталог как корень синхронизацииS_OK
Вызвать CfCreatePlaceholders с семантикой заменыS_OK
Проверить полученную записьОблачная точка повторной обработки
СвойствоДоПосле
Атрибуты0x000000200x00401600
Точка повторной обработкиНетДа
Тег повторной обработкиНет0x9000001A
Результат записиНе применимоS_OK
USN созданияНе применимоНенулевой
Идентификатор файлаЗаписанБез изменений