Một tệp mô hình chỉ 65 byte có thể khiến công cụ suy luận Llama CPP phổ biến bị dừng đột ngột. Payload siêu nhỏ này kích hoạt lỗi chia cho 0 bên trong bộ phân tích cú pháp, gây ra lỗi crash SIGFPE.
Tại sao lỗi crash này lại quan trọng
Chuyện gì đã xảy ra
Bộ phân tích cú pháp đọc siêu dữ liệu (metadata) của mô hình vào các cấu trúc C++ và kiểm tra xem mỗi chiều của tensor có "không âm" hay không. Số 0 thỏa mãn điều kiện đó, vì vậy bước kiểm tra được thông qua. Dòng mã tiếp theo sau đó sử dụng chiều này làm số chia trong một phép tính vốn giả định rằng giá trị đó là số dương. Khi chiều bằng 0, phép chia sẽ ném ra một ngoại lệ số thực dấu phẩy động (SIGFPE) và làm kết thúc chương trình.
Việc xác thực chỉ mới bao quát được một nửa điều kiện bất biến (invariant) cần thiết: nó chặn các giá trị âm nhưng lại bỏ qua số 0, điều vốn cũng không an toàn cho các phép toán số học tiếp theo.
Các nhà phát triển nên làm gì
- Hãy coi các tệp mô hình như các tệp nhị phân. Việc tải một mô hình sẽ phân tích các byte thô thành các cấu trúc bộ nhớ, một ranh giới kinh điển nơi dữ liệu không được kiểm tra có thể làm sập tiến trình hoặc gây ra những hậu quả tồi tệ hơn.
- Tránh các bước kiểm tra không đầy đủ. Một điều kiện chỉ bao quát một phần của điều kiện bất biến bắt buộc sẽ tạo ra cảm giác an toàn giả tạo. Ở đây, "không âm" là chưa đủ; mã nguồn cần điều kiện "dương".
- Nghi ngờ các giả định sau mỗi lần kiểm tra. Khi một bài kiểm tra giới hạn xuất hiện, hãy xác minh rằng mã tiếp theo không dựa trên một thuộc tính nghiêm ngặt hơn.
- Sử dụng các công cụ fuzzing. Tác giả đã phát hiện ra lỗi này bằng cách chạy libFuzzer với AddressSanitizer, công cụ giúp biến đổi dữ liệu đầu vào và gắn cờ các hoạt động bất hợp pháp như chia cho 0.
Cách áp dụng bản sửa lỗi
Bản sửa lỗi thêm một cơ chế bảo vệ (guard) để bỏ qua phép tính tràn số khi một chiều bằng 0. Câu lệnh điều kiện nhỏ này vẫn duy trì hỗ trợ cho các tensor có kích thước bằng 0 hợp lệ — vốn được sử dụng trong một số biến thể mô hình cho các tính năng tùy chọn — đồng thời loại bỏ đường dẫn gây crash.
Bài học rút ra: Chỉ một tệp 65 byte duy nhất có thể làm ngừng hoạt động của một công cụ suy luận đang được triển khai rộng rãi; việc xác thực kỹ lưỡng và fuzzing có hệ thống sẽ giúp các bộ tải mô hình (model loaders) luôn an toàn.
Nguồn: https://dev.to/harrisonsec/your-model-file-is-untrusted-input-1eap
