Lỗ hổng Redis Lua: Nguy hiểm RCE và Bản vá khẩn cấp

Lỗ hổng Redis Lua: Nguy hiểm RCE và Bản vá khẩn cấp

Một bản khai thác proof-of-concept (PoC) mới đã được công bố cho ba lỗ hổng CVE nghiêm trọng trong công cụ scripting Lua được sử dụng bởi Redis 7.4.5. Các lỗ hổng Redis Lua này cho phép kẻ tấn công thực thi mã từ xa và leo thang đặc quyền, gây ra mối đe dọa trực tiếp cho các hệ thống cho phép script không đáng tin cậy thông qua lệnh EVAL.

Các nhà nghiên cứu bảo mật đã phát hiện ra các lỗ hổng này, bao gồm lỗi trong bộ phân tích cú pháp Lua, hàm unpack() và cơ chế bảo vệ metatable kiểu cơ bản. Việc khắc phục ngay lập tức là cần thiết để bảo vệ hệ thống.

Nội dung
Chi tiết các Lỗ hổng Redis Lua nghiêm trọng

CVE-2025-49844: Lỗi Use-After-Free trong Lua Parser
CVE-2025-46817: Lỗi Integer Overflow trong Hàm unpack()
CVE-2025-46818: Chiếm Quyền Điều Khiển qua Metatable
Khai thác (PoC) và Biện pháp Giảm thiểu Rủi ro cho Lỗ hổng Redis Lua

Mã Khai thác Proof-of-Concept
Khuyến nghị và Bản vá bảo mật

Chi tiết các Lỗ hổng Redis Lua nghiêm trọng

Trong quá trình kiểm tra định kỳ Redis 7.4.5, ba lỗ hổng nghiêm trọng đã được tìm thấy trong công cụ Lua. Những lỗ hổng này có thể dẫn đến việc kiểm soát hệ thống hoàn toàn.

CVE-2025-49844: Lỗi Use-After-Free trong Lua Parser

Lỗ hổng đầu tiên, CVE-2025-49844, liên quan đến lỗi use-after-free (UAF) trong bộ phân tích cú pháp Lua. Khi phân tích các script, công cụ cấp phát một đối tượng TString mà không bảo vệ nó trên stack.

Một chu trình thu gom rác (garbage collection) có thể giải phóng đối tượng này quá sớm. Điều này cho phép kẻ tấn công ghi đè bộ nhớ và thực thi mã tùy ý.

Vấn đề UAF xảy ra tại dòng 387 trong file deps/lua/src/lparser.c. Mã phân tích cú pháp thô gọi luaS_new(L, name) nhưng không đẩy kết quả lên Lua stack, khiến nó không được bảo vệ. Thông tin chi tiết về lỗ hổng này có thể được tìm thấy tại NVD NIST.

Ngược lại, phiên bản đã được vá sử dụng setsvalue2s(L, L->top, tname)incr_top(L) trước khi phân tích để bảo vệ chuỗi mới được tạo.

CVE-2025-46817: Lỗi Integer Overflow trong Hàm unpack()

Lỗ hổng thứ hai, CVE-2025-46817, xuất phát từ lỗi tràn số nguyên (integer overflow) trong hàm unpack(). Bằng cách cung cấp các giá trị chỉ mục cực lớn, kẻ tấn công có thể làm hỏng Lua stack và chiếm quyền kiểm soát luồng thực thi chương trình.

Lỗi tràn số nguyên này trong deps/lua/src/lbaselib.c tính toán sai số lượng phần tử là n = e – i + 1. Phép tính này bị tràn khi giá trị e rất lớn, dẫn đến việc ghi dữ liệu ngoài giới hạn stack.

CVE-2025-46818: Chiếm Quyền Điều Khiển qua Metatable

Lỗ hổng thứ ba, CVE-2025-46818, liên quan đến việc leo thang đặc quyền thông qua sửa đổi metatable. Các metatable kiểu lõi cho chuỗi, số và các kiểu nguyên thủy khác đều có thể thay đổi.

Điều này cho phép kẻ tấn công thay đổi chúng để chèn mã độc hại. Mã này sau đó sẽ chạy trong ngữ cảnh của người dùng khác, dẫn đến việc chiếm quyền điều khiển không mong muốn.

Đối với vấn đề metatable, các tệp src/script_lua.csrc/eval.c thiếu các kiểm tra để ngăn chặn việc ghi vào metatable kiểu cơ bản. Việc thiếu kiểm tra này cho phép chèn mã trái phép.

Khai thác (PoC) và Biện pháp Giảm thiểu Rủi ro cho Lỗ hổng Redis Lua

Một PoC Python hoàn chỉnh đã được phát hành để kiểm tra cả ba lỗ hổng trên một máy chủ Redis đang hoạt động. Các chi tiết kỹ thuật đã được công bố bởi các nhà nghiên cứu tại RedRays.io.

Mã Khai thác Proof-of-Concept

Ví dụ, thử nghiệm use-after-free lấp đầy bộ nhớ Lua để buộc quá trình thu gom rác trong khi phân tích cú pháp. Điều này kích hoạt điều kiện tranh chấp dẫn đến lỗi UAF.

Kiểm tra tràn unpack() sử dụng các script Lua đặc biệt để phát hiện lỗi. Đoạn mã sau minh họa cách thức khai thác:

return {unpack({1,2,3}, -2, 2147483647)}

Việc bảo vệ metatable được xác nhận bằng các nỗ lực sửa đổi metatable của giá trị nil. Nếu sửa đổi thành công, lỗ hổng vẫn tồn tại.

Khuyến nghị và Bản vá bảo mật

Các tổ chức nên nâng cấp lên Redis 7.4.6 hoặc phiên bản mới hơn ngay lập tức. Các bản vá trong các phiên bản này bao gồm những cải tiến quan trọng:

  • Bảo vệ stack trong bộ phân tích cú pháp để ngăn chặn lỗi use-after-free.
  • Kiểm tra giới hạn (bounds checks) trong hàm unpack() để khắc phục lỗi tràn số nguyên.
  • Thực thi chế độ chỉ đọc (readonly enforcement) trên các metatable cơ bản, ngăn chặn việc sửa đổi trái phép.

Việc áp dụng các bản cập nhật này sẽ đóng các bề mặt tấn công và khôi phục sự cô lập script. Ngoài ra, việc giám sát liên tục hoạt động EVAL bất thường và kiểm soát truy cập nghiêm ngặt cũng được khuyến nghị để giảm thiểu rủi ro bảo mật.