Lỗ Hổng CVE Nghiêm Trọng Cho Phép Remote Code Execution

Lỗ Hổng CVE Nghiêm Trọng Cho Phép Remote Code Execution

Một lỗ hổng CVE nghiêm trọng trong thư viện NVIDIA Merlin Transformers4Rec cho phép kẻ tấn công thực hiện remote code execution với quyền root.

Lỗ hổng này, được nhóm Zero Day Initiative (ZDI) của Trend Micro phát hiện, bắt nguồn từ việc deserialization không an toàn trong chức năng tải checkpoint của mô hình.

Nội dung
Phân Tích Kỹ Thuật Lỗ Hổng CVE-2025-23298

Cơ Chế Khai Thác
Ảnh Hưởng và Hậu Quả
Biện Pháp Vá Lỗi và Phòng Ngừa Lỗ Hổng Pickle Deserialization

Khuyến Nghị Cho Nhà Phát Triển
Khuyến Nghị Cho Tổ Chức

Phân Tích Kỹ Thuật Lỗ Hổng CVE-2025-23298

Được theo dõi dưới mã CVE-2025-23298, lỗ hổng này nêu bật những thách thức bảo mật dai dẳng trong các framework học máy (ML) dựa vào cơ chế serialization pickle của Python.

Trong quá trình kiểm tra các framework ML/AI về rủi ro bảo mật chuỗi cung ứng, các nhà nghiên cứu ZDI đã tập trung vào cách các mô hình được lưu trữ và tải.

Cụ thể, trong hàm load_model_trainer_states_from_checkpoint của Transformers4Rec, hàm torch.load() của PyTorch được sử dụng mà không có cơ chế sandbox hoặc hạn chế lớp.

torch.load() sử dụng giao thức pickle của Python, nó có thể thực thi mã tùy ý trong quá trình deserialization.

ZDI đã xác nhận rằng việc tải một tệp checkpoint được tạo sẵn có thể kích hoạt các lệnh cấp quyền root ngay lập tức khi khôi phục trạng thái mô hình. Chi tiết kỹ thuật có tại Zero Day Initiative Blog.

Cơ Chế Khai Thác

Để minh họa rủi ro bảo mật, nhóm nghiên cứu đã xây dựng một đối tượng checkpoint độc hại. Phương thức reduce của đối tượng này gọi các lệnh hệ thống.

Khi torch.save() ghi đối tượng độc hại vào một checkpoint và torch.load() đọc nó sau đó, payload của kẻ tấn công sẽ chạy trước khi bất kỳ trọng số mô hình nào được xử lý.

Trong môi trường sản xuất, nơi các dịch vụ ML thường chạy với các đặc quyền nâng cao, khai thác thành công lỗ hổng CVE-2025-23298 dẫn đến việc hệ thống bị xâm nhập hoàn toàn.

Ảnh Hưởng và Hậu Quả

Khai thác lỗ hổng CVE này có thể dẫn đến nhiều hậu quả nghiêm trọng, bao gồm:

  • Đánh cắp dữ liệu nhạy cảm từ hệ thống bị xâm nhập.
  • Cài đặt backdoor để duy trì quyền truy cập trái phép.
  • Mở rộng tấn công sang các hệ thống khác trong mạng nội bộ.
  • Chiếm quyền điều khiển hoàn toàn máy chủ bị ảnh hưởng.

Đây là một lỗ hổng CVE nghiêm trọng, đòi hỏi các tổ chức phải đặc biệt chú ý và thực hiện các biện pháp phòng ngừa.

Biện Pháp Vá Lỗi và Phòng Ngừa Lỗ Hổng Pickle Deserialization

NVIDIA đã vá lỗ hổng CVE-2025-23298 trong Transformers4Rec với commit b7eaea5 (PR #802).

Bản vá thay thế các lời gọi pickle trực tiếp bằng một trình tải tùy chỉnh, giới hạn deserialization chỉ cho các lớp được phê duyệt.

Việc triển khai mới sử dụng một hàm load() an toàn trong serialization.py để xác thực các loại đối tượng trước khi khôi phục.

# Ví dụ (mô phỏng) về cách trình tải an toàn có thể hoạt động
# Mã thực tế nằm trong commit b7eaea5 của Transformers4Rec
import torch
import io

class SafePickleLoader(torch.serialization.SourceWrapper):
    def __init__(self, data_buffer):
        super().__init__(data_buffer)
        self._allowed_classes = {
            'torch.nn.modules.linear': ['Linear'],
            'torch.tensor': ['Tensor'],
            # ... Thêm các lớp được phép khác dựa trên nhu cầu của ứng dụng
        }

    def find_class(self, module, name):
        if module in self._allowed_classes and name in self._allowed_classes[module]:
            return super().find_class(module, name)
        raise torch.serialization.UnsafeStorageException(
            f"Attempted to deserialize unauthorized class: {module}.{name}"
        )

def secure_torch_load(f):
    # Đọc dữ liệu từ file hoặc buffer
    data_buffer = io.BytesIO(f.read())
    # Sử dụng SafePickleLoader để giới hạn các lớp được phép
    return torch.load(data_buffer, pickle_module=SafePickleLoader(data_buffer))

# Cách sử dụng (mô phỏng)
# with open('model.pth', 'rb') as f:
#     model_state = secure_torch_load(f)

Khuyến Nghị Cho Nhà Phát Triển

Để ngăn chặn các vấn đề tương tự liên quan đến lỗ hổng pickle deserialization, các nhà phát triển nên thực hiện các biện pháp sau:

  • Tránh xử lý dữ liệu pickle không đáng tin cậy từ các nguồn không xác định.
  • Sử dụng tùy chọn weights_only=True của PyTorch khi chỉ cần tải trọng số của mô hình.
  • Áp dụng các định dạng an toàn hơn như safetensors hoặc ONNX cho việc lưu trữ mô hình.
  • Kiểm tra và xác thực đầu vào nghiêm ngặt trước khi deserialization.

Khuyến Nghị Cho Tổ Chức

Các tổ chức vận hành môi trường ML/AI cần thực hiện các biện pháp kiểm soát chặt chẽ để giảm thiểu rủi ro bảo mật:

  • Thực thi kiểm tra nguồn gốc mô hình (model provenance checks) để xác minh tính hợp lệ.
  • Ký điện tử (cryptographically sign) các checkpoint để đảm bảo tính toàn vẹn và xác thực.
  • Thực hiện sandbox cho quá trình tải mô hình (model loading) để hạn chế quyền truy cập và thực thi.
  • Cập nhật các bản vá bảo mật ngay khi chúng được phát hành để khắc phục các lỗ hổng CVE đã biết.

Lỗ hổng CVE-2025-23298 nhấn mạnh sự cần thiết cấp bách của các tiêu chuẩn serialization an toàn trong hệ sinh thái ML/AI.

Nó cũng chứng minh rằng các quy trình làm việc dựa trên pickle vẫn là một vector tấn công quan trọng, bất chấp những cảnh báo lâu dài từ cộng đồng về an toàn thông tin.