HTTP.sys
HTTP.sys — это компонент операционной системы Windows, реализующий обработку HTTP-запросов на уровне ядра (kernel-mode). В отличие от пользовательских HTTP-стеков (например, в библиотеках .NET или IIS), HTTP.sys работает непосредственно в режиме ядра, что обеспечивает более высокую производительность, эффективное управление памятью и возможность обработки запросов до того, как они будут переданы в пользовательское приложение. HTTP.sys является частью драйверов сетевой подсистемы Windows и используется в качестве основного протокольного стека для HTTP-серверов, работающих под управлением служб IIS (Internet Information Services) и некоторых других приложений, таких как ASP.NET Core (в режиме HTTP.sys).
Архитектура и принцип работы
HTTP.sys представляет собой драйвер режима ядра (файл http.sys), который загружается при старте системы и функционирует как часть сетевой подсистемы Windows. Его основная задача — принимать входящие HTTP-запросы, разбирать их, управлять очередями запросов и передавать их в пользовательские приложения, зарегистрированные для обработки определённых URL-префиксов.
Основные компоненты
- Драйвер ядра (
http.sys) — центральный элемент, обрабатывающий все входящие HTTP-запросы. Он работает в контексте системного процессаSystemи имеет прямой доступ к сетевым стекам. - Очереди запросов (Request Queues) — каждая зарегистрированная рабочая роль (например, пул приложений IIS) создаёт очередь запросов. HTTP.sys помещает входящие запросы в соответствующую очередь, после чего приложение может их извлечь. Это позволяет изолировать обработку запросов между разными приложениями.
- Кэш ответов (HTTP Response Cache) — HTTP.sys может кэшировать ответы на уровне ядра, что позволяет обслуживать повторные запросы без переключения в пользовательский режим, значительно ускоряя отдачу статического контента.
- Пул портов (Port Sharing) — HTTP.sys позволяет нескольким приложениям прослушивать один и тот же TCP-порт (обычно 80 или 443) при условии, что они зарегистрированы на разные URL-префиксы. Это достигается за счёт того, что HTTP.sys принимает все соединения на порту и затем распределяет их по очередям на основе URL.
Процесс обработки запроса
- Сетевой стек Windows получает TCP-сегмент на порту 80 или 443.
- Драйвер
http.sysперехватывает данные и выполняет синтаксический разбор HTTP-запроса (метод, URI, заголовки). - HTTP.sys проверяет, зарегистрирован ли какой-либо процесс для обработки данного URL-префикса.
- Если регистрация найдена, запрос помещается в соответствующую очередь запросов.
- Приложение (например, рабочий процесс IIS) извлекает запрос из очереди через API
HttpReceiveHttpRequest. - После обработки приложение отправляет ответ через API
HttpSendHttpResponse, который HTTP.sys может закэшировать. - HTTP.sys отправляет ответ обратно клиенту через сетевой стек.
История и версии
HTTP.sys был впервые представлен в Windows Server 2003 и Windows XP с пакетом обновления 2 (SP2) как часть обновлённой сетевой подсистемы. Он пришёл на смену старому пользовательскому стеку HTTP, который использовался в IIS 5.0.
Основные версии
- Windows Server 2003 / Windows XP SP2 — первая реализация HTTP.sys. Включала базовую обработку запросов, очереди и кэширование.
- Windows Vista / Windows Server 2008 — добавлена поддержка SSL/TLS на уровне ядра, что позволило обрабатывать HTTPS-трафик без переключения в пользовательский режим. Расширен кэш ответов.
- Windows 7 / Windows Server 2008 R2 — улучшена производительность, добавлена поддержка протокола HTTP/1.1 (включая постоянные соединения и конвейеризацию).
- Windows 8 / Windows Server 2012 — введена поддержка протокола HTTP/2 (начиная с Windows 10 / Server 2016 — полная реализация). Улучшена работа с WebSockets.
- Windows 10 / Windows Server 2016 — добавлена поддержка HTTP/2, включая мультиплексирование и сжатие заголовков (HPACK). Улучшена обработка больших объёмов трафика.
- Windows 11 / Windows Server 2022 — поддержка HTTP/3 (на базе QUIC) на уровне ядра. Оптимизация для работы с современными веб-приложениями.
Применение
HTTP.sys является ключевым компонентом для всех веб-серверов на платформе Windows, которые используют стек HTTP на уровне ядра.
IIS (Internet Information Services)
IIS — основной потребитель HTTP.sys. Начиная с версии IIS 6.0, все запросы обрабатываются через HTTP.sys. Это позволяет IIS достигать высокой производительности и масштабируемости, особенно при обслуживании большого количества одновременных подключений.
ASP.NET Core (режим HTTP.sys)
В ASP.NET Core доступен сервер Microsoft.AspNetCore.Server.HttpSys, который напрямую использует API HTTP.sys. Этот режим позволяет создавать высокопроизводительные веб-приложения, работающие на Windows, без необходимости установки IIS. Он особенно полезен для сценариев, где требуется изоляция процессов или использование порт-шеринга.
Другие приложения
Любое приложение на Windows может использовать HTTP.sys через API HTTPAPI (HTTP Server API). Это позволяет создавать собственные HTTP-серверы, работающие на уровне ядра, без необходимости писать низкоуровневый сетевой код.
Преимущества и недостатки
Преимущества
- Высокая производительность — обработка запросов на уровне ядра снижает накладные расходы на переключение контекста и копирование данных между пользовательским и ядерным пространствами.
- Эффективное управление памятью — кэширование ответов в ядре позволяет обслуживать повторные запросы без участия пользовательского процесса.
- Порт-шеринг — несколько приложений могут слушать один порт, что упрощает развёртывание и управление.
- Встроенная поддержка SSL/TLS — обработка HTTPS на уровне ядра снижает нагрузку на приложение.
- Надёжность — сбой в пользовательском приложении не приводит к остановке обработки запросов (запросы продолжают накапливаться в очереди).
Недостатки
- Привязка к Windows — HTTP.sys доступен только в операционной системе Windows, что ограничивает кроссплатформенность.
- Сложность настройки — для продвинутой конфигурации (например, кэширования, ограничения скорости) требуется работа с системными реестрами или PowerShell.
- Потенциальные проблемы с безопасностью — ошибки в драйвере ядра могут привести к уязвимостям, затрагивающим всю систему. Примером является уязвимость CVE-2015-1635 (MS15-034), позволявшая выполнить удалённый код через HTTP.sys.
Безопасность и известные уязвимости
Как компонент, работающий в режиме ядра, HTTP.sys является критически важным для безопасности системы. За годы существования в нём были обнаружены несколько серьёзных уязвимостей.
CVE-2015-1635 (MS15-034)
Уязвимость в HTTP.sys, позволявшая удалённо выполнить код на сервере через специально сформированный HTTP-запрос. Проблема была связана с некорректной обработкой заголовка Range. Уязвимость затрагивала Windows 7, Windows Server 2008 R2, Windows 8, Windows Server 2012 и Windows 8.1. Microsoft выпустила обновление безопасности в апреле 2015 года.
Другие уязвимости
- CVE-2016-3225 — уязвимость, позволявшая повысить привилегии через HTTP.sys.
- CVE-2021-31166 — уязвимость, связанная с обработкой HTTP/2 трафика, позволявшая вызвать отказ в обслуживании или выполнить код.
Для снижения рисков рекомендуется своевременно устанавливать обновления безопасности Windows и ограничивать доступ к HTTP-серверам только доверенным сетям.
Настройка и управление
Настройка HTTP.sys осуществляется через реестр Windows и утилиту netsh. Основные параметры:
HttpPortSharing— включение/отключение порт-шеринга.MaxConnections— максимальное количество одновременных соединений.MaxEndpoints— максимальное количество зарегистрированных URL-префиксов.UrlAcl— управление списками контроля доступа (ACL) для URL-префиксов (черезnetsh http add urlacl).
Пример команды для регистрации URL-префикса: `` netsh http add urlacl url=http://+:80/MyApp user=Everyone ``
Сравнение с альтернативами
HTTP.sys vs Kestrel (ASP.NET Core)
Kestrel — кроссплатформенный HTTP-сервер на основе .NET, работающий в пользовательском режиме. В отличие от HTTP.sys, Kestrel не требует Windows и может работать на Linux и macOS. Однако HTTP.sys обеспечивает более высокую производительность на Windows за счёт работы в ядре, а также предоставляет дополнительные возможности, такие как порт-шеринг и кэширование ответов.
HTTP.sys vs Apache/Nginx
Apache и Nginx — это полноценные веб-серверы, работающие в пользовательском режиме. Они не могут напрямую использовать HTTP.sys, так как он является частью Windows. Однако на Windows Apache и Nginx могут работать через собственные сетевые стеки, что обычно менее эффективно, чем использование HTTP.sys через IIS.
Источники
- Microsoft Docs: «HTTP Server API»
- Microsoft Docs: «HTTP.sys and IIS»
- Windows Driver Kit (WDK) — документация по драйверу
http.sys - CVE-2015-1635 (MS15-034) — бюллетень безопасности Microsoft
- «Windows Internals, Part 1» (7th Edition) — Pavel Yosifovich, Mark Russinovich, David Solomon, Alex Ionescu
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →