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/isecuritytw/seal-security-nuget-demo-net7
Анализ уязвимостейDevSecOpsБезопасность Цепочки ПоставокОбучение и ОбразованиеПодобранные Ресурсы
GitHubisecuritytw/seal-security-nuget-demo-net7

seal-security-nuget-demo-net7

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

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

Популярное

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

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

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

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

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

Демо для браузера + CLI (NuGet/C#) — редакция .NET 7

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

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

Он существует потому, что большинство корпоративных заказчиков не могут перейти на новейший .NET SDK по требованию. .NET 7 достиг конца поддержки 14 мая 2024 года, но реальные производственные среды всё ещё работают на нём по причинам совместимости, сертификации или эксплуатации. Именно для этого и создан Seal Security: когда заказчик не может (или не хочет) делать мажорное обновление версии, 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 патчит уязвимость на месте без необходимости мажорного обновления версии.


Уязвимость: 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. Однако обновление мажорных версий часто вносит:

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

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

Как 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)
  • CLI Seal Security 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 = "your-seal-token-here"
$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.


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

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

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

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

# 2. <--- Запустите CLI Seal здесь
$env:SEAL_TOKEN = "your-seal-token-here"
$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_PROJECTИдентификатор проекта (например, 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

ЭлементПочему это важно
global.json фиксирует SDK на 7.0.x с rollForward: latestFeatureОстанавливает машины с параллельными 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 принимает в рантайме, но предупреждает при восстановлении. Предупреждение косметическое; подавление сохраняет чистый вывод сборки во время демонстрации.
CLI Seal v0.3.238 для Windows x64Последний выпуск с двоичным файлом для Windows; полностью функционален для устранения проблем NuGet. Двоичные файлы для Windows были прекращены после этой версии, поэтому не предлагайте более новый выпуск.

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

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

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

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

ПакетУязвимая версияЗапатченная версияCVECVSS
Newtonsoft.Json12.0.212.0.2-sp1CVE-2024-219077.5 HIGH
log4net2.0.52.0.5-sp1CVE-2018-12859.8 CRITICAL

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

ПакетУязвимая версияЗапатченная версия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

Лицензия

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

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