Vào ngày 13 tháng 8 năm 2025, cộng đồng an ninh mạng toàn cầu đã ghi nhận sự công bố của một lỗ hổng DoS nghiêm trọng, ảnh hưởng đến nhiều máy chủ web sử dụng giao thức HTTP/2. Lỗ hổng này, được đặt tên là "MadeYouReset" và định danh bằng mã CVE-2025-8671, được phát hiện bởi các nhà nghiên cứu từ Đại học Tel Aviv và công ty bảo mật Imperva. Với điểm CVSS 3.1 là 7.5 (Mức độ Cao), lỗ hổng này phản ánh một rủi ro đáng kể do độ phức tạp tấn công thấp nhưng lại gây tác động lớn đến tính sẵn sàng của dịch vụ. Điều quan trọng cần nhấn mạnh là MadeYouReset không phải là một khiếm khuyết trong bản thân đặc tả giao thức HTTP/2, mà là một điểm yếu phổ biến trong cách các nhà cung cấp phần mềm triển khai logic quản lý trạng thái của giao thức.
Cơ chế cốt lõi
HTTP/2 được thiết kế để khắc phục những hạn chế về hiệu suất của HTTP/1.1. Tính năng cốt lõi của nó là multiplexing, cho phép nhiều yêu cầu và phản hồi được gửi đồng thời qua một kết nối TCP duy nhất. Mỗi cặp yêu cầu-phản hồi này được thực hiện trong một luồng stream logic độc lập. Dữ liệu được truyền đi dưới dạng các frame. Cách tiếp cận này loại bỏ vấn đề "head-of-line blocking" của HTTP/1.1 và cải thiện đáng kể hiệu quả sử dụng kết nối mạng.


Một tính năng quan trọng khác của HTTP/2 là khả năng hủy luồng. Cả client và server đều có thể gửi một frame RST_STREAM bất kỳ lúc nào để hủy bỏ một luồng cụ thể mà không cần đóng toàn bộ kết nối TCP. Chức năng này rất hữu ích, ví dụ, khi người dùng điều hướng ra khỏi một trang trước khi nó tải xong, client có thể hủy các luồng không cần thiết để tiết kiệm băng thông và tài nguyên.

Cơ chế tấn công của MadeYouReset dựa trên những nền tảng kiến thức trên, và bắt nguồn từ một sự khác biệt nguy hiểm trong cách nhiều máy chủ xử lý việc hủy luồng, kẻ tấn công gửi các frame HTTP/2 được chế tạo đặc biệt nhưng vẫn hợp lệ về mặt cú pháp để "lừa" máy chủ tự reset các luồng stream của chính nó. Hành động này tạo ra một sự mất đồng bộ nghiêm trọng giữa hai lớp quản lý tài nguyên của máy chủ: lớp giao thức và lớp ứng dụng backend. Ở lớp giao thức, máy chủ ghi nhận rằng luồng đã được đóng và giải phóng, cho phép kẻ tấn công mở thêm các luồng mới mà không vi phạm giới hạn số luồng đồng thời (MAX_CONCURRENT_STREAMS). Tuy nhiên, ở lớp ứng dụng, tiến trình backend vẫn tiếp tục xử lý yêu cầu ban đầu, tiêu tốn tài nguyên CPU và bộ nhớ một cách vô ích vì kết quả sẽ không bao giờ được gửi đi. Bằng cách lặp lại quy trình này, kẻ tấn công có thể buộc máy chủ xử lý một số lượng yêu cầu không giới hạn chỉ trên một kết nối TCP duy nhất, dẫn đến cạn kiệt tài nguyên và gây ra tình trạng từ chối dịch vụ hoàn toàn.

MadeYouReset được xem là một bước tiến hóa chiến thuật từ cuộc tấn công "Rapid Reset" (CVE-2023-44487) khét tiếng năm 2023. Nếu Rapid Reset dựa vào việc client chủ động gửi một loạt các frame RST_STREAM để hủy các luồng vừa mở, thì MadeYouReset lại có phương thức hoạt động lén lút hơn nhiều. Kẻ tấn công không trực tiếp gửi frame RST_STREAM, mà thay vào đó, gửi các frame điều khiển khác (như WINDOW_UPDATE hoặc PRIORITY) nhằm gây ra lỗi giao thức ở phía máy chủ. Theo đặc tả HTTP/2, máy chủ buộc phải phản ứng với lỗi này bằng cách tự mình gửi đi frame RST_STREAM để hủy luồng bị lỗi. Sự thay đổi này có ý nghĩa rất lớn đối với việc phòng thủ, vì sau cuộc tấn công Rapid Reset, nhiều tổ chức đã triển khai các biện pháp giảm thiểu tập trung vào việc theo dõi và rate-limiting các frame RST_STREAM đến từ client. Tuy nhiên, MadeYouReset hoàn toàn vô hiệu hóa cơ chế phòng thủ này. Đối với một hệ thống WAF hay IDS/IPS, lưu lượng từ client trông hoàn toàn bình thường. Thay vào đó, chính máy chủ lại là nguồn phát sinh các frame reset. Điều này làm cho việc phát hiện cuộc tấn công trở nên khó khăn hơn nhiều, đòi hỏi phải phân tích sâu hơn về hành vi và trạng thái của kết nối thay vì chỉ đếm các loại frame cụ thể.

