HTTP2Shell: як вада Brotli стала RCE і як це виправити
HTTP2Shell, також відомий як Node2Shell, це прізвисько CVE-2026-111497: запису за межами буфера (out-of-bounds write) у бібліотеці розпакування Brotli від Google. Виправлення вийшли 21 жовтня 2026 року. Будь-який сервіс, що автоматично декодує трафік Content-Encoding: br, можна змусити пошкодити власну пам’ять, а звідти виконати команди зловмисника.
У цьому дописі ми розбираємо ланцюжок атаки й реагування, яке справді її локалізує. Усе тут відповідає нашій безкоштовній вправі HTTP2Shell RCE, де ви граєте і за зловмисника, і за чергового платформного інженера.
Що таке HTTP2Shell?
Section titled “Що таке HTTP2Shell?”HTTP2Shell є вадою пошкодження пам’яті в декодері Brotli, а не в HTTP/2, попри назву. Зіпсований потік br змушує декодер писати за межі свого буфера. Після достатньої кількості спроб це переповнення може керувати виконанням, а не просто валити процес.
Декодер лежить під застосунком. Не потрібні ні вхід, ні форма завантаження, ні вразливий плагін. Ціллю є будь-який ендпоінт, що приймає стиснуте тіло запиту, а також будь-який вихідний запит, який декодує стиснуту відповідь.
Як працює атака HTTP2Shell?
Section titled “Як працює атака HTTP2Shell?”Експлуатація опортуністична. Зловмисники сканують сервіси на вразливих збірках і працюють із тим, що відповідає. Вправа проводить через чотири етапи на прикладі Larksend, вигаданого API для попереднього перегляду посилань і вебхуків.
- Розвідка. Звичайний запит до ендпоінта перевірки стану називає середовище виконання й фреймворк, і зловмисник розуміє, що вбудований Brotli застарілий.
- Запит. Тіло запиту, закодоване br, надходить до API. Більшість спроб лише валить воркер, як і описано в бюлетені.
- Влучання. На одній із наступних спроб переповнення виконує команду від імені процесу
node, а не валить його. - Здобич. Зловмисник читає змінні середовища процесу й забирає чинний токен розгортання, яким можна пушити в продакшн.
Цикли падінь видно одразу. Крадіжка токена не залишає слідів у журналах.
Чи достатньо заблокувати br на межі мережі, щоб зупинити HTTP2Shell?
Section titled “Чи достатньо заблокувати br на межі мережі, щоб зупинити HTTP2Shell?”Ні. Правило на межі, що відхиляє Content-Encoding: br, зупиняє вхідні тіла запитів, і це варто зробити, поки ви виправляєте. Але воно нічого не робить із відповідями, які завантажують ваші власні сервіси.
Воркер попереднього перегляду в Larksend завантажує чужі URL і декодує будь-яке стиснення, яке вони повертають. Зловмисник, що контролює один такий URL, дістається того самого декодера зсередини. Прибрати br із заголовка Accept-Encoding теж не допоможе, бо ворожий сервер однаково може надіслати br. Це та сама проблема довіри, що й у підробці запитів на боці сервера (SSRF): усе, що завантажує ваш сервіс, є вхідними даними зловмисника.
Чому виправлений системний пакет не є виправленням?
Section titled “Чому виправлений системний пакет не є виправленням?”Бо вразлива копія Brotli вбудована в середовище виконання. Node має власний Brotli, як і багато HTTP-стеків Python, контейнерних образів і апаратних рішень вендорів. У вправі apt показує виправлений libbrotli на хості, а API лишається вразливим.
Доказом є саме середовище виконання. Порівняйте node --version із виправленим релізом і перевірте версію бібліотеки всередині кожного образу воркера, а не на хості. Вправа «Компоненти з відомими вразливостями» відпрацьовує ту саму звичку інвентаризації для залежностей застосунку.
Як виправити HTTP2Shell?
Section titled “Як виправити HTTP2Shell?”Виправлення означає оновлення й повторне розгортання на кожному шляху декодування. Виправлені збірки Brotli: 1.0.10, 1.1.1 і 1.2.1.
- Оновіть кожне середовище виконання, що вбудовує Brotli. Переведіть образ API на виправлену збірку Node і підніміть версію вбудованого Brotli у воркері.
- Перезберіть і розгорніть кожну репліку. Виправлення в запущеному контейнері зникне після наступного перезапуску. Вправа «Вразливі базові образи» показує, як старе середовище виконання ховається в шарі.
- Доведіть це. Повторіть запит, який раніше валив воркер, і переконайтеся, що декодер тепер чисто його відхиляє.
Та сама пастка «встановлено не означає запущено» спіймала команди під час PHP2Shell тижнем раніше. Наш посібник із керування патчами для вразливостей нульового дня докладніше розбирає крок перевірки.
Що робити, якщо до процесу вже дісталися?
Section titled “Що робити, якщо до процесу вже дісталися?”Замініть кожен секрет, який міг прочитати цей процес. Читання пам’яті не залишає записів у журналі, тож ви не можете довести, що токен не забрали. Оновлення середовища виконання не скасовує витоку облікових даних.
У вправі це означає відкликати токен розгортання й підготувати новий. Вправа «Витік токенів доступу» показує, як замінити токен, не зламавши продакшн. Наш допис про секрети в Git і CI/CD пояснює, чому довгоживучі токени в змінних середовища збільшують радіус ураження.
Якщо персональні дані були досяжні, передайте це команді із захисту даних негайно. Відповідно до статті 33 GDPR 72-годинний відлік починається, щойно вам стало відомо про порушення.
Навіщо навчатися на реальних інцидентах на кшталт HTTP2Shell?
Section titled “Навіщо навчатися на реальних інцидентах на кшталт HTTP2Shell?”Вади бібліотек мають одну форму: залежність, про яку ніхто не думає, кожен стек, що її вбудовує, і виправлення, яке треба застосувати в багатьох місцях одночасно. Інженери, які відрепетирували визначення меж, виправлення, перевірку й заміну секретів, роблять менше помилок, коли спрацьовує тривога.
Каталог реальних інцидентів перетворює такі зломи на практичні вправи, поряд із розбором PHP2Shell RCE. Хочете, щоб ваша платформна команда відпрацювала наступну вразливість бібліотеки ще до її появи? Напишіть нам, щоб запровадити навчання на основі інцидентів.