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

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

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

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

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

Категории

Все категории
Loading categories
seal-security-nuget-demo-net7 — Форк .NET 7 от seal-security-nuget-demo: та же история эксплуатации CVE-2024-21907, переориентированная для клиентов, привязанных к .NET SDK 7. | Kitploit
Инструменты/GitHubGitHub/seal-sec-demo-2/seal-security-nuget-demo-net7
Анализ уязвимостейDevSecOpsБезопасность Цепочки ПоставокОбучение и ОбразованиеПодобранные РесурсыЛаборатории и Практика
GitHubseal-sec-demo-2/seal-security-nuget-demo-net7

seal-security-nuget-demo-net7

Форк .NET 7 от seal-security-nuget-demo: та же история эксплуатации CVE-2024-21907, переориентированная для клиентов, привязанных к .NET SDK 7.

Популярное

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

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

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

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

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

Browser + CLI Demo (NuGet/C#) — .NET 7 Edition

Зачем форк .NET 7?

Это переориентированный форк канонического seal-security-nuget-demo (который предназначен для net9.0). История эксплойта, контроллеры и список запатченных пакетов идентичны — отличается только TargetFramework.

Он существует потому, что большинство корпоративных заказчиков не могут перейти на новейший .NET SDK по требованию. .NET 7 достиг конца поддержки 14 мая 2024 года, но реальные продуктовые среды всё ещё работают на нём по причинам совместимости, сертификации или операционным причинам. Именно для этого и предназначена Seal Security: когда заказчик не может (или не хочет) делать major version bump, Seal исправляет уязвимую зависимость на месте в той же версии, без изменения публичного API и без правок кода приложения заказчика. Эта демонстрация позволяет провести разговор на реальном стеке заказчика, вместо того чтобы просить его сначала установить net8/net9.

Форк фиксирует SDK на 7.0.x через global.json, чтобы случайные обновления не проникли во время демонстрации.


Обзор

Это демонстрационное приложение — простая страница приветствия ASP.NET Core, которая использует Newtonsoft.Json 12.0.2 для разбора пользовательского ввода как объекта конфигурации. В приложении есть поле имени — введите своё имя, нажмите Go, и оно отобразит «Welcome, alice!». Под капотом оно передаёт ввод через JsonConvert.DeserializeObject<NestedConfig>() из Newtonsoft.Json. Всё — совершенно стандартное использование популярной JSON-библиотеки.

Проблема в том, что Newtonsoft.Json 12.0.2 (и версии до 13.0.1) имеет CVE-2024-21907 — уязвимость отказа в обслуживании высокого уровня серьёзности с оценкой CVSS 7.5 (HIGH). Эта демонстрация показывает, как Seal Security исправляет уязвимость на месте, не требуя обновления major версии.


Уязвимость: CVE-2024-21907

В чём заключается уязвимость?

Метод JsonConvert.DeserializeObject<T>() из Newtonsoft.Json может быть использован путём создания глубоко вложенных JSON-полезных нагрузок. При десериализации в типизированный объект (POCO) библиотека JsonSerializerInternalReader выполняет истинно рекурсивные вызовы (CreateValueInternal → CreateObject → PopulateObject → SetPropertyValue → CreateValueInternal), что приводит к переполнению стека, вызывая крах приложения (отказ в обслуживании).

Как работает эксплойт

Приложение принимает пользовательский ввод и разбирает его через Newtonsoft.Json. Если ввод является URL, приложение сначала загружает содержимое — реалистичный шаблон, используемый загрузчиками конфигураций, тестерами API и получателями вебхуков:

root@kitploit:~
public class NestedConfig
{
    [JsonProperty("n")]
    public NestedConfig? N { get; set; }
}

var config = JsonConvert.DeserializeObject<NestedConfig>(name);

Нормальный ввод: Введите alice → отображается «Welcome, alice!»

Эксплойт: Вставьте этот URL в поле имени и нажмите Go:

root@kitploit:~
https://raw.githubusercontent.com/seal-sec-demo-2/json-payload/main/payload.json

Приложение определяет, что это URL, загружает json-payload (глубоко вложенный JSON {"n":{"n":{...}}}) и десериализует его через Newtonsoft.Json в рекурсивный класс NestedConfig — вызывая переполнение стека.

JsonSerializerInternalReader рекурсивно проходит через CreateValueInternal → CreateObject → PopulateObject → SetPropertyValue для каждого уровня вложенности. На глубине около 5000 уровней это исчерпывает стек потока, и приложение падает с StackOverflowException — процесс умирает мгновенно (обработка ошибок невозможна).

Реальное влияние

С помощью этой уязвимости атакующие могут:

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

Почему бы просто не обновиться до Newtonsoft.Json 13.0.1?

Общедоступное исправление требует обновления до версии 13.0.1. Однако обновление major версий часто влечёт:

  • Критические изменения API в поведении сериализации
  • Проблемы совместимости с другими библиотеками, ожидающими определённые версии
  • Обширные требования к тестированию всех путей сериализации/десериализации
  • Риск изменений поведения во время выполнения в production

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

Как Seal Security это исправляет

Запатченная версия от Seal (12.0.2-sp1) добавляет защиту глубины рекурсии без изменения какого-либо публичного API. Патч:

  1. Добавляет ограничения MaxDepth по умолчанию, чтобы предотвратить неограниченную рекурсию
  2. Корректно обрабатывает глубокую вложенность с помощью соответствующих исключений вместо переполнения стека
  3. Не изменяет никакой публичный API — существующий код продолжает работать без изменений

Это та же стратегия смягчения, применённая в Newtonsoft.Json 13.0.1, перенесённая на 12.0.2 в качестве замены «на лету».


Другие уязвимые зависимости

Эта демонстрация также включает другие уязвимые пакеты NuGet, которые Seal Security может исправить:

log4net 2.0.5 - CVE-2018-1285 (CVSS 9.8 CRITICAL)

Уязвимость внешней XML-сущности (XXE) в разборе XML-конфигурации log4net. Атакующий, который может управлять файлом конфигурации log4net, может:

  • Читать произвольные файлы с сервера
  • Выполнять подделку запросов на стороне сервера (SSRF)
  • Вызвать отказ в обслуживании

Примечание по System.Net.Http: Каноническое демо для net9 также содержит ссылку на уязвимый System.Net.Http 4.3.0 для CVE-2017-0249. Мы опустили его в этом форке для net7, потому что в .NET 7 System.Net.Http является частью BCL, и отдельная ссылка на пакет — это рудиментарный мета-пакет; у него известные крайние случаи с dotnet add package --source <local-nupkg>, что именно так CLI Seal применяет запатченные версии. Удаление его делает шаг seal fix надёжным без изменения истории демонстрации (HttpClient всё равно работает; среда выполнения предоставляет его).


Предварительные требования

  • .NET 7.0 SDK (загрузить с Microsoft)
  • Seal Security CLI v0.3.238 для Windows x64 (прямая загрузка)

    Двоичные файлы CLI для Windows были прекращены после v0.3.238. v0.3.238 полностью функционален для исправления NuGet в Windows.

  • Токен Seal Security (из панели управления Seal)

Подробное руководство по установке и запуску на Windows Server находится в README-WINDOWS-SERVER.md. Краткое руководство ниже охватывает те же шаги в сжатой форме.


Краткое руководство (локальный Windows Server)

1. Установите переменные окружения

PowerShell:

root@kitploit:~
$env:SEAL_TOKEN = "ваш-токен-seal-здесь"
$env:SEAL_PROJECT = "nuget-demo-net7"

2. Запустите уязвимое приложение (до Seal)

root@kitploit:~
cd seal-security-nuget-demo-net7

# Восстановление (загружает из nuget.org и фида Seal — см. nuget.config)
dotnet restore

# Сборка и запуск
dotnet build
dotnet run

Откройте http://localhost:5000 — приложение работает с уязвимыми зависимостями.

Проверка с нормальным вводом

Введите alice в поле имени, нажмите Go. Вы должны увидеть: «Welcome, alice!»

Проверка с эксплойтом

Вставьте следующий URL в поле имени и нажмите Go:

root@kitploit:~
https://raw.githubusercontent.com/seal-sec-demo-2/json-payload/main/payload.json

Результат без патча: Браузер показывает ошибку / сброс соединения — приложение упало с StackOverflowException в JsonSerializerInternalReader.CreateValueInternal. Процесс мёртв.

3. Примените исправление Seal Security

root@kitploit:~
# (Необязательно — уже сделано выше) Сначала восстановите зависимости
dotnet restore

# Запустите CLI Seal для исправления уязвимостей
seal fix . --mode remote -v

# Восстановите снова, чтобы получить запатченные версии
dotnet restore

# Соберите и запустите запатченное приложение
dotnet build
dotnet run

Теперь приложение использует запатченные версии (Newtonsoft.Json 12.0.2-sp1, log4net 2.0.5-sp1).

Результат с патчем: Вставьте тот же URL эксплойта → страница показывает «Blocked by Seal patch: MaxDepth of 64 has been exceeded.» — запатченный лимит рекурсии Newtonsoft.Json отклонил глубокую полезную нагрузку. Сервер продолжает нормальную работу.

4. Проверьте запатченные версии

root@kitploit:~
dotnet list package

Вы должны увидеть пакеты с суффиксом -sp1, указывающим на патчи Seal Security.


Интеграция с Seal Security CLI

Золотое правило

Шаг CLI должен быть добавлен сразу после установки зависимостей, но до финальной сборки.

root@kitploit:~
# 1. Восстановление зависимостей
dotnet restore

# 2. <--- Запустите Seal CLI здесь
$env:SEAL_TOKEN = "ваш-токен-seal-здесь"
$env:SEAL_PROJECT = "nuget-demo-net7"
seal fix . --mode remote -v

# 3. Восстановите снова (чтобы получить запатченные версии)
dotnet restore

# 4. Сборка
dotnet build

Режимы исправления

РежимОписание
allАвтоматически применить все доступные исправления
remoteПрименять только исправления, одобренные в интерфейсе Seal
localПрименять только исправления, определённые в .seal-actions.yml

.seal-actions.yml в этом репозитории уже перечисляет три запатченных переопределения для режима local, поэтому seal fix . --mode local -v работает офлайн (всё ещё требуется токен для сервера артефактов).


Настройка сервера артефактов

Настройка nuget.config

nuget.config предварительно настроен на использование Seal Security с переменными окружения:

root@kitploit:~
<configuration>
  <packageSources>
    <add key="Seal" value="https://nuget.sealsecurity.io/v3/index.json" />
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
  </packageSources>
  <packageSourceCredentials>
    <Seal>
      <add key="Username" value="%SEAL_PROJECT%" />
      <add key="ClearTextPassword" value="%SEAL_TOKEN%" />
    </Seal>
  </packageSourceCredentials>
</configuration>

Требуемые переменные окружения

ПеременнаяОписание
SEAL_TOKENВаш токен доступа Seal Security
SEAL_PROJECTID проекта (например, nuget-demo-net7)

Белый список сети (для ограниченных сред)

CLI Seal нуждается в исходящем HTTPS (TCP 443) к:

  • cli.sealsecurity.io — сканирование / конфигурация исправления
  • authorization.sealsecurity.io — проверка токена
  • nuget.sealsecurity.io — загрузка запатченных .nupkg
  • d2zko6i8myndc4.cloudfront.net — CDN, обслуживающая фактические запатченные артефакты (имена хостов .sealsecurity.io перенаправляют сюда)
  • api.nuget.org / стандартные конечные точки nuget.org — для незапатченных зависимостей

Проверьте из PowerShell после открытия брандмауэра:

root@kitploit:~
Test-NetConnection cli.sealsecurity.io -Port 443
Test-NetConnection authorization.sealsecurity.io -Port 443
Test-NetConnection nuget.sealsecurity.io -Port 443
Test-NetConnection d2zko6i8myndc4.cloudfront.net -Port 443

Все должны сообщать TcpTestSucceeded: True.


Примечания, специфичные для .NET 7


Ключевые моменты для демонстрации

  • Нет изменений кода — код приложения идентичен незапатченной версии. Заменена только версия пакета NuGet.
  • Тот же API — 12.0.2-sp1 является двоично-совместимой заменой 12.0.2.
  • Ориентирован на реальный стек заказчика — net7.0, а не net9.0. Не требуется обновление SDK.
  • Эшелонированная защита — защищает все пути кода, включая транзитивные зависимости.
  • Открытые патчи — все патчи являются открытым исходным кодом и подлежат аудиту.
  • EOL .NET всё ещё получает патчи — это основная ценность: Microsoft больше не выпускает обновления безопасности для .NET 7, но Seal поддерживает безопасность существующей поверхности зависимостей заказчика.

Доступные запатченные пакеты NuGet

Пакеты, используемые в этой демонстрации:

ПакетУязвимая версияЗапатченная версияCVECVSS

Другие запатченные пакеты NuGet, доступные из фида Seal (не в этой демонстрации, перечислены для справки):


Лицензия

Лицензия MIT — см. файл LICENSE для подробностей.

Скачать инструмент
ЭлементПочему это важно
global.json фиксирует SDK на 7.0.x с rollForward: latestFeatureПредотвращает автоматическое переключение SDK на net8/net9 на машинах с несколькими установленными SDK во время демонстрации.
System.Configuration.ConfigurationManager зафиксирован на 7.0.0Каноническое демо для net9 использует 8.0.0, который предназначен только для net8 и не восстанавливается на net7. 7.0.0 имеет ту же поверхность API, которая нужна log4net.
NU1701 подавлено в csprojlog4net 2.0.5 рекламирует устаревший TFM net4x, который .NET 7 принимает во время выполнения, но предупреждает во время восстановления. Предупреждение косметическое; подавление сохраняет чистый вывод сборки во время демонстрации.
Seal CLI v0.3.238 для Windows x64Последний выпуск с двоичным файлом для Windows; полностью функционален для исправления NuGet. Двоичные файлы для Windows были прекращены после этой версии, поэтому не предлагайте более новую версию.
Newtonsoft.Json12.0.212.0.2-sp1CVE-2024-219077.5 HIGH
log4net2.0.52.0.5-sp1CVE-2018-12859.8 CRITICAL
ПакетУязвимая версияЗапатченная версияCVECVSS
log4net2.0.02.0.0-sp1CVE-2018-12859.8 CRITICAL
System.Net.Http4.3.04.3.0-sp1CVE-2017-02497.3 HIGH
Snappier1.1.01.1.0-sp1CVE-2023-286387.0 HIGH
jQuery.Validation1.17.01.17.0-sp1CVE-2021-212527.5 HIGH