Thư viện buffa, một cài đặt protobuf viết bằng Rust của Anthropic, đang đối mặt với một lỗ hổng zero-day thuộc loại denial-of-service (DoS). Lỗ hổng này phát sinh do việc cấp phát bộ nhớ heap không giới hạn dựa trên dữ liệu đầu vào do kẻ tấn công kiểm soát. Đây là một ví dụ điển hình về mối đe dọa mạng tiềm ẩn trong các thư viện quan trọng.
Chi tiết về Lỗ hổng
Lỗ hổng này, được theo dõi với định danh CVE-2026-55407 và GHSA-f9qc-qg88-7pq5, ảnh hưởng đến các phiên bản buffa và connectrpc trước phiên bản 0.8.0. Theo hệ thống chấm điểm CVSS 4.0, nó được đánh giá ở mức 6.3 (Trung bình). Tuy nhiên, tác động thực tế có thể leo thang lên mức Cao hoặc Nghiêm trọng, tùy thuộc vào kiến trúc triển khai hệ thống.
Phát hiện Lỗ hổng
Lỗ hổng ban đầu được phát hiện khi công cụ AI SAST của Endor Labs phân tích mã nguồn của buffa và đánh dấu một luồng dữ liệu đáng ngờ trong bộ giải mã trường chưa biết (unknown-field decoder).
Nguyên nhân Gốc rễ
Trong hàm decode_unknown_field, một giá trị độ dài (length) được phân tích cú pháp trực tiếp từ dữ liệu protobuf không đáng tin cậy. Giá trị này sau đó được chuyển đổi thành kiểu usize và sử dụng để cấp phát một Vec mà không có giới hạn trên rõ ràng, ngoài các giới hạn cơ bản của kiểu dữ liệu.
Một cơ chế bảo vệ đảm bảo rằng bộ đệm chứa ít nhất len byte, ngăn chặn việc đọc ngoài giới hạn bộ đệm. Tuy nhiên, cơ chế này không hạn chế bản thân việc cấp phát bộ nhớ. Điều này tạo điều kiện cho kẻ tấn công ép buộc cấp phát bộ nhớ heap lớn bằng cách cung cấp các trường được giới hạn độ dài (length-delimited fields) có kích thước quá lớn.
Đánh giá ban đầu cho thấy sự khuếch đại khoảng 2 lần giữa kích thước đầu vào và việc sử dụng bộ nhớ heap. Mặc dù đáng kể, điều này thường có thể quản lý được dưới các giới hạn đầu vào nghiêm ngặt.
Vector Khai thác Nguy hiểm
Tuy nhiên, khi đi sâu hơn vào nhánh xử lý WireType::StartGroup trong cùng một hàm, một vector khuếch đại nguy hiểm hơn nhiều đã được phát hiện. Trong nhánh này, bộ giải mã lặp qua các trường chưa biết lồng nhau cho đến khi gặp thẻ EndGroup phù hợp. Mỗi trường được giải mã sẽ được đẩy vào một cấu trúc UnknownFields dựa trên Vec.
Vì trường lồng nhau có chi phí thấp nhất trên dây (wire) có thể được mã hóa chỉ với hai byte, nhưng mỗi trường lại dẫn đến việc cấp phát bộ nhớ heap khoảng 40 byte cộng với chi phí mở rộng. Một nhóm được chế tạo cẩn thận có thể biến một đầu vào tương đối nhỏ thành một cấu trúc bộ nhớ khổng lồ.
Minh họa Tác động
Bằng chứng khái niệm (proof-of-concept) của Endor Labs đã chứng minh rằng một gói tin protobuf dung lượng 64 MiB, chứa hàng triệu trường varint tối thiểu trong một nhóm chưa biết duy nhất, có thể đẩy mức sử dụng bộ nhớ heap lên khoảng 1.4 GiB – gấp khoảng 22 lần kích thước đầu vào.
Khi thực thi bên trong một container Docker với giới hạn bộ nhớ 256 MiB, việc giải mã một thông điệp như vậy đã khiến tiến trình bị chấm dứt với mã thoát 137, xác nhận tình trạng DoS do hết bộ nhớ (out-of-memory).
Phạm vi Ảnh hưởng
Quan trọng là, con đường mã dễ bị tổn thương có thể đạt được thông qua các API giải mã mặc định của buffa, bao gồm Message::decode và decode_from_slice. Điều này có nghĩa là bất kỳ dịch vụ nào giải mã các thông điệp protobuf không đáng tin cậy với tùy chọn preserve_unknown_fields được bật (mặc định) đều có khả năng bị ảnh hưởng.
Biện pháp Khắc phục và Giảm thiểu
Bản vá Lỗi Chính thức
Anthropic đã phát hành các bản vá lỗi trong buffa và connectrpc phiên bản 0.8.0. Bản vá này triển khai một giới hạn cấu hình trên mỗi thông điệp cho các trường chưa biết. Giới hạn này giới hạn chi phí cấp phát tối đa xuống khoảng vài chục megabyte, ngay cả khi đối mặt với đầu vào độc hại. Việc cập nhật bản vá là biện pháp quan trọng nhất để bảo vệ hệ thống.
Các Phương án Giảm thiểu Thay thế
Đối với các môi trường không thể nâng cấp ngay lập tức, một biện pháp giảm thiểu thứ cấp là tạo lại mã với tùy chọn preserve_unknown_fields=false. Tùy chọn này sẽ tắt việc lưu giữ các trường chưa biết, loại bỏ nguồn gốc chính của lỗ hổng khỏi luồng dữ liệu.
Bài học Kinh nghiệm
Trường hợp này nhấn mạnh rằng việc chỉ dựa vào giới hạn kích thước đầu vào là không đủ. Con đường khuếch đại nhóm (group amplification path) có thể biến một thông điệp có kích thước có vẻ an toàn thành một yêu cầu cấp phát có thể gây tử vong cho tiến trình. Đây là một bài học quan trọng về an toàn thông tin.
Khám phá này cũng đáng chú ý vì cách một công cụ AI SAST đã phát hiện ra một lỗ hổng DoS phức tạp ở cấp độ logic trong một thư viện Rust an toàn về bộ nhớ. Công cụ này đã làm được điều đó bằng cách theo dõi dữ liệu không đáng tin cậy từ nguồn đến điểm đích cấp phát bộ nhớ heap, thay vì chỉ dựa vào các kiểm tra dựa trên mẫu.
Việc công bố phối hợp giữa Endor Labs và Anthropic nhấn mạnh sự cần thiết của phân tích nhận biết luồng dữ liệu (data-flow-aware analysis) ngay cả trong các ngôn ngữ được coi là “an toàn”. Điều này đặc biệt quan trọng đối với các thành phần có độ tin cậy cao được sử dụng trong các hệ thống AI tiên tiến.
Để tìm hiểu thêm về các lỗ hổng và phân tích bảo mật, bạn có thể tham khảo National Vulnerability Database (NVD).