Tính năng | Rapid Reset (CVE-2023-44487) | MadeYouReset (CVE-2025-8671) |
Nguồn gốc Reset | Client gửi frame RST_STREAM | Client gửi các frame gây lỗi, buộc Server phải gửi RST_STREAM |
Dấu hiệu Tấn công | Lưu lượng lớn các frame RST_STREAM từ một client | Lưu lượng lớn các frame RST_STREAM từ server, cùng với các lỗi giao thức |
Khả năng Phát hiện | Tương đối dễ phát hiện bằng cách rate-limit RST_STREAM từ client | Khó phát hiện hơn, có thể hòa lẫn với lưu lượng hợp lệ |
Vượt qua Biện pháp Giảm thiểu | Bị chặn bởi các biện pháp phòng thủ Rapid Reset cơ bản | Vượt qua các biện pháp phòng thủ chỉ tập trung vào RST_STREAM từ client |
Các Frame gây lỗi
Các nhà nghiên cứu đã xác định một số phương thức kích hoạt reset từ phía máy chủ mà kẻ tấn công có thể lợi dụng; mỗi phương thức này khai thác một quy tắc cụ thể trong đặc tả HTTP/2:
Kẻ tấn công gửi frame WINDOW_UPDATE với trường window_size_increment = 0. Theo RFC 7540, một WINDOW_UPDATE có mức tăng bằng 0 phải được xử lý như một lỗi kết nối kiểu PROTOCOL_ERROR, dẫn đến việc máy chủ hủy luồng hoặc đóng kết nối.
Kẻ tấn công gửi WINDOW_UPDATE với một giá trị tăng lớn, sao cho tổng kích thước cửa sổ sau khi cộng vượt quá giới hạn tối đa 2^31−1. Tình huống này là một lỗi giao thức và phải được xử lý bằng cách gửi RST_STREAM.
Đặc tả yêu cầu frame PRIORITY phải có độ dài đúng 5 octet. Nếu kẻ tấn công gửi PRIORITY với độ dài khác 5, đây là lỗi định dạng frame (framing error) và máy chủ cần reset luồng tương ứng.
Nếu một PRIORITY frame khai báo rằng một luồng phụ thuộc vào chính nó, đó là một lỗi logic theo quy định của giao thức và phải gây ra lỗi giao thức, dẫn đến reset luồng.
Khi client đã gửi frame HEADERS hoặc DATA với cờ END_STREAM, luồng chuyển sang trạng thái half-closed (remote). Nếu client tiếp tục gửi HEADERS hoặc DATA trên cùng luồng đó sau khi đã kết thúc phần gửi, đây là vi phạm giao thức và máy chủ phải trả lời bằng RST_STREAM với mã lỗi STREAM_CLOSED.
Minh họa khai thác
Thiết lập Môi trường Lab
Môi trường được dựng cô lập và an toàn bằng Docker trên một máy duy nhất:


