Lỗ hổng ImageResponse nghiêm trọng trong Next.js có thể dẫn đến thực thi mã máy chủ thông qua đầu vào SVG được tạo thủ công

Một lỗ hổng bảo mật mới trong Next.js có thể cho phép kẻ tấn công chạy mã trên máy chủ thông qua ImageResponse, tính năng tạo hình ảnh Open Graph và các hình ảnh xem trước mạng xã hội khác, Vercel cho biết. Rủi ro áp dụng khi một ứng dụng đưa các giá trị do kẻ tấn công kiểm soát, chẳng hạn như văn bản đọc từ URL yêu cầu, vào hình ảnh. Vercel đã khắc phục lỗ hổng này vào ngày 22 tháng 9 trong phiên bản 16.3.6.
Lỗ hổng bảo mật Next.js
Lỗ hổng nghiêm trọng trong tính năng ImageResponse của Next.js đã được phát hiện.

Vercel cho biết một lỗ hổng bảo mật mới trong Next.js có thể cho phép kẻ tấn công thực thi mã trên máy chủ thông qua ImageResponse, tính năng tạo hình ảnh Open Graph và các hình ảnh xem trước mạng xã hội khác.

Rủi ro này phát sinh khi một ứng dụng đưa các giá trị do kẻ tấn công kiểm soát, chẳng hạn như văn bản được đọc từ URL yêu cầu, vào hình ảnh. Vercel, đơn vị phát triển Next.js, đã khắc phục lỗi này vào ngày 22 tháng 9 trong phiên bản 16.3.6.

Chi tiết về lỗ hổng CVE-2026-94545

Lỗ hổng, được theo dõi với mã CVE-2026-94545, ảnh hưởng đến các phiên bản Next.js từ 16.2.0 đến 16.3.5 khi ImageResponse chạy trên môi trường Node.js runtime (vốn được Next.js sử dụng mặc định). Khuyến cáo của Vercel xếp hạng lỗ hổng này ở mức nghiêm trọng với điểm CVSS là 9.5. Phiên bản Edge của ImageResponse không bị ảnh hưởng, và Next.js 15 cũng an toàn.

ImageResponse sử dụng Satori, một thư viện của Vercel, để chuyển đổi bố cục hình ảnh thành mã SVG trước khi tạo ra tệp PNG cuối cùng. Theo khuyến cáo, các ứng dụng bị ảnh hưởng là những ứng dụng "truyền các giá trị do kẻ tấn công kiểm soát vào nội dung, thuộc tính hoặc kiểu dáng của SVG trong quá trình tạo hình ảnh".

Ví dụ trong khuyến cáo cho thấy kẻ tấn công lấy một giá trị từ URL yêu cầu và đặt nó vào bên trong thẻ tiêu đề SVG. Tài liệu không nói rõ liệu văn bản trong các phần tử thông thường, như tiêu đề bên trong thẻ div, có bị tính hay không.

Cách xác định và khắc phục

Để tìm xem ứng dụng có sử dụng tính năng này hay không, hãy tìm các lệnh nhập ImageResponse từ next/og, ví dụ như trong các route handlers và các tệp opengraph-image. Route handlers tạo hình ảnh khi có yêu cầu đến, trong khi tệp opengraph-image có thể tạo hình ảnh tại thời điểm build hoặc khi có yêu cầu.

Tính đến ngày 23 tháng 9, The Hacker News chưa tìm thấy báo cáo công khai nào về các vụ tấn công sử dụng lỗ hổng này và cũng chưa có mã khai thác (exploit) công khai.

Bản vá chính thức là Next.js 16.3.6, phiên bản duy nhất đã được sửa lỗi, có thể cài đặt bằng lệnh npm install [email protected]. Tính đến ngày 23 tháng 9, kho lưu trữ npm không liệt kê bản phát hành cố định nào cho dòng 16.2, vì vậy các ứng dụng đang ở bản 16.2 cần chuyển sang 16.3.6. Phiên bản Next.js 15.5.26 cũng đã bổ sung thêm các biện pháp tăng cường bảo mật cho next/og trên dòng 15.5.

Nếu chưa thể nâng cấp ngay lập tức, biện pháp khắc phục tạm thời là loại bỏ các giá trị do kẻ tấn công kiểm soát khỏi nội dung, thuộc tính và kiểu dáng SVG mà Node.js ImageResponse xử lý.

Trong các đợt kiểm tra của The Hacker News vào ngày 23 tháng 9, npm audit chưa gắn cờ cảnh báo cho Next.js 16.3.5 (phiên bản bị ảnh hưởng). Khuyến cáo này cũng chưa được liệt kê trong GitHub Advisory Database và chưa có hồ sơ CVE chính thức cho CVE-2026-94545 được công bố.

Người dùng nên kiểm tra trực tiếp phiên bản Next.js đang sử dụng. Satori được đóng gói bên trong gói Next.js, vì vậy lockfile sẽ không liệt kê nó như một phụ thuộc riêng biệt của Next.js.

Tình trạng bảo vệ trên nền tảng Vercel

Khuyến cáo và thông báo của Vercel không nêu rõ liệu các ứng dụng được lưu trữ (host) trên Vercel có được bảo vệ tự động hay không. Đối với hai lỗ hổng Next.js nghiêm trọng được vá vào tháng 8, công ty cho biết các ứng dụng được lưu trữ đã được bảo vệ và không cần nâng cấp.

Ngoài ra, cũng không có cách nào để kiểm tra xem một route bị ảnh hưởng có từng bị lạm dụng trước khi có bản vá hay không. Các phiên bản bị ảnh hưởng đã tồn tại kể từ khi Next.js 16.2 được phát hành vào ngày 18 tháng 3.

Bản thân lỗi nằm trong thư viện Satori. Khuyến cáo riêng của Satori được công bố cùng ngày cho biết một số giá trị nhất định đã đi vào đầu ra SVG mà không được escape đúng cách. Một giá trị được tạo thủ công có thể bị đọc nhầm thành mã SVG thay vì văn bản thuần túy.

Vercel cho biết trong Next.js, các giá trị như vậy có thể kích hoạt lỗ hổng trong các thư viện khác mà Next.js phụ thuộc vào, dẫn đến thực thi mã. Tuy nhiên, tên các thư viện đó hiện chưa được công bố.

Khuyến cáo của Satori xếp hạng cùng mã CVE này ở mức trung bình (moderate) với số điểm 5.3 và cho biết tác động tùy thuộc vào cách sử dụng đầu ra SVG. Các nhà phát triển sử dụng trực tiếp Satori nên cập nhật lên phiên bản 0.33.5 để được khắc phục.