تحقیقات جدید نشان داده است که فریم CONTINUATION در پروتکل HTTP/2 میتواند برای انجام حملات انکار سرویس (DoS) مورد سوء استفاده قرار گیرد. این تکنیک توسط محقق امنیتی بارتک نووتارسکی (Bartek Nowotarski) که موضوع را در بیست وپنجم ژانویه ۲۰۲۴ به مرکز هماهنگی CERT (CERT/CC) گزارش کرد، با کد HTTP/2 CONTINUATION Flood نامگذاری شده است.
CERT/CC طی توصیهای در سوم آوریل 2024 اعلام کرد که بسیاری از پیادهسازیهای پروتکل HTTP/2 میزان فریمهای CONTINUATION ارسال شده در یک جریان (stream) را به درستی محدود یا پاکسازی نمیکنند.
مهاجمی که میتواند بستهها را به یک سرور هدف بفرستد، قادر است جریانی از فریمهای CONTINUATION را ارسال کند که به فهرست هدر در حافظه اضافه نمیشوند، اما همچنان توسط سرور پردازش و رمزگشایی میگردند و یا با اضافه شدن به لیست هدر، منجر به کرش کردن حافظه (OOM) میشوند.
پروتکل HTTP/2 مانند HTTP/1، از فیلدهای هدر در درخواست ها و پاسخ ها استفاده میکند. این فیلدهای هدر میتوانند شامل لیست های هدر باشند که به نوبه خود به صورت سریالی و تقسیم شده به بلوک های هدر (header blocks) هستند. بلوکهای هدر سپس به قطعات بلوک (block fragments) تقسیم میگردند و در HEADERS یا آنچه که فریمهای CONTINUATION نامیده میشود، انتقال مییابند.
در مستندات RFC 7540 آمده است: “فریم CONTINUATION (نوع=0x9) برای ادامه دنبالهای از قطعات بلوک هدر استفاده میشود”.
“هر تعداد فریم CONTINUATION قابل ارسال است، تا زمانی که فریم قبلی در همان جریان (stream) باشد و یک فریم HEADERS، PUSH_PROMISE یا CONTINUATION بدون مجموعه فلگ END_HEADERS تنظیم گردد”.
آخرین فریم، حاوی هدر دارای فلگ END_HEADERS است که به endpoint راه دور نشان میدهد که انتهای بلوک هدر میباشد.
طبق اظهارات نووتارسکی، CONTINUATION Flood یک کلاس از آسیبپذیریها در چندین پیادهسازی پروتکل HTTP/2 قرار دارد که در مقایسه با حمله بازنشانی سریع که در دهم اکتبر 2023 افشا گردید، تهدیدی جدیتر میباشد.
یک ماشین (و در موارد خاص، تنها یک اتصال TCP یا تعداد انگشت شماری فریم) این پتانسیل را دارد که در دسترس بودن سرور را با پیامدهایی از خرابی سرور گرفته تا کاهش قابل توجه عملکرد، مختل سازد. درخواستهایی که حمله را تشکیل میدهند در لاگهای دسترسی HTTP قابل مشاهده نیستند.
این آسیبپذیری، در هسته خود، مربوط به مدیریت نادرست HEADERS و چندین فریم CONTINUATION است که راه را برای یک وضعیت DoS هموار میکند.
یک مهاجم به عبارت دیگر، میتواند با استفاده از یک پیادهسازی آسیبپذیر، جریان HTTP/2 جدیدی را علیه سرور هدف راهاندازی کند و فریمهای HEADERS و CONTINUATION را بدون فلگ END_HEADERS تنظیم شده ارسال نماید و یک جریان بیپایان از هدرها ایجاد کند که سرور HTTP/2 برای تجزیه و ذخیره در حافظه به آن نیاز دارد.
نتیجه دقیق با توجه به اجرا، متفاوت است؛ چرا که تأثیرات آن از خرابی فوری پس از ارسال چند فریم HTTP/2 و از کار افتادن حافظه تا اتمام CPU متغیر میباشد که در نتیجه بر در دسترس بودن سرور تأثیر میگذارد. RFC 9113 […] مسائل امنیتی متعددی را ذکر میکند که ممکن است در صورت عدم استفاده صحیح از فریمهای CONTINUATION ایجاد شوند و در عین حال، در صورت ارسال فریمهای CONTINUATION بدون فلگ نهایی END_HEADERS، میتواند پیامدهای جدی بر روی سرورهای آسیب پذیر به دنبال داشته باشد.
این پیادهسازیها همانطور که در ادامه توضیح داده شده است، سطوح مختلفی از حملات انکار سرویس از جمله نشت حافظه، مصرف حافظه و فرسودگی CPU را به دنبال دارند:
- CVE-2024-27983: این آسیب پذیری بر سرور js HTTP/2 تأثیر میگذارد. ارسال چند فریم HTTP/2 میتواند باعث نشت حافظه به دلیل race condition (شرایط مسابقه) شود که منجر به DoS بالقوه میگردد.
- CVE-2024-27919: بر کدک oghttp Envoy تأثیر میگذارد. مصرف نامحدود حافظه به دلیل عدم تنظیم مجدد درخواست در صورت تجاوز از محدودیتهای header map، از جمله پیامدهای آن است.
- CVE-2024-2758: مربوط به Tempesta FW میباشد. محدودیتهای نرخ آن به طور مؤثری از حملات فریمهای خالی CONTINUATION جلوگیری نمیکند و منجر به DoS میشود.
- CVE-2024-2653: این آسیب پذیری، amphp/http را تحت تأثیر قرار میدهد. فریمهای CONTINUATION را در یک بافر نامحدود جمعآوری میکند و در صورت تجاوز از حد اندازه هدر، احتمال کرش کردن OOM وجود دارد.
- CVE-2023-45288: این آسیب پذیری بر پکیجهای net/http و net/http2 Go تأثیر میگذارد و به مهاجم اجازه میدهد تا مجموعهای از هدرها را بهطور دلخواه ارسال کند که باعث مصرف بیش از حد CPU میگردد.
- CVE-2024-28182: این آسیب پذیری شامل پیاده سازی با استفاده از کتابخانه nghttp2 است که همچنان به دریافت فریم های CONTINUATION ادامه میدهد و منجر به یک DoS بدون بازنشانی جریان مناسب میشود.
- CVE-2024-27316: این آسیب پذیری Httpd Apacheرا تحت تأثیر قرار میدهد. جریان پیوسته فریمهای CONTINUATION بدون مجموعه فلگ END_HEADERS میتوانند ارسال شوند و درخواستها بهطور نامناسب خاتمه یابند.
- CVE-2024-31309: این آسیب پذیری بر سرور ترافیک آپاچی تأثیر میگذارد. HTTP/2 Continuation حمله DoS میتواند باعث مصرف بیش از حد منابع در سرور شود.
- CVE-2024-30255: بر نسخه های Envoy 1.29.2 یا قبل از آن تأثیر میگذارد و آسیب پذیر به فرسودگی CPU به دلیل سیل فریم های CONTINUATION است که منابع قابل توجهی از سرور را مصرف میکند.
تاکنون، طبق گفته CERT-CC، فروشندگان و کتابخانههای HTTP/2 متعلق به Red Hat، SUSE Linux، Arista Networks، Apache HTTP Server Project، nghttp2، Node.js. ، AMPHP و زبان برنامه نویسی Go تأیید کردهاند که تحت تأثیر حداقل یکی از CVEهای فوق قرار گرفتهاند.
با توجه به اینکه Cloudflare دادههای ترافیک HTTP را بیش از 70 درصد کل انتقال اینترنت و اهمیت پروژههای تحت تأثیر تخمین میزند، معتقدیم که میتوان فرض کرد که بخش بزرگی از اینترنت تحت تأثیر یک آسیبپذیری ساده برای بهرهبرداری قرار گرفته است. در بسیاری از موارد فقط یک TCP منفرد. نووتارسکی هشدار داد که اتصال کافی بود تا سرور از کار بیفتد. در بسیاری از موارد فقط یک اتصال TCP برای از کار انداختن سرور کافی بود.
به کاربران توصیه میشود برای کاهش تهدیدات احتمالی، نرم افزار آسیب دیده را به آخرین نسخه ارتقا دهند. در صورت عدم دسترسی به نسخه به روزرسانی شده، توصیه می گردد که پروتکل HTTP/2 را به طور موقت در سرور غیرفعال کنید.