PoC, IOCs и логика обнаружения для цепочки десериализации BinaryFormatter в SharePoint /_trust WS-Federation. Лабораторная реконструкция, охватывающая неаутентифицированное RCE, кражу машинного ключа внутри процесса и артефакты, которые оставляет после себя каждый вариант. SharePoint 2016, 2019 и Subscription Edition. CVE-2026-50522, CVE-2026-45659, CVE-2026-56164, CVE-2026-58644.
/_trust: десериализация WS-Federation: PoC и заметки по обнаружениюЖивой разбор (GitHub Pages): https://sp-poc.wismansec.com/ (HTML-рендеринг этого документа).
Затронуты: SharePoint Server 2016, 2019 и Subscription Edition.
Реконструкция вторжения в SharePoint Server (Subscription Edition) в изолированной лаборатории, выполненная, чтобы (a) понять полные возможности атакующего, (b) определить, что защитнику следует искать, включая скрытное закрепление, и (c) поделиться PoC в помощь другим исследователям.
Только авторизованные исследования. Всё здесь выполнялось на изолированном, лично принадлежащем лабораторном оборудовании и учётных записях, против сборки, специально оставленной без исправлений для теста. Базовая проблема устранена вендором; установите актуальные обновления. Не запускайте это против систем, которые вам не принадлежат и на тестирование которых у вас нет явного разрешения. Значения машинных ключей, внутренние имена хостов/IP-адреса и callback-домены скрыты в тексте и примерных артефактах. Скриншоты SIEM не изменены и содержат реальные имена лаборатории; см. примечание в §4.
/_trustPOST /_trust/default.aspx (вход WS-Federation) с вредоносным SecurityContextToken запускает десериализацию BinaryFormatter в рабочем процессе SharePoint (w3wp.exe) и даёт удалённое выполнение кода от имени учётной записи пула веб-приложения./_trust обнаруживает и блокирует это; см. §5). Эти ключи позволяют атакующему подделывать токены __VIEWSTATE/auth, которые переживают установку исправлений./_trust — единственный артефакт, присутствующий во всех вариантах.SharePoint предоставляет конечную точку пассивного входа WS-Federation по адресу /_trust/default.aspx. Сформированный ответ входа (wa=wsignin1.0 + wresult=<RequestSecurityTokenResponse>) содержит SecurityContextToken, у которого элемент <Cookie> является потоком BinaryFormatter в base64, сжатым DEFLATE. На стороне сервера этот cookie распаковывается и десериализуется без ограничения типов, поэтому gadget-цепочка (через ysoserial.net) выполняет управляемый атакующим код внутри w3wp.exe.
Схема запроса (без аутентификации):
POST /_trust/default.aspx HTTP/1.1
Content-Type: application/x-www-form-urlencoded
wa=wsignin1.0&wctx=<url>&wresult=<RequestSecurityTokenResponse>...
<SecurityContextToken><Cookie>BASE64(DEFLATE(BinaryFormatter payload))</Cookie>...
| Цепочка | Гаджет | Результат | Канал вывода |
|---|---|---|---|
| OOB RCE | TypeConfuseDelegate → -EncodedCommand PowerShell | выполнение кода от имени учётной записи пула | внеполосно (beacon HTTP/DNS) |
| Раскрытие машинных ключей | ActivitySurrogateDisableTypeCheck → ActivitySurrogateSelectorFromFile (компилирует KeyDump.cs внутри процесса) | извлекает ValidationKey/DecryptionKey | непосредственно в HTTP-ответе |
Скрипты (санированные) в scripts/: параметризованный OOB RCE и двухэтапное извлечение ключей. Доставка полезной нагрузки использует PowerShell -EncodedCommand, поэтому многооператорные полезные нагрузки проходят через слой cmd.exe/транспорта без повреждений (без проблем с экранированием ;/&&).
Одна ферма SharePoint SE (сборка зафиксирована до исправления), учётная запись пула приложений LAB\sp_pool, PowerShell 5.1, Microsoft Defender включён с облачной защитой. Телеметрия (журналы событий Windows, журналы SharePoint, Defender for Endpoint) передавалась в nano, лёгкую SIEM-систему с открытым исходным кодом; на хосте атакующего запускался ysoserial.net; клиент interactsh предоставлял внеполосный слушатель. Адреса и домены скрыты в тексте; см. примечание о скриншотах в §4.
Каждая строка — одна реальная детонация; артефакты собраны из SIEM и внеполосного слушателя для каждого запуска.
Скриншоты не изменены. Они содержат реальные имена хостов и NetBIOS-имена лаборатории, которые просты и отличаются от санированных
SHAREPOINT01/LAB, используемых в тексте. Те же запуски, те же события, ничего не постановочно. Безопасные для рабочего окружения эквиваленты вartifacts/.
| Способ вызова | Дерево процессов (от LAB\sp_pool, High) | Defender | Внеполосный beacon | Основные артефакты |
|---|---|---|---|---|
| OOB RCE, по умолчанию | w3wp.exe → cmd.exe → powershell.exe → conhost.exe | Behavior:Win32/WebshellLauncher.A (EID 1116 — обнаружение / 1117 — удаление) | дошёл (гонка) | дерево событий 4688; Defender 1116/1117; POST /_trust |
OOB RCE, -RawCmd | w3wp.exe → powershell.exe → conhost.exe (без cmd) | нет | дошёл (DNS+HTTP) | дерево событий 4688; POST /_trust; beacon |
OOB RCE, -DropFile | w3wp.exe → powershell.exe | нет | дошёл | запись файла в …\TEMPLATE\LAYOUTS\ (нет в журнале аудита доступа к объектам) |
OOB RCE, -Diag | w3wp.exe → powershell.exe → whoami.exe | нет | дошёл | экфильтрация данных об окружении: {host, whoami, PSver, LanguageMode} |
| Извлечение машинных ключей | (нет, внутри процесса) | нет | (нет) | только POST /_trust + аномальный ответ, содержащий ключи |
Эти результаты относятся к конфигурации AMSI по умолчанию (режим Balanced, /_trust не сканируется). При включённом сканировании тела запроса AMSI для /_trust (режим Full или целевой) каждая строка вместо этого блокируется на уровне запроса: HTTP 400, Exploit:Script/SpCookieExec.A, до выполнения (см. §5).

Все четыре задокументированные детонации, с 15:01 по 15:18 UTC, каждый дочерний процесс w3wp.exe работает от имени учётной записи пула. В трёх случаях из четырёх powershell.exe был запущен напрямую. Только запуск в 15:03:34 идёт через cmd.exe, и только он был обнаружен. Если расширить окно за пределы этих событий, в набор результатов попадут и более ранние итерации разработки того же утра, поэтому утверждение ограничено этими четырьмя запусками.

Обычный вызов: w3wp.exe → cmd.exe → powershell.exe, рядом conhost.exe. Именно на такую форму срабатывает Behavior:Win32/WebshellLauncher.A.

Вызов с -RawCmd, тот же примитив и та же полезная нагрузка, но с удалённым промежуточным cmd.exe. Defender не выдал ничего для этого запуска. Обнаружение, построенное на w3wp → cmd, полностью его пропускает.