Kịch bản Tấn công
Sử dụng một kịch bản Script Python tấn công song song.
- Tự động phát hiện số nhân CPU của máy tấn công và tạo ra một số lượng tiến trình "công nhân" (worker processes) tương ứng. Mỗi tiến trình hoạt động độc lập và đồng thời.
Mỗi "công nhân" chạy một vòng lặp vô tận, liên tục kết nối và tấn công máy chủ, đảm bảo tạo ra một luồng yêu cầu lỗi không ngừng nghỉ.
if __name__ == "__main__": try: num_workers = cpu_count() print(f"[*]{TARGET_IP}:{TARGET_PORT}") with Pool(processes=num_workers) as pool: pool.map(attack_worker, range(num_workers)) except KeyboardInterrupt:
- Mỗi tiến trình thực hiện một chuỗi các hành động sau:
- Thiết lập Kết nối: Chủ động tạo một kết nối TCP tiêu chuẩn đến máy chủ mục tiêu trên cổng đã định.
- Bắt tay HTTP/2: Sau khi kết nối TCP được thiết lập, kịch bản gửi đi chuỗi Connection Preface (hay còn gọi là "magic string") và một frame SETTINGS ban đầu. Thao tác này để "thuyết phục" máy chủ rằng đây là một kết nối HTTP/2 hợp lệ.
- Vòng lặp Khai thác: Bên trong kết nối HTTP/2, kịch bản thực hiện một vòng lặp nhỏ hơn để liên tục khai thác lỗ hổng:
- Mở luồng mới: Gửi một frame HEADERS hợp lệ để yêu cầu máy chủ mở một luồng (stream) mới.
Kích hoạt Lỗ hổng: Ngay lập tức, gửi một frame WINDOW_UPDATE được chế tạo đặc biệt trên chính luồng vừa mở. Frame này chứa giá trị vi phạm giao thức: window_size_increment = 0
while True: headers_list = [ (b':method', b'GET'), (b':path', b'/'), (b':scheme', b'http'), (b':authority', b'localhost'), ] headers_frame = H2Frame(stream_id=stream_id) / H2HeadersFrame(headers=headers_list) sock.send(bytes(headers_frame)) malicious_frame = H2Frame(stream_id=stream_id) / H2WindowUpdateFrame(window_size_increment=0) sock.send(bytes(malicious_frame)) stream_id += 2
Hành động này buộc máy chủ phải xử lý một lỗi nghiêm trọng ở tầng giao thức. Khi máy chủ phản ứng lại bằng cách đóng kết nối (gây ra lỗi Broken pipe hoặc Connection Reset), tiến trình sẽ tự động bắt lỗi này, đóng kết nối cũ và ngay lập tức quay lại bước 1 để tạo một kết nối mới và tiếp tục tấn công.
Thực thi và Quan sát Tấn công



Phạm vi ảnh hưởng
Lỗ hổng MadeYouReset không giới hạn ở một nhà cung cấp cụ thể mà ảnh hưởng đến một loạt các máy chủ web, proxy ngược, và thư viện HTTP/2 phổ biến. Thậm chí đến thời điểm hiện tại, các bên bị ảnh hưởng bởi lỗ hổng này vẫn đang được cập nhật.
Nhà cung cấp | Sản phẩm | Phiên bản bị ảnh hưởng | Phiên bản đã vá |
Varnish Cache | Varnish Cache | 6.0 LTS đến 6.0.14, 7.x đến 7.7.1 | 6.0.16, 7.6.5, 7.7.3 |
Varnish Cache | Varnish Enterprise | 6.0.x đến 6.0.14r4 | 6.0.14r5 |
SUSE | SUSE Linux Enterprise Server | 12 SP5 đến trước 15 SP7 (và các module liên quan) | Cập nhật qua các kênh bảo mật của SUSE |
SUSE | openSUSE Leap | 15.6 | Cập nhật qua các kênh bảo mật của SUSE |
Apache | Apache Tomcat | 9.0.0.M1 - 9.0.107, 10.1.0-M1 - 10.1.43, 11.0.0-M1 - 11.0.9 | 9.0.108, 10.1.44, 11.0.10 |
F5 | F5 BIG-IP | 16.x, 17.x (xem chi tiết trong advisory của F5) | Các bản vá được cung cấp bởi F5 |
Netty | Netty Framework | Trước 4.1.124.Final và 4.2.4.Final | 4.1.124.Final, 4.2.4.Final |
Wind River | Wind River Linux | LTS22 đến LTS25 | Các bản vá được cung cấp bởi Wind River |
Fastly | H2O (internal fork) | Trước phiên bản 25.17 | 25.17 |
Rust | h2 library | Trước 0.4.11 | 0.4.11 |
Phát hiện và giảm thiểu
Việc phát hiện MadeYouReset đòi hỏi một cách tiếp cận tinh vi hơn so với Rapid Reset. Thay vì chỉ đếm các frame RST_STREAM từ client, các hệ thống giám sát cần tìm kiếm các dấu hiệu bất thường khác:
- Tỷ lệ cao các frame RST_STREAM do máy chủ tạo ra: Một sự gia tăng đột biến của các frame reset có nguồn gốc từ máy chủ là chỉ báo mạnh mẽ nhất.
- Tương quan với Lỗi Giao thức: Các frame reset này thường đi kèm với mã lỗi PROTOCOL_ERROR hoặc STREAM_CLOSED. Cần theo dõi các sự kiện GOAWAY với mã lỗi PROTOCOL_ERROR trên toàn bộ kết nối.
- Hành vi trên mỗi Kết nối: Cuộc tấn công này cho phép tạo ra một lượng lớn yêu cầu trên một kết nối TCP duy nhất. Việc theo dõi số lượng yêu cầu trên mỗi kết nối và cảnh báo khi nó vượt quá một ngưỡng bất thường có thể giúp phát hiện cuộc tấn công.
Trong trường hợp một cuộc tấn công đang diễn ra và chưa thể cập nhật bản vá ngay lập tức, có thể áp dụng các biện pháp tạm thời (Không khuyến nghị):
- Tắt HTTP/2: Biện pháp hiệu quả nhất là tạm thời vô hiệu hóa HTTP/2 trên các máy chủ bị ảnh hưởng và quay trở lại sử dụng HTTP/1.1. Điều này sẽ loại bỏ hoàn toàn vector tấn công.
- Giới hạn Tỷ lệ Lỗi Giao thức: Triển khai các quy tắc trên tường lửa ứng dụng web (WAF) hoặc proxy ngược để giới hạn số lượng lỗi giao thức mà một kết nối hoặc một địa chỉ IP có thể tạo ra trong một khoảng thời gian nhất định. Nếu vượt ngưỡng, kết nối đó sẽ bị chấm dứt.
Phương án khắc phục triệt để:
- Cập nhật Bản vá.
- Nhiều nhà cung cấp đã triển khai các biện pháp giảm thiểu mạnh mẽ sau cuộc tấn công Rapid Reset, không chỉ dựa trên việc đếm frame reset từ client mà còn dựa trên việc phân tích hành vi và sức khỏe tổng thể của kết nối. Các biện pháp này thường cũng có hiệu quả chống lại MadeYouReset.
Blue Team Checklist:
MadeYouReset không chỉ là một lỗ hổng kỹ thuật, mà còn là bài học về bản chất an ninh mạng hiện đại. Nó cho thấy an ninh giao thức không chỉ dựa vào đặc tả, mà còn phụ thuộc vào việc triển khai cẩn trọng. Một cơ chế được thiết kế để tăng hiệu quả, như hủy luồng trong HTTP/2, có thể biến thành vector tấn công nếu bỏ qua tác động phụ như quản lý tài nguyên. Lỗ hổng này cũng phản ánh sự thích ứng của kẻ tấn công: luôn đổi mới để vượt qua phòng thủ. Ngược lại, việc các biện pháp giảm thiểu cho Rapid Reset cũng chặn được MadeYouReset chứng minh giá trị của phòng thủ theo chiều sâu. Thay vì chỉ tập trung vào một chỉ số, những giới hạn chặt chẽ hơn về luồng và sức khỏe kết nối đã tỏ ra hiệu quả hơn. Bảo mật vì thế đòi hỏi cái nhìn toàn diện về hành vi hệ thống, không chỉ là danh sách các mẫu tấn công.
Reference
- CVE-2025-8671 Impact, Exploitability, and Mitigation Steps - Wiz:
https://www.wiz.io/vulnerability-database/cve/cve-2025-8671 - CVE-2025-8671 – HTTP/2 MadeYouReset Vulnerability DDoS Attack - CYFIRMA:
https://www.cyfirma.com/research/cve-2025-8671-http-2-madeyoureset-vulnerability-ddos-attack/ - CVE-2025-8671 Common Vulnerabilities and Exposures - SUSE:
https://www.suse.com/security/cve/CVE-2025-8671.html - CVE-2025-8671 | Ubuntu: https://ubuntu.com/security/CVE-2025-8671
- MadeYouReset: Turning HTTP/2 Server Against Itself | Imperva:
https://www.imperva.com/blog/madeyoureset-turning-http-2-server-against-itself/ - MadeYouReset: New HTTP/2 DoS Vulnerability Explained - SOCRadar Cyber Intelligence Inc:
https://socradar.io/madeyoureset-new-http-2-dos-vulnerability-explained/ - How it works: The novel HTTP/2 'Rapid Reset' DDoS attack | Google Cloud Blog:
https://cloud.google.com/blog/products/identity-security/how-it-works-the-novel-http2-rapid-reset-ddos-attack - How HTTP/2 Works and How to Enable It in Go - VictoriaMetrics:
https://victoriametrics.com/blog/go-http2/ - New MadeYouReset Exploit Bypasses HTTP/2 DoS Protections - SecPod Blog:
https://www.secpod.com/blog/new-madeyoureset-exploit-bypasses-http-2-dos-protections/ - VSV00017 Varnish HTTP/2 Made You Reset Attack: https://varnish-cache.org/security/VSV00017.html
- HTTP/2 Rapid Reset: deconstructing the record-breaking attack:
https://blog.cloudflare.com/technical-breakdown-http2-rapid-reset-ddos-attack